2009-06-05 6 views
15

Ich verwende eine microSD Karte in einem Embedded-Design. Die Karte ist über die SPI-Schnittstelle mit einem Mikrocontroller verbunden. Es funktionierte für alle Karten, die ich vorher benutzt habe, aber jetzt wird meine neue Karte nicht initialisiert. Die Karte ist eine Transcend 2   GB microSD-Karte (TS2GUSD).Initialisierung einer microSD-Karte mit einer SPI-Schnittstelle

Nach der anfänglichen Taktfolge Senden an SPI-Modus zu wechseln, kann ich folgendes:

  1. CMD0 (Argument 0, CRC 0x95) -> Antwort 0x01 -> OK

  2. CMD8 (Argument 0x000001AA, CRC 0x87) -> Antwort 0x01 0x000001AA -> bedeutet, es ist SDC V2 + Karte, der Spannungsbereich 2,7   V - 3,6 V   wird unterstützt -> OK

Dann sollte ich den Befehl ACMD41 senden, aber beim Senden der CMD55 (Argument 0, CRC 0), die CMD41 vorausgehen muss, erhalte ich die Antwort 0x05 -> Ungültiger Befehl. Ich habe auch versucht, CMD1 (für MMC-Karten) zu senden, aber es gibt einen ähnlichen illegalen Befehl Antwort. Der Code funktioniert gut mit meiner Sandisk 2   GB microSD-Karte.

Wie behebe ich dieses Problem?

Antwort

14

Ich habe das Problem gefunden. Wenn ich die korrekte CRC für CMD55 berechne und diese anstelle einer Dummy-CRC sende, wird der Befehl akzeptiert (Ergebnis 0x01). Wenn Sie bei the physical layer specification in Abschnitt 7.2.2 sehen, heißt es ausdrücklich, dass:

Die SPI-Schnittstelle im CRC-OFF-Modus in Standard initialisiert wird. (außer für die Befehle CMD0 und CMD8).

Dies scheint bei dieser Serie von Transcend-Karten nicht der Fall zu sein und verletzt somit die Spezifikation. Auch im Falle eines CRC-Fehlers sollte die Antwort 0x09 statt 0x05 sein. Ich habe versucht, CRC-Überprüfung mit CMD59 explizit zu deaktivieren, aber das scheint nicht zu helfen.

=> Die Berechnung der korrekten CRC für (alle?) Befehle macht die Karte funktionsfähig.

Ich bin in Kontakt mit Transcend Unterstützung darüber. Wenn ich etwas Nützliches lerne, werde ich es hier wissen.

Beachten Sie, dass ich andere 2   GB Transcend Karten vor, aber sie wurden in Taiwan gemacht, während der neue in Korea gemacht wird (und scheint eine Samsung-Karte (MMAGR02GUDCA) zu sein).

+1

schön! gut, graben Sie das Problem auf! ... Ich bin nur fassungslos, weil das darauf hinweist, dass die USB-Kartenleser keine Combo-Befehle verwenden. Sie können/sollten Ihre Antwort als die richtige markieren. BTW, Sandisk, Transcent, etc haben keine Halbleiter-Foundries ... sie tun Controller und digitale Design-Services für ihre Produkte (sie fabrizieren nur nicht die Chips) – jpinto3912

+0

Ich musste 48 Stunden warten, um meine Antwort als richtig zu markieren aus irgendeinem Grund. Ich denke, USB-Kartenleser verwenden die "echte" SD-Speicherkarte Protokoll "Schnittstelle (hat höhere Geschwindigkeiten). In diesem Modus müssen Sie CRC verwenden und es gibt wahrscheinlich kein Problem. – Ron

+1

Haben Sie jemals eine Antwort von Transcend bekommen? Ich vermute, du hast das ganze letzte Byte als Nullen gesendet, was dazu führte, dass das Ende falsch war. Die Karte würde der Spezifikation entsprechen, und sogar der Fehlercode würde Sinn machen. (Ich habe eine Antwort hinterlassen, die das etwas genauer beschreibt, in Falls du immer noch an der Sache interessiert bist ... nach 4 Jahren) –

1

Es ist normal, dass es wahrscheinlich ist, dass die interne Ladungspumpe eine Löschspannung erzeugt, die länger dauert als gewöhnlich, um bereit zu sein ... Sie müssen auf der Combo CMD55 + ACMD41 bestehen, bis die Initialisierung abgeschlossen ist.

Der CMD58 könnte Ihnen auch helfen, zu überprüfen, ob Sie korrekte Spannungspegel liefern (manchmal haben Buchsen Kontaktprobleme).

+1

Die Karte läuft unbegrenzt auf dem CMD55 mit dem Ergebnis 0x05. Ich habe lange genug gewartet und nichts ändert sich. CMD58 hat das gleiche Ergebnis 0x05. In der Zwischenzeit habe ich das Problem ermittelt, siehe Antwort unten. – Ron

2

Ich hatte fast das gleiche Problem. Beim Senden von ACMD41 habe ich CMD55 gefolgt von CMD41 gesendet. Die Antwort für CMD55 war 0x01, was den Leerlaufzustand anzeigt und den Initialisierungsprozess ausführt (das ist normal, denke ich). CMD41 würde mit 0x05 antworten, was einen unzulässigen Befehl anzeigt. Es stellt sich heraus, dass meine spezielle Karte die CRC standardmäßig überprüft, selbst im SPI-Modus, und CRC-Fehler als ungültige Befehle falsch berichtet (d. H. Sie folgt nicht der SD-Spezifikation).Wenn ich die richtige CRC berechne, funktioniert es gut. Hier ist die CRC7 Berechnung Code, den ich verwendet, hat es funktioniert gut für mich:

https://github.com/hazelnusse/crc7

Es sei denn, Sie Sorgfalt aufgewendet haben zu deaktivieren CRC-Prüfung, ich denke, es ist wahrscheinlich am besten, zu annehmen, dass es nicht deaktiviert ist und machen sicher, dass Sie die richtige CRC für jeden Befehlsrahmen berechnen. Von dem, was ich sagen kann, deaktivieren einige Karten es standardmäßig im SPI-Modus und andere aktivieren es, obwohl die SD-Spezifikation besagt, dass es standardmäßig im SPI-Modus mit Ausnahme von CMD8 deaktiviert werden sollte.

+0

Falls du ein extrem neugieriger Typ bist, wie ich, und mich nach einem Jahr immer noch darum kümmerst: Erinnerst du dich daran, was du als letztes Byte gesendet hast? die CRC? Wenn Sie es als Nullen gesendet haben, beachten Sie, dass das letzte Bit nicht wirklich Teil der CRC ist und immer 1 sein sollte. (Ich habe auch eine Antwort mit ein bisschen mehr Details darüber) –

2

Sie sagten, Sie haben CRC 0 für den fehlgeschlagenen Befehl verwendet. Ich nehme an, dass Sie damit gemeint haben, dass Sie das ganze letzte Byte als 0x00 gesendet haben. Beachten Sie, dass die CRC7 nur die ersten 7 Bits des letzten Bytes ist - das letzte Bit mit der Bezeichnung end bit sollte immer 1 sein. Wenn Sie also 0x00 als letztes Byte senden, mit 0 als letztes Bit, wäre der Fehler verständlich und sogar der Fehlercode wäre sinnvoll. Wenn Sie 1 als letztes Bit senden, sollte es funktionieren, dh. Verwenden Sie so etwas wie 0x01 oder 0xFF als das letzte Byte.

1

Das Senden von CMD0 mit Chipauswahl (0) allein initialisiert die Karte im SPI-Modus nicht. Dies stellt nur den SPI-Modus ein. Die Karte wird erst initialisiert, wenn ACMD41 akzeptiert wird. Dann ist CRC standardmäßig deaktiviert.

Verwandte Themen