diff --git a/gg.c b/gg.c index dbcb2a2..9a5ea19 100644 --- a/gg.c +++ b/gg.c @@ -52,7 +52,7 @@ ISR(TIMER1_OVF1_vect) /* TODO: a-law decoding */ /* TODO: 11bit PWM emulation */ - OCR1A = buffer[pos];/* play next sample */ + OCR1A = buffer[pos];/* play sample */ } diff --git a/mmc.c b/mmc.c old mode 100755 new mode 100644 index 9dd2e8f..d31b202 --- a/mmc.c +++ b/mmc.c @@ -1,324 +1,324 @@ -/*####################################################################################### -Connect AVR to MMC/SD - -Copyright (C) 2004 Ulrich Radig - -Bei Fragen und Verbesserungen wendet euch per EMail an - -mail@ulrichradig.de - -oder im Forum meiner Web Page : www.ulrichradig.de - -Dieses Programm ist freie Software. Sie können es unter den Bedingungen der -GNU General Public License, wie von der Free Software Foundation veröffentlicht, -weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder -(nach Ihrer Option) jeder späteren Version. - -Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, -daß es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, -sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT -FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License. - -Sie sollten eine Kopie der GNU General Public License zusammen mit diesem -Programm erhalten haben. -Falls nicht, schreiben Sie an die Free Software Foundation, -Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. -#######################################################################################*/ - -#include "mmc.h" - -//############################################################################ -//Routine zur Initialisierung der MMC/SD-Karte (SPI-MODE) -unsigned char mmc_init () -//############################################################################ -{ - unsigned int Timeout = 0; - - //Konfiguration des Ports an der die MMC/SD-Karte angeschlossen wurde - MMC_Direction_REG &=~(1< 200) - { - MMC_Disable(); - return(1); //Abbruch bei Commando1 (Return Code1) - } - } - //Sendet Commando CMD1 an MMC/SD-Karte - Timeout = 0; - CMD[0] = 0x41;//Commando 1 - CMD[5] = 0xFF; - while( mmc_write_command (CMD) !=0) - { - if (Timeout++ > 400) - { - MMC_Disable(); - return(2); //Abbruch bei Commando2 (Return Code2) - } - } - #if SPI_Mode - //SPI Bus auf max Geschwindigkeit - SPCR &= ~((1< 500) - { - break; //Abbruch da die MMC/SD-Karte nicht Antwortet - } - } - return(tmp); -} - -//############################################################################ -//Routine zum Empfangen eines Bytes von der MMC-Karte -unsigned char mmc_read_byte (void) -//############################################################################ -{ - unsigned char Byte = 0; -#if SPI_Mode //Routine für Hardware SPI - SPDR = 0xff; - while(!(SPSR & (1<0; a--) //das Byte wird Bitweise nacheinander Empangen MSB First - { - MMC_Write &=~(1< 0) //Lesen des Pegels von MMC_DI - { - Byte |= (1<<(a-1)); - } - else - { - Byte &=~(1<<(a-1)); - } - MMC_Write |=(1<0; a--) //das Byte wird Bitweise nacheinander Gesendet MSB First - { - if (bit_is_set(Byte,(a-1))>0) //Ist Bit a in Byte gesetzt - { - MMC_Write |= (1<>24 ); - cmd[2] = ((addr & 0x00FF0000) >>16 ); - cmd[3] = ((addr & 0x0000FF00) >>8 ); - - //Sendet Commando cmd24 an MMC/SD-Karte (Write 1 Block/512 Bytes) - tmp = mmc_write_command (cmd); - if (tmp != 0) - { - return(tmp); - } - - //Wartet einen Moment und sendet einen Clock an die MMC/SD-Karte - for (unsigned char a=0;a<100;a++) - { - mmc_read_byte(); - } - - //Sendet Start Byte an MMC/SD-Karte - mmc_write_byte(0xFE); - - //Schreiben des Bolcks (512Bytes) auf MMC/SD-Karte - for (unsigned int a=0;a<512;a++) - { - mmc_write_byte(*Buffer++); - } - - //CRC-Byte schreiben - mmc_write_byte(0xFF); //Schreibt Dummy CRC - mmc_write_byte(0xFF); //CRC Code wird nicht benutzt - - //Fehler beim schreiben? (Data Response XXX00101 = OK) - if((mmc_read_byte()&0x1F) != 0x05) return(1); - - //Wartet auf MMC/SD-Karte Bussy - while (mmc_read_byte() != 0xff){}; - - //set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv) - MMC_Disable(); - -return(0); -} - -//############################################################################ -//Routine zum lesen des CID Registers von der MMC/SD-Karte (16Bytes) -void mmc_read_block(unsigned char *cmd,unsigned char *Buffer,unsigned int Bytes) -//############################################################################ -{ - //Sendet Commando cmd an MMC/SD-Karte - if (mmc_write_command (cmd) != 0) - { - return; - } - - //Wartet auf Start Byte von der MMC/SD-Karte (FEh/Start Byte) - - while (mmc_read_byte() != 0xfe){}; - - //Lesen des Bolcks (normal 512Bytes) von MMC/SD-Karte - for (unsigned int a=0;a>24 ); - cmd[2] = ((addr & 0x00FF0000) >>16 ); - cmd[3] = ((addr & 0x0000FF00) >>8 ); - - mmc_read_block(cmd,Buffer,512); - - return(0); -} - -//############################################################################ -//Routine zum lesen des CID Registers von der MMC/SD-Karte (16Bytes) -unsigned char mmc_read_cid (unsigned char *Buffer) -//############################################################################ -{ - //Commando zum lesen des CID Registers - unsigned char cmd[] = {0x4A,0x00,0x00,0x00,0x00,0xFF}; - - mmc_read_block(cmd,Buffer,16); - - return(0); -} - -//############################################################################ -//Routine zum lesen des CSD Registers von der MMC/SD-Karte (16Bytes) -unsigned char mmc_read_csd (unsigned char *Buffer) -//############################################################################ -{ - //Commando zum lesen des CSD Registers - unsigned char cmd[] = {0x49,0x00,0x00,0x00,0x00,0xFF}; - - mmc_read_block(cmd,Buffer,16); - - return(0); -} +/*####################################################################################### +Connect AVR to MMC/SD + +Copyright (C) 2004 Ulrich Radig + +Bei Fragen und Verbesserungen wendet euch per EMail an + +mail@ulrichradig.de + +oder im Forum meiner Web Page : www.ulrichradig.de + +Dieses Programm ist freie Software. Sie können es unter den Bedingungen der +GNU General Public License, wie von der Free Software Foundation veröffentlicht, +weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder +(nach Ihrer Option) jeder späteren Version. + +Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, +dass es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, +sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT +FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License. + +Sie sollten eine Kopie der GNU General Public License zusammen mit diesem +Programm erhalten haben. +Falls nicht, schreiben Sie an die Free Software Foundation, +Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. +#######################################################################################*/ + +#include "mmc.h" + +//############################################################################ +//Routine zur Initialisierung der MMC/SD-Karte (SPI-MODE) +unsigned char mmc_init () +//############################################################################ +{ + unsigned int Timeout = 0; + + //Konfiguration des Ports an der die MMC/SD-Karte angeschlossen wurde + MMC_Direction_REG &=~(1< 200) + { + MMC_Disable(); + return(1); //Abbruch bei Commando1 (Return Code1) + } + } + //Sendet Commando CMD1 an MMC/SD-Karte + Timeout = 0; + CMD[0] = 0x41;//Commando 1 + CMD[5] = 0xFF; + while( mmc_write_command (CMD) !=0) + { + if (Timeout++ > 400) + { + MMC_Disable(); + return(2); //Abbruch bei Commando2 (Return Code2) + } + } + #if SPI_Mode + //SPI Bus auf max Geschwindigkeit + SPCR &= ~((1< 500) + { + break; //Abbruch da die MMC/SD-Karte nicht Antwortet + } + } + return(tmp); +} + +//############################################################################ +//Routine zum Empfangen eines Bytes von der MMC-Karte +unsigned char mmc_read_byte (void) +//############################################################################ +{ + unsigned char Byte = 0; +#if SPI_Mode //Routine für Hardware SPI + SPDR = 0xff; + while(!(SPSR & (1<0; a--) //das Byte wird Bitweise nacheinander Empangen MSB First + { + MMC_Write &=~(1< 0) //Lesen des Pegels von MMC_DI + { + Byte |= (1<<(a-1)); + } + else + { + Byte &=~(1<<(a-1)); + } + MMC_Write |=(1<0; a--) //das Byte wird Bitweise nacheinander Gesendet MSB First + { + if (bit_is_set(Byte,(a-1))>0) //Ist Bit a in Byte gesetzt + { + MMC_Write |= (1<>24 ); + cmd[2] = ((addr & 0x00FF0000) >>16 ); + cmd[3] = ((addr & 0x0000FF00) >>8 ); + + //Sendet Commando cmd24 an MMC/SD-Karte (Write 1 Block/512 Bytes) + tmp = mmc_write_command (cmd); + if (tmp != 0) + { + return(tmp); + } + + //Wartet einen Moment und sendet einen Clock an die MMC/SD-Karte + for (unsigned char a=0;a<100;a++) + { + mmc_read_byte(); + } + + //Sendet Start Byte an MMC/SD-Karte + mmc_write_byte(0xFE); + + //Schreiben des Bolcks (512Bytes) auf MMC/SD-Karte + for (unsigned int a=0;a<512;a++) + { + mmc_write_byte(*Buffer++); + } + + //CRC-Byte schreiben + mmc_write_byte(0xFF); //Schreibt Dummy CRC + mmc_write_byte(0xFF); //CRC Code wird nicht benutzt + + //Fehler beim schreiben? (Data Response XXX00101 = OK) + if((mmc_read_byte()&0x1F) != 0x05) return(1); + + //Wartet auf MMC/SD-Karte Bussy + while (mmc_read_byte() != 0xff){}; + + //set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv) + MMC_Disable(); + +return(0); +} + +//############################################################################ +//Routine zum lesen des CID Registers von der MMC/SD-Karte (16Bytes) +void mmc_read_block(unsigned char *cmd,unsigned char *Buffer,unsigned int Bytes) +//############################################################################ +{ + //Sendet Commando cmd an MMC/SD-Karte + if (mmc_write_command (cmd) != 0) + { + return; + } + + //Wartet auf Start Byte von der MMC/SD-Karte (FEh/Start Byte) + + while (mmc_read_byte() != 0xfe){}; + + //Lesen des Bolcks (normal 512Bytes) von MMC/SD-Karte + for (unsigned int a=0;a>24 ); + cmd[2] = ((addr & 0x00FF0000) >>16 ); + cmd[3] = ((addr & 0x0000FF00) >>8 ); + + mmc_read_block(cmd,Buffer,512); + + return(0); +} + +//############################################################################ +//Routine zum lesen des CID Registers von der MMC/SD-Karte (16Bytes) +unsigned char mmc_read_cid (unsigned char *Buffer) +//############################################################################ +{ + //Commando zum lesen des CID Registers + unsigned char cmd[] = {0x4A,0x00,0x00,0x00,0x00,0xFF}; + + mmc_read_block(cmd,Buffer,16); + + return(0); +} + +//############################################################################ +//Routine zum lesen des CSD Registers von der MMC/SD-Karte (16Bytes) +unsigned char mmc_read_csd (unsigned char *Buffer) +//############################################################################ +{ + //Commando zum lesen des CSD Registers + unsigned char cmd[] = {0x49,0x00,0x00,0x00,0x00,0xFF}; + + mmc_read_block(cmd,Buffer,16); + + return(0); +} diff --git a/mmc.h b/mmc.h old mode 100755 new mode 100644 index 0354b5b..11dd25a --- a/mmc.h +++ b/mmc.h @@ -1,81 +1,81 @@ -/*####################################################################################### -Connect ARM to MMC/SD - -Copyright (C) 2004 Ulrich Radig -#######################################################################################*/ - -#ifndef _MMC_H_ - #define _MMC_H_ - -#include - -//#define SPI_Mode 1 //1 = Hardware SPI | 0 = Software SPI -#define SPI_Mode 0 - -#define MMC_Write PORTB //Port an der die MMC/SD-Karte angeschlossen ist also des SPI -#define MMC_Read PINB -#define MMC_Direction_REG DDRB - -#if defined (__AVR_ATmega128__) - #define SPI_DI 3 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist - #define SPI_DO 2 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist - #define SPI_Clock 1 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) - #define MMC_Chip_Select 4 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist - #define SPI_SS 0 //Nicht Benutz muß aber definiert werden -#endif - -#if defined (__AVR_ATmega32__) - #define SPI_DI 6 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist - #define SPI_DO 5 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist - #define SPI_Clock 7 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) - #define MMC_Chip_Select 3 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist - #define SPI_SS 4 //Nicht Benutz muß aber definiert werden -#endif - -#if defined (__AVR_ATmega644__) - #define SPI_DI 6 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist - #define SPI_DO 5 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist - #define SPI_Clock 7 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) - #define MMC_Chip_Select 1 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist - #define SPI_SS 4 //Nicht Benutz muß aber definiert werden -#endif - -#if defined (__AVR_ATtiny26__) - #define SPI_DI 6 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist - #define SPI_DO 5 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist - #define SPI_Clock 7 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) - #define MMC_Chip_Select 1 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist - #define SPI_SS 4 //Nicht benutzt, muß aber definiert werden -#endif - - -//Prototypes -extern unsigned char mmc_read_byte(void); - -extern void mmc_write_byte(unsigned char); - -extern void mmc_read_block(unsigned char *,unsigned char *,unsigned in); - -extern unsigned char mmc_init(void); - -extern unsigned char mmc_read_sector (unsigned long,unsigned char *); - -extern unsigned char mmc_write_sector (unsigned long,unsigned char *); - -extern unsigned char mmc_write_command (unsigned char *); - -extern unsigned char mmc_read_csd (unsigned char *); - -extern unsigned char mmc_read_cid (unsigned char *); - -//set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv) -#define MMC_Disable() MMC_Write|= (1< + +//#define SPI_Mode 1 //1 = Hardware SPI | 0 = Software SPI +#define SPI_Mode 0 + +#define MMC_Write PORTB //Port an der die MMC/SD-Karte angeschlossen ist also des SPI +#define MMC_Read PINB +#define MMC_Direction_REG DDRB + +#if defined (__AVR_ATmega128__) + #define SPI_DI 3 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist + #define SPI_DO 2 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist + #define SPI_Clock 1 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) + #define MMC_Chip_Select 4 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist + #define SPI_SS 0 //Nicht Benutz muss aber definiert werden +#endif + +#if defined (__AVR_ATmega32__) + #define SPI_DI 6 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist + #define SPI_DO 5 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist + #define SPI_Clock 7 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) + #define MMC_Chip_Select 3 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist + #define SPI_SS 4 //Nicht Benutz muss aber definiert werden +#endif + +#if defined (__AVR_ATmega644__) + #define SPI_DI 6 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist + #define SPI_DO 5 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist + #define SPI_Clock 7 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) + #define MMC_Chip_Select 1 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist + #define SPI_SS 4 //Nicht Benutz muss aber definiert werden +#endif + +#if defined (__AVR_ATtiny26__) + #define SPI_DI 6 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist + #define SPI_DO 5 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist + #define SPI_Clock 7 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) + #define MMC_Chip_Select 1 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist + #define SPI_SS 4 //Nicht benutzt, muss aber definiert werden +#endif + + +//Prototypes +extern unsigned char mmc_read_byte(void); + +extern void mmc_write_byte(unsigned char); + +extern void mmc_read_block(unsigned char *,unsigned char *,unsigned in); + +extern unsigned char mmc_init(void); + +extern unsigned char mmc_read_sector (unsigned long,unsigned char *); + +extern unsigned char mmc_write_sector (unsigned long,unsigned char *); + +extern unsigned char mmc_write_command (unsigned char *); + +extern unsigned char mmc_read_csd (unsigned char *); + +extern unsigned char mmc_read_cid (unsigned char *); + +//set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv) +#define MMC_Disable() MMC_Write|= (1<