Respektiert eine SD-Karte im SPI-Modus die Chipauswahl / Slave-Auswahl? Scheint in meiner Anwendung zurückgesetzt zu werden

9

Ich habe eine Anwendung, in der ich einen Mikrocontroller (NXP LPC1343 ) habe, der über 16-Bit-SPI mit einem FPGA verbunden ist. Es gibt auch eine SD-Karte mit demselben SPI-Port (MISO / MOSI), jedoch mit einem anderen CS / SS-Pin (beide sind gemäß SPI-Spezifikation aktiv niedrig). Eines der Dinge, die ich tun muss, ist, Daten vom FPGA mit FAT32 in eine Datei auf der SD-Karte zu schreiben , und dies ist die Aufgabe des Mikrocontrollers. Auf dem Mikrocontroller läuft FatFS , das ich selbstständig zuverlässig arbeiten lassen kann.

Da der Mikrocontroller nur wenig RAM hat, kann nur wenig Daten gleichzeitig gepuffert werden. Daher muss das Mikro einen Puffer aus dem FPGA lesen, den SPI-Modus auf 8-Bit ändern und diese Daten dann in das FATFS schreiben. Denken Sie daran, dass zum Konfigurieren der SD-Karte für den SPI-Modus ein Befehl gesendet werden muss, während der SPI-Bus mit 400 kHz ausgeführt wird, und dass eine gewisse Wartezeit erforderlich ist. Daher möchte ich die Initialisierung nur einmal durchführen müssen.

Das Ausführen von Transaktionen auf dem FPGA, selbst wenn CS auf der SD-Karte hoch gehalten wird, scheint die SD-Karte in einen seltsamen Zustand zu versetzen, sodass sie erneut initialisiert werden muss. Dies ist natürlich unerwünscht, da die Initialisierung mehrere Millisekunden dauern kann, um nur etwa 4 kB Daten zu schreiben (wiederum begrenzt durch die geringe RAM-Kapazität meines Mikros). Da ich so schnell wie möglich mehrere Megabyte schreiben muss, reduziert dies die Leistung von etwa 500 kB / s auf weniger als 100 kB / s.

Ich bin mir bewusst, dass SD-Karten technisch nicht vollständig SPI-kompatibel sind, aber wie kann dieses Problem behoben werden?

Zuofu
quelle
Soweit ich weiß, sollte es das ehren. Vielleicht versuchen Sie es mit einer anderen SD-Karte?
Marko
Das ist eine gute Frage. Danke, dass du es gefragt (und beantwortet) hast.
Markrages

Antworten:

7

Okay, ich habe es tatsächlich herausgefunden. Ich hätte etwas tiefer googeln sollen. Es stellt sich heraus, dass SD-Karten nicht genau wie SPI-Geräte funktionieren, wenn sie einen Bus gemäß MMC / SDC gemeinsam nutzen :

Im SPI-Bus wird jedes Slave-Gerät mit getrennten CS-Signalen ausgewählt, und mehrere Geräte können an einen SPI-Bus angeschlossen werden. Das generische SPI-Slave-Gerät steuert / gibt sein DO-Signal per CS-Signal asynchron frei, um einen SPI-Bus gemeinsam zu nutzen.

MMC / SDC steuert / gibt jedoch das DO-Signal bei der Synchronisierung mit dem SCLK frei. Dies bedeutet, dass die Möglichkeit eines Buskonflikts mit MMC / SDC und anderen SPI-Slaves besteht, die an einen SPI-Bus angeschlossen sind. Das rechte Bild zeigt den Antriebs- / Freigabezeitpunkt der MMC / SDC (das DO-Signal wird auf 1/2 V cm³ gezogen , um den Buszustand anzuzeigen). Daher muss das Master-Gerät ein Byte senden, nachdem das CS-Signal deaktiviert wurde, damit das MMC / SDC-DO-Signal freigegeben wird.

Die SD-Karte und das FPGA haben wahrscheinlich beide versucht, DO zu betreiben, und die SD-Karte ist verloren gegangen, sodass sie zurückgesetzt wurde. Das Senden eines zusätzlichen Bytes scheint das Problem behoben zu haben.

Zuofu
quelle
Auf diese Weise können Sie zwischen dem FPGA und der Karte wechseln, oder? Haben Sie auch festgestellt, dass Sie während der Datenübertragung unterbrechen und fortfahren können? Nach dem, was auf Ulme-Chan steht, scheint das nicht möglich zu sein, aber es würde mich interessieren, ob Sie es bestätigt oder widerlegt haben.
krs013
1
Ja, es funktioniert wie erwartet für den Wechsel zwischen FPGA und SD, aber Sie können die Übertragung zwischen Anrufen an FatFS nicht unterbrechen. Zumindest konnte ich das nicht zum Laufen bringen. Das bedeutet, dass Sie beispielsweise während des Schreibens und Lesens von Dateien von einem Sensor über den gemeinsam genutzten SPI-Bus nicht auf einen Interrupt reagieren können.
Zuofu