Forum: Mikrocontroller und Digitale Elektronik Initialisierung SD-Karte


von ARMBeginner (Gast)


Lesenswert?

Hallo,

ich arbeite gerade an einer Initialisierungsroutine für SD-Karten.
Als Basis verwende ich das Dokument "Simplified Physical Layer Spec" der 
SD Card Association http://www.sdcard.org/about/memory_card/pls/.

Nach dem Power-UP sende ich zunächst ein Reset (CMD0), dann CMD8, um 
auch High capacity Karten initialisieren zu können. Meine Karte 
unterstützt dies aber noch nicht. Dann schicke ich ACMD41 (genauer 
gesagt CMD55 und dann CMD41), und die Karte antwortet mir mit dem OCR - 
Register. Der CRC stimmt nicht, ds scheint aber laut Spec wohl so 
richtig zu sein. Leider ist das Busy Bit (Bit 31) bei mir immer LOW, was 
laut Spec bedeutet, dass die Karte noch mit der Initialisierung 
beschäftigt ist. In Kapitel 4.2.3
steht nämlich:

> The busy bit in the OCR is used by the card to inform the host that
> initialization of ACMD41 is completed. Setting the busy bit to 0
> indicates that the card is still initializing. Setting the busy bit to 1 > 
indicates completion of initialization. The host repeatedly issues
> ACMD41 until the busy bit is set to 1.

Das Bit will aber partout nicht 1 werden, solange ich auch warte. Die 
sonstigen OCR- Werte scheinen plausibel.

Da ich hier nicht weiterkomme, habe ich mir eine ältere Spezifikation 
von Sandisk angeschaut :
http://www.sandisk.com/Assets/File/OEM/Manuals/ProdManiNANDAbr1.1.pdf.
Dort steht:

> Besides the operation voltage profile of the modules, the response to
> ACMD41 contains a busy flag, indicating that the module is still working > on 
its power-up procedure and is not ready for identification. This bit > informs the 
host that the module is not ready. The host has to wait (and > continue to poll 
the modules, each one on his turn) until this bit is
> cleared.

Hier steht also genau das Gegenteil von oben. Bit 0 heisst Karte ist 
bereit. Was ist denn nun richtig? Hat sich die Spezifikation geändert 
oder macht jeder Kartenhersteller was er will? Wie soll ich dann 
herausbekommen, was meine Karte nun tut?

Wenn irgendjemand im Forum bereits mit diesem Problem konfrontiert 
wurde, ich wäre ihm für Hinweise sehr dankbar.

MfG
Walter

von ARMBeginner (Gast)


Lesenswert?

Sorry, ein Problem mit der Zitierfunktion. Jetzt soll's besser lesbar 
sein

Hallo,

ich arbeite gerade an einer Initialisierungsroutine für SD-Karten.
Als Basis verwende ich das Dokument "Simplified Physical Layer Spec" der
SD Card Association http://www.sdcard.org/about/memory_card/pls/.

Nach dem Power-UP sende ich zunächst ein Reset (CMD0), dann CMD8, um
auch High capacity Karten initialisieren zu können. Meine Karte
unterstützt dies aber noch nicht. Dann schicke ich ACMD41 (genauer
gesagt CMD55 und dann CMD41), und die Karte antwortet mir mit dem OCR -
Register. Der CRC stimmt nicht, ds scheint aber laut Spec wohl so
richtig zu sein. Leider ist das Busy Bit (Bit 31) bei mir immer LOW, was
laut Spec bedeutet, dass die Karte noch mit der Initialisierung
beschäftigt ist. In Kapitel 4.2.3
steht nämlich:

> The busy bit in the OCR is used by the card to inform the host that
> initialization of ACMD41 is completed. Setting the busy bit to 0
> indicates that the card is still initializing. Setting the busy bit to 1 > 
indicates completion of initialization. The host repeatedly issues
> ACMD41 until the busy bit is set to 1.

Das Bit will aber partout nicht 1 werden, solange ich auch warte. Die
sonstigen OCR- Werte scheinen plausibel.

Da ich hier nicht weiterkomme, habe ich mir eine ältere Spezifikation
von Sandisk angeschaut :
http://www.sandisk.com/Assets/File/OEM/Manuals/ProdManiNANDAbr1.1.pdf
Dort steht:

> Besides the operation voltage profile of the modules, the response to
> ACMD41 contains a busy flag, indicating that the module is still working > on 
its power-up procedure and is not ready for identification. This bit > informs the 
host that the module is not ready. The host has to wait (and > continue to poll 
the modules, each one on his turn) until this bit is
> cleared.

Hier steht also genau das Gegenteil von oben. Bit 0 heisst Karte ist
bereit. Was ist denn nun richtig? Hat sich die Spezifikation geändert
oder macht jeder Kartenhersteller was er will? Wie soll ich dann
herausbekommen, was meine Karte nun tut?

Wenn irgendjemand im Forum bereits mit diesem Problem konfrontiert
wurde, ich wäre ihm für Hinweise sehr dankbar.

MfG
Walter

von ARMBeginner (Gast)


Lesenswert?

Klappt leider nicht mit dem Formatieren, in der Vorschau wirds richtig 
angezeigt, aber dann... Dher nochmal der Link zu sandisk in 2 Zeilen:

http://www.sandisk.com/Assets/File/OEM/
Manuals/ProdManiNANDAbr1.1.pdf

Gruss
Walter

von Obelix (Gast)


Lesenswert?

Such mal hier im Forum nach SDHC, da gibts ein richtiges Datenblatt.

von ARMBeginner (Gast)


Lesenswert?

Hallo,

ich habe es durch langes Probieren endlich herausgefunden:

BUSY ist tatsächlich aktiv LOW, d.h. die Karte ist beschäftigt, wenn 
dieses Bit 0 ist. Nach einiger Wartezeit wird es dann 1, d.h. inaktiv.
In der SD Spec steht's richtig, im Sandisk Datenblatt ist es etwas 
unglücklich formuliert:
Clear busy flag heisst in diesem Zusammenhang Übergang von 0 nach 1. 
Gemeint ist wohl, dass der Busy Status gelöscht wird.

Was die SDHC Karten betrifft, ist der wesentliche Unterschied die 
Adressierung, die hier blockweise (512 byte) anstelle von byteweise 
erfolgt. Bis jetzt konnte ich noch nicht damit experimentieren, da mir 
eine entsprechende Karte fehlt. Bin gerade dabei, die Unterscheidung 
MMC/SD Karte zu programmieren. Da gibt es feine, aber entscheidende 
Unterschiede: Z.B. erzeugt die SD Karte die RCA Adresse selbst, während 
man der MMC Karte ihre Adresse zusenden muss.

Gruss
Walter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.