Ich habe mir die Stack Overflow-Frage angesehen Initialisierung einer microSD-Karte unter Verwendung einer SPI-Schnittstelle und habe keine Antworten gesehen, die zu meinem Problem passen (also Dinge, die ich noch nicht versucht habe).
Ich habe ein ähnliches Problem, bei dem ich versuche, über die SPI-Schnittstelle eines Mikrocontrollers auf eine SD-Karte zuzugreifen (insbesondere eine HC908 ). Ich habe versucht, die Flussdiagramme in der vereinfachten Spezifikation der physikalischen Schicht v2.00 zu folgen, und es scheint, auf Transcend 1 GB & amp; 2 GB und eine AE & amp; C 1 GB Karte. Aber ich habe Probleme mit drei anderen zufälligen Karten aus meinem Vorrat an alten Karten, die ich an meiner Kamera benutzt habe.
Mein Code ist alles HC908 Assembler. Ich habe die SPI-Taktleitung aussortiert und während der Initialisierung läuft sie etwa 350 kHz (der einzige Drehzahlmultiplikator, den der HC908 bei meiner niedrigen MCU-Taktfrequenz liefert, die in das 100 - 400 kHz-Fenster fällt).
Hier sind die Ergebnisse der drei Karten, die meine Initialisierungsroutine nicht abschließen (alle nacheinander, ohne irgendwelche Code- oder Timing-Parameter zu ändern):
%Vor%Steht die Flagge des illegalen Befehls fest? Sollte ich etwas nach CMD8 tun, um diese Flagge zu löschen?
%Vor%Warum ist OCR alles F? Scheint überhaupt nicht korrekt. Warum reagieren ACMD41 und CMD1 auch auf unzulässige Befehle? Ist CMD1 fehlerhaft, weil die Karte nach der CMD55 auf eine gültige ACMD wartet, selbst wenn die Befehlsantwort unzulässig ist?
%Vor%Was ist mit dieser Karte falsch?
Manchmal ist es synchron, manchmal nicht. (Das obige Muster ist wiederholbar.) Ich habe dieses Thema ausgesucht und sehe keine bösartigen Taktzyklen zwischen MOSI / MISO-Übertragungen.
OK ... Ich habe mein Problem gefunden. Für alle anderen, die auf dieses Problem stoßen, ist es wichtig, daran zu denken, nach Erhalt der Antworten ein zusätzliches 0xFF
zu senden. Dies gibt der Karte zusätzliche acht Taktzyklen, um sich auf den nächsten Befehl vorzubereiten. Einige Karten scheinen es nicht zu brauchen (die Transcends, die ich zum Beispiel verwende), aber andere erfordern es.
Ich habe am Anfang meiner "Schreibbefehl" -Routine eine einfache Schleife eingefügt, die 0xFF
sendet, bis sie 0xFF
als Antwort erhält, damit ich nicht zu allen verschiedenen Stellen gehen muss, an denen ich lese Antworten, um sicherzustellen, dass ich einen zusätzlichen senden 0xFF
. Da die SD-Karte (normalerweise) im SPI-Modus betroffen ist, steht die Zeit still, wenn keine Taktzyklen eingehen.
Eine Sache, die ich notiert habe und für die ich bisher noch keine Antwort gefunden habe (aber bisher tut es nichts weh), nachdem ich die 16 Bytes des CSR gelesen habe, scheint es weitere 2 Bytes von nicht% zu geben. co_de% das kommt raus ... Ist das ein CRC16? Seltsam, da der CSR einen eingebauten CRC hat ...
Das ist wichtig: Ich hatte sehr viel Probleme mit der SD / MMC-Karte, bis ich herausfand, dass ich eine Betriebsspannung wählen musste . Sie tun dies, indem Sie ACMD41 mit dem Bit senden, das für die Spannung festgelegt ist, mit der Sie die Karte versorgen. Hinweis: Nur ein einzelnes Bit darf ausgewählt sein . Wenn Sie keine Spannung wählen oder mehr als eine auswählen, wird KEEP im Leerlaufzustand laufen und niemals auf einigen SD-Karten beenden.
Das heißt: Wenn Ihr ACMD41 weiterhin die Antwort 0x01 sendet, haben Sie keine Spannung ausgewählt. Die Spannung liegt in den 32-Bit-Parameter-Bits 23 ... 8 des ACMD41. Für 3.2V ... 3.3V ist dies Bit 20, also könnten Sie zum Beispiel:
%Vor%Das ist Hex-Wert 0x10, also würde Ihre ACMD41 so aussehen ... 0x69 0x40 0x10 0x00 0x00 0xCD ... oder wenn es eine SDSC-Karte ist ... 0x69 0x00 0x10 0x00 0x00 0x5F
Hier ist eine kurze (und unvollständige) Tabelle der gebräuchlichsten Werte:
%Vor%Sie müssen NICHT zu jedem Zeitpunkt CS hoch schalten. Sie können es die ganze Zeit niedrig halten.
Tags und Links initialization embedded microcontroller sd-card spi