Gast
#398862
Hallo,
ich komme mit der Addressierung meiner SD Card nicht ganz klar.
Momentan verwende ich den Source Code von Ulrich Radig und beschreibe
ohne FAT Sektoren der SD Card. Den Code kann ich eigentlich
nachvollziehen. Im Argumentteil von CMD24 wird die Startaddresse des
512 Byte grossen Sektors angeben. Die Funktion zum schreiben eines
Sektors bekommt allerdings die Addresse/Nummer des Sektors als
Übergabewert.
Beispiel:
addr = 0x200; // Sektor 200
mmc_write_sector(addr,data_block);
Die geschriebenen Daten sollten doch dann auf Addresse
0x200*0x200=0x40000 liegen (0x200 = 512 Sektorgrößee)?
Leider ist die nicht der Fall! Aber warum? Die Daten liegen im Fall des
Beispiels auf Addresse 0x27200.
Hinweise zur späteren Erweiterung einer Funktion zum schreiben eines
files mit FAT16 Ünterstützung sind auch willkommen. Hat jemand einen
Link zu einer ausführlichen Beschreibung von FAT16 mit Bezug auf SD
card?
Danke
Hier noch der Source zu
U08 mmc_write_sector (U32 addr,U08 *Buffer)
//######################################################################
######
{
U08 tmp;
//Commando 24 zum schreiben eines Blocks auf die MMC/SD - Karte
U08 cmd[] = {0x58,0x00,0x00,0x00,0x00,0xFF};
/*Die Adressierung der MMC/SD-Karte wird in Bytes angegeben,
addr wird von Blocks zu Bytes umgerechnet danach werden
diese in das Commando eingefügt*/
addr = addr << 9; //addr = addr * 512
cmd[1] = ((addr & 0xFF000000) >>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 (U08 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 (U16 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
//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);
}