SD-Karten-Initialisierungsproblem - CMD8 falsche Antwort

Ich versuche, eine microSD-Karte mit FatFS-Code an eine Mikrocontroller-Karte (FRDM-KE06Z) anzuschließen . Ich habe nur SPI-Teile für meine Anwendung modifiziert. Neben dem Graben in FatFS-Code habe ich auch diesen Leitfaden überprüft

Wenn ich CMD0 an die Karte sende, ist die Antwort korrekt:Antwort auf CMD0

Aber wenn ich CMD8 sende, um die Karte zu identifizieren, ist die Antwort völlig falsch (nach 0xFF sollte irgendetwas mit MSB auf Null gesetzt sein):Antwort auf CMD8

Ich habe kontrolliert:

  1. Verschiedene SPI-Modi 0/1/2/3, Taktraten 75kHz und 150kHz
  2. Zwei verschiedene SD-Karten (nagelneue 32 GB SanDisk Ultra HC 1 und eine alte SanDisk 2 GB)
  3. Ich sende Dummy-Taktzyklen nach dem Einschalten, ich warte auch ein paar Sekunden, bevor ich etwas mit der Karte mache
  4. Die Verdrahtung ist kurz, daher sollte die Signalintegrität kein Problem sein
  5. Dasselbe passiert mit und ohne angeschlossenen Logikanalysator
  6. Stecken Sie die Karte ein, nachdem die MCU-Pins initialisiert wurden, warten Sie ein paar Sekunden und starten Sie den Code
  7. Das CS-Timing ist sehr entspannt (einige Millisekunden, bevor Daten gesendet werden, viele Millisekunden zwischen CMD0 und CMD8)

Was kann der Grund dafür sein, dass meine Karten nicht richtig auf CMD8 reagieren, während sie korrekt auf CMD0 reagieren?

Was verwenden Sie, um die Wellenform anzuzeigen? Es sieht wirklich schön aus!

Antworten (1)

Ich habe vor ungefähr einem Jahr eine FPGA-Konfiguration entworfen und Treiber für SD-Karten geschrieben und dabei sehr ähnliche Probleme festgestellt. Meine Lösungen für falsche Antworten / Fehlverhalten der SD-Karte waren einfach:

  • Wenn Sie den Befehl beenden, stoppen Sie die Uhr nicht direkt nach Abschluss des Befehls, sondern liefern die Uhr für 8 oder 16 Ersatzzyklen - wobei CS aktiv oder inaktiv ist. Ich glaube, ich liefere 8, wenn CS noch aktiv ist, und weitere 8, nachdem es deaktiviert wurde.
  • Wenn Sie den Befehl starten, machen Sie dasselbe wie oben - vor dem Aktivieren von CS liefern Sie 8 Ersatztakte, nachdem Sie CS aktivieren, liefern Sie auch 8 Ersatztakte und starten erst dann den Befehl, der dann dadurch erfasst wird, dass das erste Bit des Oktetts 0 ist (command Startbit).

Das Taktsignal ist für die Karte erforderlich, um einige ihrer internen Operationen abzuschließen (das offensichtlichste Beispiel ist die Wiederherstellung nach einem Daten-/Befehlsfehler). Wenn Ihr Design Takt ohne Unterbrechungen liefern würde, würden Sie dieses Problem nicht bemerken.

Update: Wenn ich mir Ihre gelieferten Wellenformen ansehe, denke ich, dass MOSI hoch sein sollte, wenn CS nicht aktiviert ist und wenn kein Befehl ausgeführt wird. Schauen Sie hier , vielleicht finden Sie es nützlich (jedoch nicht ausreichend), die SD-Kartenschnittstelle zu entwerfen.

Was zum Teufel? ES FUNKTIONIERTE! Ich sende 5 Dummy-Bytes mit CS hoch, bevor ich CMD8 sende, und jetzt habe ich die richtige Antwort erhalten. Ich denke, ich werde es vor oder nach jedem Befehl tun. Ist dieses Verhalten irgendwo in der ~250 Seiten langen vereinfachten SD-Spezifikation dokumentiert? Ich hatte gehofft, dass eine Karte, wenn sie einen leistungsstarken Controller enthält, zumindest eine eigene Uhr für den Haushalt hat.
Ich habe im Netz mehrere Erwähnungen darüber gefunden, aber nicht als explizites Wissen. Beim Entwerfen des Zeugs habe ich SD-Spezifikationen verwendet, zwei Datenblätter für bestimmte Karten verwendet (eines von Samsung und ein anderes erinnere mich nicht), einige Informationen von bereits vorhandenen Implementierungen mit MCUs und das von Elm-Chan. Und meine Reaktion war deiner sehr ähnlich, als es anfing zu funktionieren - "Was zum Teufel!" :)