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?
Antworten:
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 :
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.
quelle