/*####################################################################################### 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 #include #include "mmc.h" //############################################################################ //Routine zur Initialisierung der MMC/SD-Karte (SPI-MODE) unsigned char mmc_init (){ unsigned int Timeout = 0; unsigned char a; unsigned char b; //Konfiguration des Ports an der die MMC/SD-Karte angeschlossen wurde MMC_Direction_REG &=~(1< 200){ MMC_Disable(); printf("fail1\n"); 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(); printf("fail2\n"); return(2); //Abbruch bei Commando2 (Return Code2) } } //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; SPDR = 0xff; while(!(SPSR & (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 (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 (i=0;i<512;i++) { 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 unsigned int a; 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 (a=0;a>24 ); cmd[2] = ((addr & 0x00FF0000) >>16 ); cmd[3] = ((addr & 0x0000FF00) >>8 ); mmc_read_block(cmd,Buffer,512); return(0); }