Hard-Reset für SD-Karte mit Schnittstelle zum FPGA?

So konnte ich erfolgreich eine Sandisk-SD-Karte mit Spartan 3 FPGA (mit Verilog) verbinden. Die Karte wird nach dem Einschalten korrekt initialisiert und kann Daten sektorweise korrekt lesen und schreiben. Das einzige Problem, das bleibt, ist, dass die Karte nach dem Einschalten hängt und nicht mehr funktioniert, wenn ich die Reset-Taste drücke. Ich konnte auch nicht herausfinden, was ein Hard Reset für die SD-Karte bedeutet. Sollte es irgendwie neu initialisiert werden? Welchen Befehl muss ich dafür an die Karte senden? Jede Hilfe ist willkommen.

SPI oder native Schnittstelle?
Hätte erwähnen sollen ... es ist eine SPI-Schnittstelle.

Antworten (2)

Sie müssen Ihren Verilog-Code simulieren oder den Analysator verwenden, um zu sehen, was im Live-System vor sich geht.

Meiner Meinung nach gibt es nur zwei Umstände, wenn die SD-Karte "hängen" erscheint:

  • schlechte Spezifikationsimplementierung, wenn die Karte nicht versteht, was vor sich geht, oder nicht verstehen kann, dass der vorherige Befehl abgebrochen werden muss. Die Karte muss Ihnen jedoch während der Ausführung dieser Befehle sowieso etwas anderes als alle 1 mitteilen - zum Beispiel wird beim Multiple Block Read CRC übertragen, der Nullen enthält, beim Multiple Block Write muss der Host CRC übertragen, da sonst die Kartenantworten mit Fehlern enthalten sind 0s. Ihre Aufgabe hier ist es, den Satz von SD-Kartenbefehlen zu überprüfen, die Ihr Controller verwendet, und die Initialisierungssequenz (Anzahl der Ersatztaktzyklen, bevor Sie mit CMD0 fortfahren) entsprechend anzupassen.

  • Ihre FPGA-Zustandsmaschine schlägt fehl, nachdem Sie Reset gedrückt haben. Zum Beispiel funktioniert die Uhr am Takteingangsstift der SD-Karte nicht mehr, MOSI bleibt hängen usw. Dies ist am verdächtigsten für hängende Karten, da die SD-Karte nichts ausgibt, wenn die Uhr nicht umschaltet oder CS nicht aktiviert und nicht nützlich ist Informationen zur MOSI-Linie.

Sobald eine SD-Karte mit Strom versorgt und initialisiert wird, Sie dann aber Ihr FPGA zurücksetzen, startet der Code wahrscheinlich eine neue Initialisierung einer bereits initialisierten Karte. Die SD-Schnittstelle hat keine spezielle Reset-Leitung. Der einzige Hard- Reset in SD ist ein Power-On-Reset, daher ist der beste Weg, eine SD-Karte in den vorinitialisierten Zustand zu bringen, das Aus- und Wiedereinschalten.

Also rein in Bezug auf die Verilog-Codierung, was sollte ich in den if(!reset)Teil meines Codes einfügen? Und wenn die Reset-Taste gedrückt wird, in welchen Zustand sollte mein entworfenes FSM gehen? Leerlauf oder CMD0?
@Candy, da Ihr FPGA nach dem Zurücksetzen wahrscheinlich alle SD-Konfigurations- / Kapazitätsinformationen usw. löscht, müssen Sie eine neue Initialisierung starten, ich denke, CMD0 + CS wurde bestätigt (um in den SPI-Modus zu gelangen), dann CMD8, CMD58 usw. entsprechend mit Initialisierungsprotokoll.
Ich habe die aktivierte CMD0+CS-Sequenz ausprobiert, aber die SD-Karte hängt immer noch, wenn der Reset gedrückt wird. Ich denke daran, irgendwie den Reset und die Stromleitung der SD-Karte so anzuschließen, dass sie den anfänglichen Stromzyklus auslöst!
@Candy, ich weiß nicht, wie Sie die SD-Initialisierung in Verilog durchführen. Das Protokoll ist schrecklich komplex, es hat so viele Bedingungen/Antworten zu analysieren. Normalerweise ist für diese Aufgabe eine große MCU mit Hunderten und Aberhunderten von C++-Codezeilen erforderlich. Welche Version der SD-Spezifikationen implementieren Sie? 2? 3? 4? 5+?
Ja, es ist komplex, aber irgendwie habe ich es geschafft, einen angepassten Verilog-Code dafür zu erstellen. Die Karte ist SDHC Version 2.
Ich habe also verstanden, dass Sie eine SD-Karte, die bereits einmal initialisiert wurde, nicht neu initialisieren können. Dadurch würde die SD-Karte in einen aufgehängten Zustand versetzt. Sie können die SD-Karte nur durch den Power-On-Reset neu initialisieren.
@Candy, ich bin mir nicht sicher, was du mit "hängen" meinst. Haben Sie ein ChipScope zum Debuggen? Aber ich weiß, dass, wenn SD in den SPI-Modus versetzt wird, nur Power Cycling es wieder in den Standard-SD-Modus bringen kann.
Dies bedeutet, dass die SD-Karte nicht mehr funktioniert und sowohl die MOSI- als auch die MISO-Leitung hoch gehen!
@Candy, wenn also Ihr Code nach dem globalen Hardware-Reset nichts tut, wie könnte es jemand schuld sein?
In meinem Code soll nach dem Hardware-Reset die Initialisierungssequenz stattfinden, aber die Karte folgt dem nach dem Reset nicht !!
@Candy, im SPI-Modus sollte eine SD-Karte immer mit etwas antworten. Anscheinend führt Ihr Code keine vollständige Analyse der Antworten durch. Nochmals, welche Tools müssen Sie debuggen? Haben Sie Spuren von dem, was Sie tun, und wie reagiert die Karte auf jeden Befehl?