Was ist die richtige Befehlssequenz für die Initialisierung der microSD-Karte in SPI?

18

Ich versuche, eine microSD- Karte (2 GB, Kingston, Sandisk) mit einem Silicon Labs C8051F931- Controller zu verbinden.

Ich bin sehr verwirrt über die Reihenfolge, die ich zur Initialisierung einhalten muss. In dem Buch SD Card Projects Using the PIC Microcontroller , Seite 135 wird Folgendes erwähnt:

Die Schritte zum Umschalten der SD-Karte in den SPI-Modus sollten daher wie folgt sein: Einschalten
.
• Senden Sie mindestens 74 Taktimpulse an die Karte, wobei CS und Data Outlines auf logisch „1“ gesetzt sind.
• Setzen Sie die CD-Leitung auf LOW.
• Senden Sie den 6-Byte-CMD0-Befehl „40 00 00 00 00 95“, um die Karte in den SPI-Modus zu versetzen.
• Überprüfen Sie die R1-Antwort, um sicherzustellen, dass keine Fehlerbits gesetzt sind.
• Senden Sie den Befehl CMD1 so oft, bis das Bit „In-Idle-State“ in der R1-Antwort auf „0“ gesetzt ist
und • keine Fehlerbits mehr gesetzt sind. Die Karte ist jetzt für Lese- / Schreibvorgänge bereit.

Ich habe es versucht, aber ich bekomme 01 sogar für CDM1. 00 wird erwartet.

Auch hier sehe ich eine andere Befehlssequenz, bei der er CMD8 nach CMD0 sendet. Aber das Buch sagt, ich muss CMD1 senden.

Was ist die richtige Reihenfolge?

gpuguy
quelle

Antworten:

34

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:

  1. 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.

  2. 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)

vaxquis
quelle
4

Die technischen Daten für SD-Karten finden Sie auf sdcard.org . In der vereinfachten Version wurden einige Details ausgelassen, aber Sie sollten sich zum Beispiel die Abbildung 7-2 in Teil 1 ansehen, in der die Initialisierungssequenzen für SDHC- und SD-Karten erläutert werden.

MicroSD-Karten <= 2 GB können wie ältere Karten funktionieren, daher sollten sie Ihnen irgendwann ein0x00 Ergebnis liefern . Dies kann mehr als ein paar Wiederholungsversuche erfordern, da die Karte den externen Takt vom SPI-Bus verwenden kann, um einige interne Verarbeitungsschritte auszuführen.CMD1

Turbo J
quelle
2

Neben der hervorragenden Antwort von @vaxquis möchte ich die entsprechende Tabelle aus der " Physical Layer Simplified Specification Version 4.10 , © Copyright 2001-2013 SD Group (Panasonic, SanDisk, Toshiba) und SD Card Association" (Abbildung 7-2) zitieren : Ablauf der SPI-Modusinitialisierung):

SD-Karten-SPI-Initialisierungssequenz

Hier können Sie sehen, welche Befehle in welcher Reihenfolge gesendet werden sollen und was die Antworten über den Kartentyp aussagen. Ich halte es für wünschenswert, dass ein Gerät so viele Karten wie möglich unterstützt. und solange es um die grundlegenden Operationen zum Lesen und Schreiben von 512-Byte-Blöcken geht, sollte dies für mindestens alle SD- und HC-Karten der Versionen V1.x und V2.0 möglich sein.

JimmyB
quelle
2

Ich biete dies als eine weitere Möglichkeit an. Im SPI-Modus benötigen Samsung MicroSD EVO 32GB alle Befehlscodes, um gültige CRC-Codes zu haben. Ich wette, sie sind nicht die einzigen. Ich las einen Kommentar, in dem die Person glaubte, dass alle Karten über 32 GB auf diese Weise sein könnten. Ich habe über eine Woche lang einen Fehler behoben. Mein Code würde nicht funktionieren, bis alle an die Karte gesendeten Codes gültige crc-Codes hatten. Ich habe dies verwendet, um alle CRC-Codes zu berechnen https://github.com/hazelnusse/crc7/blob/master/crc7.cc Ich habe sogar versucht, die CRC-Codes mit einem Befehl 59 auszuschalten, nein. Ich hoffe, das spart jemandem viel Zeit und Mühe.

Mein Initialisierungscode mit CRC-Werten.

Power On..
Clock card at least 74 (I use 80) cycles with cs high
CMD0 0, crc=0x95
CMD8 0x01aa, crc=0x87
CMD58 0, crc=0xfd
CMD55 0, crc=0x65
CMD41 0x40000000, crc=0x77
CMD9 0, crc=0xaf
CMD16, 512, crc=0x81 (If you want block length of 512)

Some random other commands..
CMD17 0, crc=0x3b (Read one block)
CMD18 0, crc=0x57 (Read multiple blocks)
CMD24 0, crc=0x6f (set write address for single block)
CMD25 0, crc=0x03 (set write address for first block)
Dave
quelle
-2

Sind Sie sicher, dass Ihr SPI-Bus 400 kHz hat? Die Initialisierung muss bei einem SPI-Bus mit 400 kHz erfolgen, bis die SD-Karte meldet, dass sie sich im Ruhezustand befindet, wodurch die SPI-Bustaktrate erhöht werden kann (das genaue Maximum scheint von Hersteller zu Hersteller zu variieren, scheint jedoch zu sein) 12 MHz sind für die meisten Karten eine sichere Wette.

Demnach ist auch : http://elm-chan.org/docs/mmc/mmc_e.html CMD1 die richtige Initialisierung. CMD8 wird nur zum Abfragen des Spannungsbereichs benötigt, was bei Nicht-SDHC-Karten (<= 2 GB) kein Problem sein sollte.

Zuofu
quelle
Tatsächlich werden viele SD-Karten (meistens neuere, mein Sony SR-32C4 32GB ist eine) ohne vorherige Ausgabe überhaupt nicht gestartet CMD8. Außerdem ist die Uhr normalerweise kein Problem, solange sie sich in einem vernünftigen Bereich befindet.
Vaxquis
-3

Vielleicht ist das zu spät, aber die Antwort von der Karte ist in Ordnung! Nach CMD0 muss die Antwort 0x01 lauten. Dies bedeutet, dass sich die Karte im Leerlauf befindet und betriebsbereit ist. Wenn Sie so etwas wie 0b00000101 haben, sagt die 1 an der 2. Stelle, dass dies ein unzulässiger Befehl ist, und die 1 an der 0 sagt, dass sich der Sard noch im Leerlauf befindet und zur Arbeit bereit ist. Wenn die Antwort 0x00 ist, bedeutet dies, dass sich die Karte NICHT im Leerlauf befindet und Sie einen weiteren RESET-Befehl senden müssen.

Peca
quelle
hast du die frage überhaupt gelesen OP hat klar gesagt I tried this, but I am getting 01 even for CDM1- Leerlauf als Antwort auf CMD1in NICHT OK. Sie sprechen sein wirkliches Problem nicht mit Ihrer "Antwort" an.
Vaxquis