Tatsächlich sind die meisten Informationen / Codes, die Sie bei der SD-Initialisierung finden, entweder veraltet oder ungenau, da sie um Jahre älter sind als SDHC und SDXC. Das Verfahren ist heutzutage komplizierter, da Sie abwärtskompatibel mit alter Hardware umgehen müssen.
Wählen Sie zunächst, wie von anderen erwähnt, eine niedrige Anfangstaktrate (im Allgemeinen im Bereich von 100 kHz - 400 kHz; verwenden Sie wenn möglich 400 kHz). Sie können später auf eine höhere Uhr umschalten, wenn das Gerät dies zulässt. Während neue Karten MHz-ish Taktung sicher widerstehen können, beschweren sich ältere (dh nicht kommunizieren oder Müll zurückgeben).
Als nächstes sollten Sie CMD1
SD / SDHC / SDXC-Karten nur initialisieren, wenn Ihre Karte CMD55
/ nicht erkennt ACMD41
. wie in der SD-Kartenspezifikation angegeben:
In keinem Fall wird CMD1 empfohlen, da es für den Host schwierig sein kann, zwischen MultiMediaCard und SD-Speicherkarte zu unterscheiden.
Einige Controller (meistens neuere und leistungsstärkere Karten) bleiben einfach im Leerlauf, wenn Sie sie ausstellen CMD1
. Sie sollten zuerst CMD8 0x1AA
nach dem Zurücksetzen ( CMD0
) ausgeben und dann versuchen, zu verwenden CMD55 + ACMD41
. Wenn und nur wenn dies fehlschlägt, verwenden Sie CMD1
.
Um die Karte im SPI-Modus zu initialisieren, sollten Sie:
CMD0
arg:, 0x0
CRC: 0x95
(response :) 0x01
- Beachten Sie, dass Sie im Falle einer 0xFF
verstümmelten Antwort diesen Schritt einfach wiederholen sollten. Weitere Informationen finden Sie weiter unten.
CMD8
arg:, 0x000001AA
CRC: 0x87
(Antwort 0x01
:, in diesem Fall gefolgt von arg-Echo 0x000001AA
) - Dieser Befehl scheint zwar optional zu sein, ist jedoch für neuere Karten zwingend erforderlich. Hier 0x1AA
ist zwar ein gängiger Argumentwert, Sie können jedoch auch andere Werte übergeben. Siehe "Tabelle 7-5: Kartenbetrieb für CMD8 im SPI-Modus", S. 32. 108 in spec für Details.
3a. CMD55
arg:, 0x0
CRC: any, 0x65
actually (Antwort 0x01
:; CMD55
ist das Präfix für jeden ACMD
; wenn die Antwort ist 0x05
, hast du eine alte Karte - wiederhole CMD1
mit arg 0x0
[CRC 0xF9
] anstelle von CMD55
/ ACMD41
)
3b. ACMD41
, arg:, 0x40000000
CRC: any 0x77
(Beachten Sie, dass dieses Argument davon ausgeht, dass es sich um eine HCS-Karte handelt, was normalerweise der Fall ist; verwenden Sie 0x0
arg [CRC 0xE5
] für ältere Karten). Wenn die Antwort lautet 0x0
, sind Sie in Ordnung. wenn 0x01
ja, gehe zu 3a; wenn ja 0x05
, siehe Anmerkung oben (in 3a.); Ist dies nicht der Fall, stimmt etwas nicht (siehe auch unten).
Bei den meisten Karten müssen die Schritte 3a / 3b (oder CMD1
bei alten Karten) in der Regel mindestens einmal wiederholt werden, auch wenn Sie einige Zeit zwischen ihnen warten . Das heißt, die tatsächliche Sequenz ist CMD0
/ CMD8
/ CMD55
/ ACMD41
/ CMD55
/ ACMD41
(oder CMD0
/ CMD8
/ CMD1
/ CMD1
) - versuchen Sie es mit CMD55
/ ACMD41
(oder CMD1
wenn Sie 0x05
von ihnen gekommen sind) mal (wählen Sie innerhalb Ihres Grundes aus; es ist tatsächlich durchaus üblich, dass Sie warten müssen einige hundert ms, wenn das Gerät kurz nach dem Einschalten ist, zielen Sie darauf ab, mit kleinen Verzögerungen zwischen den Versuchen, wenn Sie dies wünschen, und gehen Sie davon aus, dass dies fehlschlägt, wenn eine Antwort erfolgtnn0
wird nicht angezeigt (dh wenn sich das Gerät aus irgendeinem Grund im IDLE-Modus befindet). Empfangen 0xFF
von CMD0
ist auch üblich, wenn sich ein Gerät zuvor in einem "seltsamen" Zustand befand (z. B. aufgelegt, S̲S̲ deaktiviert [hoch], Über- / Unterspannung an einigen Pins usw.) mal. Eine verstümmelte Antwort auf ist manchmal ganz in Ordnung - wenn Sie sie ein paar Mal gesendet haben und die Antwort immer noch weder noch ist , versuchen Sie, fortzufahren . Wenn es funktioniert, können Sie loslegen. Wenn nicht, ist es wahrscheinlich kaputt .nCMD0
0xFF
0x01
CMD8
Beachten Sie, dass Antworten, bei denen das MSB eingestellt ist, dies jedoch 0xFF
normalerweise nicht darauf hindeutet, dass Ihr SPI eine Taktverschiebung aufweist (z. B. aufgrund eines Vcc-Abfalls, der routinemäßig auftritt, wenn Sie SD-Hotplugs ausführen). Um dies zu beheben, können Sie versuchen, das Gerät vollständig zurückzusetzen (Ein- / Ausschalten, Deaktivieren / Aktivieren von S̲S̲ usw.). es funktioniert normalerweise .
Auch die Spezifikation sagt
Nach der letzten SD-Speicherkarten-Bustransaktion muss der Host 8 (acht) Taktzyklen für die Karte bereitstellen, um den Vorgang abzuschließen, bevor die Uhr heruntergefahren wird.
Es könnte auch ohne funktionieren, aber da 8 Zyklen = 1 SPI-Ausgangsbyte sind, tut es nicht viel weh und es ist einfach gut, es zu haben.
Beachten Sie, dass Sie S̲S̲ (auch bekannt als CS) mindestens vor und nach jedem Test auf niedrig setzen sollten CMD
- dies ist im Fall von CMD0
(das Gerät lässt sich ohne das Gerät nicht einschalten) absolut obligatorisch und in Wirklichkeit für alle anderen erforderlich, CMD
wenn Sie Standards haben kompatible SD-Karte. Das dauerhafte Anschließen des S̲S̲ der Karte an GND kann den Anschein erweckenDies ist eine gute Idee, wenn die Karte der einzige SPI-Client ist, mit dem sich Ihr Host jemals verbinden wird, da dies Ihnen den uC-Ausgangs-Pin und die Notwendigkeit erspart, sie überhaupt per Code zu verwalten, und weil die Karte davon ausgehen sollte, dass alle ausgewählt sind der ganzen Zeit. In der Realität erwarten einige Karten (wenn nicht die meisten), dass sich eine Steigung von hoch nach niedrig einschaltet, anstatt nur ein niedriges Signal zu erkennen, und ärgern sich daher, wenn Sie das S̲S̲-Bit überhaupt nicht umschalten und dann entweder verzögern Uhren oder Müll spucken; Einige (normalerweise neuere) Karten sollten funktionieren, einige (ältere) möglicherweise nicht, YMMV (noch einmal). Denken Sie jedoch bei einer robusteren SPI-Konfiguration (> 1 Slave-Gerät) daran, den Pin niedrig zu setzen, bevor Sie eine tatsächliche Transaktion mit der angegebenen SD-Karte durchführen.
Außerdem , während die Spezifikation sagt , dass nur CMD0
und CMD8
im SPI - Modus haben CRC sollte, einige SD - Karten (wie Transcend sind) scheinen für die richtige CRC zu verlangen CMD55
/ ACMD41
- wenn Sie auf der sicheren Seite sein wollen, einfach einen vorberechneten Wert für sie verwenden.
Auch wenn SPI selbst keine Pullups / Downs erfordert, kann es eine gute Idee sein, ein 47k-Pullup auf MISO zu werfen. Einige Geräte lassen ihren DO-Pin unter bestimmten Umständen hoch-Z (z. B. nicht initialisiert), und potentialfreie Pins können immer zu seltsamen Problemen führen. Wenn Ihre uC 3,3 Vcc hat, können Sie interne Klimmzüge verwenden; Wenn es 5 V sind, tun Sie dies nicht, es sei denn, Ihre MISO-Leitung verfügt bereits über eine ordnungsgemäße 5-> 3,3 V-Logikübersetzung.
Weitere Lektüre:
Verwendung von MMC / SDC
SD - Spezifikationen Teil 1 Simplified Physical Layer Specification Simplified - was am wichtigsten Abschnitte 6.4.1 Einschalten und 7.2.1 Modusauswahl und Initialisierung mit Abbildung 7-1 : SD Memory Card - Zustandsdiagramm (SPI - Modus)
CMD8
. Außerdem ist die Uhr normalerweise kein Problem, solange sie sich in einem vernünftigen Bereich befindet.