Ich arbeite seit einiger Zeit mit SD-Karten und Micro-SD-Karten.
Ich verwende Part1_Physical_Layer_Simplified_Specification_Ver6.00 als Referenz.
Ich kann eine erfolgreiche Karteninitialisierung durchführen, lesen und schreiben für andere Micro-SDs wie ATP 8 GB SLC, Panasonic 8 GB SLC usw. Wenn ich jedoch Delkin 16 GB SLC (und auch Swissbit 8 GB SLC) verwende, bin ich bei der Karteninitialisierung erfolgreich und schreiben, wenn ich versuche zu lesen, bekomme ich kein Startblock-Token 0xFE und es gibt ungefähr 512 Bytes Junk-Daten, bevor es wieder normal wird.
Das Muster ist wie folgt (unter Verwendung des Beagle SPI-Analysators):
Nach dem Schreiben des Folgenden (nur die ersten 24 Bytes werden angezeigt, aber das Muster ist dasselbe):
Wenn ich 0xA0 schreibe. Bitte beachten Sie das folgende Bild:
Wenn ich die geschriebenen Bytes ändere, werden auch die gelesenen Bytes geändert, und es besteht auch eine Eins-zu-Eins-Entsprechung zwischen den geschriebenen und den gelesenen Bytes. Aber die Bytes sind nicht gleich.
Ich verifiziere, dass die Daten erfolgreich mit dem SD-Kartenleser mit HxD-Hex-Viewer geschrieben wurden.
Für den ersten Fall:
Für den zweiten Fall:
Es scheint nicht so, als würde die Spannung zur SD-Karte variieren, da ich sie auf dem Oszilloskop überprüft habe und sie während des Lesens 3,3 Volt beträgt.
Als Mikrocontroller verwende ich F28377s Launchpad von TI.
Ich möchte die Inputs von Ihnen erhalten. Was genau kann ich versuchen, um dieses Problem zu beheben?
Edit1: Genau das gleiche Verhalten wird für Swissbit 8 GB SLC beobachtet. Die gleichen Bilder oben können auf Swissbit angewendet werden. Die für Swissbit gelesenen Daten sind die gleichen wie bei Delkin. Der SPI-Takt beträgt vor der Initialisierung 200 kHz und wird nach der Initialisierung auf 1 MHz geändert.
Edit2: Bitte schauen Sie sich die Oszilloskopbilder unten an (ich habe die Taktfrequenz auf 225 KHz geändert):
Edit3: Das zweite Oszilloskopbild folgt unmittelbar auf das erste Oszilloskopbild. Das erste Bild ist der Lesebefehl und die Antwort, während das zweite Bild 0xFF sendet und auf das Startdatenblock-Token wartet, das im zweiten Bild 0xA8 ist, da 0xFE um 2 Bits bitverschoben ist. Sie können sich die dekodierten Hex-Daten des Oszilloskops unten in den Oszilloskopbildern ansehen. Sie sind die gleichen wie meine Beagle SPI Analyzer Debug Data für Beispiel 2 (wo ich 0xA0 schreibe und 0x28 zurücklese).
Edit4: Gemäß dem Vorschlag von Anonymous habe ich meinen Code so aktualisiert, dass ich vor jedem Befehl und nach CS LOW 8 Takte vor jeder tatsächlich beabsichtigten SPI-Übertragung sende. Nach Abschluss der Befehlsantwort sende ich 8 Taktzyklen unmittelbar vor CS HIGH und 8 Taktzyklen unmittelbar nach CS HIGH. Der Abschluss der Befehlsantwort im SD-Lesefall bedeutet, wenn wir das letzte CRC-Byte empfangen haben. Der Abschluss der Befehlsantwort in SD Write bedeutet, dass die Karte nach dem Schreiben aufhört, das Besetztsignal zu senden. Ähnlich habe ich es auch auf andere Befehle angewendet. Außerdem mache ich CS HIGH erst, wenn der Befehl und seine Antwort abgeschlossen sind. Zum Beispiel mache ich im SD-Lesefall CS LOW und sende den Befehl, erhalte die Befehlsantwort, erhalte das Startblock-Token (0xFE), erhalte den CRC und dann mache ich den CS HIGH.
Danke.
Ich denke, Sie sollten das Muster bemerkt haben:
fe 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 00 01 02 03 ...
Wenn Sie diese Sequenz um zwei Bits nach rechts verschieben, erhalten Sie
ff 80 00 40 80 c1 01 41 81 ...
Also genau die Reihenfolge, die Sie haben. Sie haben dem Stream zwei freie Bits hinzugefügt, und Bytes wurden falsch ausgerichtet. Warum? Ohne genaue Diagramme, die die Uhr zeigen, ist es nicht möglich zu sagen. Höchstwahrscheinlich haben Sie Probleme mit der Uhrzeit- oder Datensynchronisation.
Diese Fehlausrichtung kann sowohl beim Schreiben als auch beim Lesen auftreten. Es kann also so aussehen, als ob Sie eine falsche Sequenz schreiben, weil bei Ihrem Schreibbefehl Bytes falsch ausgerichtet sind, und diese falsche Sequenz dann (natürlich) zurücklesen, oder es könnte sich um ein reines Lesebefehlsproblem handeln. Die Schlussfolgerung, dass Sie überprüfen müssen , welche SD-Karte tatsächlich darauf geschrieben wurde – mit einem anderen funktionierenden Gerät (z. B. PC, der Ihre Karte in die Datei ausgibt und das Image überprüft) – bevor Sie mit der Ausführung von Lese- oder Schreibbefehlen debuggen.
Bearbeiten: Wenn ich mir die Scope-Diagramme ansehe, sehe/empfehle ich Folgendes:
Bearbeiten 2:
Das zweite Oszilloskopbild folgt unmittelbar auf das erste Oszilloskopbild.
Seien Sie sehr vorsichtig, wenn Sie die Karte abwählen - Ihre Bilder zeigen, dass Sie Befehle an die Karte erteilen, sie abwählen, CS hoch heben, und sie dann erneut auswählen und kontinuierlich 0xFFs an die Karte senden. Anscheinend versteht die Karte das nicht und sendet 0x28s zurück, die eigentlich 0x05 sind - R1-Antwort "ungültiger Befehl" verschoben. Es gibt nur bestimmte Umstände, unter denen Sie die Karte abwählen können, dies wird in der vereinfachten SD-Spezifikation erklärt und folgt einem sehr spezifischen Protokoll:
Wenn die Karte besetzt signalisiert, kann der Host sie jederzeit abwählen (durch Erhöhen des CS). Die Karte gibt die DataOut-Leitung einen Takt nach dem Hochgehen des CS frei. Um zu prüfen, ob die Karte immer noch beschäftigt ist, muss sie erneut ausgewählt werden, indem das CS-Signal aktiviert (auf niedrig gesetzt) wird. Die Karte wird einen Takt nach der abfallenden Flanke von CS das Belegtsignal wieder aufnehmen (DataOut auf Low ziehen).
Zu meinem zweiten Kommentar
Auch Ihr Kommentar 2, ist es für alle Befehle erforderlich? Derzeit habe ich Ihren Vorschlag nur auf Read Command angewendet.
Ersatzzyklen werden zwar einige Zeit in Anspruch nehmen, stellen jedoch sicher, dass die Karte den vorherigen Vorgang ordnungsgemäß abgeschlossen/abgebrochen hat und sich für den nächsten bereit macht. Daher empfehle ich Ihnen, es nach Möglichkeit für alle Befehle zu implementieren.
Ankit Srivastava
Anonym
ff fe
Sie erhalten somit statt dessenff ff 80
Ankit Srivastava
Anonym
Ankit Srivastava
Anonym
Ankit Srivastava
Anonym
Ankit Srivastava