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 CMD1SD / 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 0x1AAnach 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:
CMD0arg:, 0x0CRC: 0x95(response :) 0x01- Beachten Sie, dass Sie im Falle einer 0xFFverstümmelten Antwort diesen Schritt einfach wiederholen sollten. Weitere Informationen finden Sie weiter unten.
CMD8arg:, 0x000001AACRC: 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 0x1AAist 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. CMD55arg:, 0x0CRC: any, 0x65actually (Antwort 0x01:; CMD55ist das Präfix für jeden ACMD ; wenn die Antwort ist 0x05, hast du eine alte Karte - wiederhole CMD1mit arg 0x0[CRC 0xF9] anstelle von CMD55/ ACMD41)
3b. ACMD41, arg:, 0x40000000CRC: any 0x77(Beachten Sie, dass dieses Argument davon ausgeht, dass es sich um eine HCS-Karte handelt, was normalerweise der Fall ist; verwenden Sie 0x0arg [CRC 0xE5] für ältere Karten). Wenn die Antwort lautet 0x0, sind Sie in Ordnung. wenn 0x01ja, 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 CMD1bei 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 CMD1wenn Sie 0x05von 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 erfolgtnn0wird nicht angezeigt (dh wenn sich das Gerät aus irgendeinem Grund im IDLE-Modus befindet). Empfangen 0xFFvon CMD0ist 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 .nCMD00xFF0x01CMD8
Beachten Sie, dass Antworten, bei denen das MSB eingestellt ist, dies jedoch 0xFFnormalerweise 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, CMDwenn 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 CMD0und CMD8im 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.