MMC/SD - Ansteuerung

Gast #319850
Lesenswert?
• ▲
▼
Hallo!

Bin gerade dabei, über die SPI eines ATmega32 eine SD-Karte
anzusteuern.  Dabei verwende ich teilweise den Programmcode von Ulrich
Radig. Die Routine für das Auslesen eines Sektors versteh ich jedoch
nicht ganz:

unsigned char mmc_read_sector (unsigned long addr,unsigned char*
Buffer)
{
  ...

  addr = addr << 9; //addr = addr * 512

  CMD[1] = ((addr & 0xFF000000) >>24 );
  CMD[2] = ((addr & 0x00FF0000) >>16 );
  CMD[3] = ((addr & 0x0000FF00) >>8 );

        ...
}

Warum wird denn die Adresse um 9 nach links geshiftet (bzw. mit 512
multipliziert) und was ist mit dem niederwertigstem, also dem 4.Byte
(CMD[4]) der Adresse? Wieso wird das nicht beachtet?
Wäre sehr dankbar für jede hilfreiche Antwort!

Gruß Danyo
Gast #319851
Lesenswert?
• ▲
▼
Hallo,

ich vermute mal, daß es sich um die Sektorgröße von 512 Byte handelt.
Weil CMD die einzelnen Bytes der Adresse enthält und CMD[4] das
niederwertigste Byte enthält und nicht mehr verschoben werden braucht.

Gruß

Manfred
Gast #319852
Lesenswert?
• ▲
▼
Hi,

das ist ganz einfach, im SPI-Mode kannst du jeweils Sektorweise die
Karte lesen oder beschreiben, d.h. deine Adresse vom Sektor ist immer
das Vielfache von 512(Sektor 0 beginnt bei 0, Sektor 1 an 512 usw.)
Und damit erklärt sich auch deine zweiten Frage.

Andy
Gast #319853
Lesenswert?
• ▲
▼
Achso & vielen Dank erstmal! Ich hab nämlich ohne die Zeile (addr = addr
<< 9;) immer nur den MBR jedoch nicht den 1.Partition Entry lesen
können, weil ich dachte, dass der Abstand an 0x1C6 in Bytes anstatt
Sektoren angegeben wird. Naja, wer lesen kann ist klar im Vorteil! ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren