Forum: Mikrocontroller und Digitale Elektronik Schreiben auf SD-Karte über SPI funktioniert nicht


von Andy (Gast)


Lesenswert?

Hallo zusammen,

ich habe mich jetzt ca. eine Woche sehr intensiv mit der Thematik Chans 
FatFs im Zusammenhang mit dem STM32 und SPI auseinander gesetzt.
Mit Hilfe der Bibliotheken von Martin Thomas und einigen anderen 
Codeschnipseln ist es mir nun gelungen, auf eine FAT32 formatierte Karte 
über SPI zuzugreifen.(vielen Dank schon mal für die hilfreichen Beiträge 
hier im Forum) Es ist mir möglich Ordner und Dateien anzulegen und diese 
auszulesen.

Was allerdings nicht funktioniert, ist das Schreiben in eine Datei. Beim 
Debuggen konnte ich feststellen, dass der Fehler: FR_INT_ERR von der 
Funktion remove_chain ausgegeben wird. Ich habe nun schon viele Sachen 
ausprobiert, aber nichts konnte den Fehler beseitigen.

Hatte jemand dieses Problem schon mal bzw. hat Tipps, was ich noch 
untersuchen könnte?

von c-hater (Gast)


Lesenswert?

Andy schrieb:

> Was allerdings nicht funktioniert, ist das Schreiben in eine Datei. Beim
> Debuggen konnte ich feststellen, dass der Fehler: FR_INT_ERR von der
> Funktion remove_chain ausgegeben wird.

Da wäre mal interessant zu wissen, was FR_INT_ERR eigentlich bedeuten 
soll.

Aber abgesehen davon kommt mir eine Funktion namens "remove_chain" beim 
Schreiben in eine Datei einigermaßen deplaziert vor, denn dabei wird 
eigentlich niemals irgendeine Kette entfernt. Das passiert normalerweise 
nur beim Löschen oder Abschneiden einer Datei.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Testweise zuerst
- die SPI-Frequenz verringern
- die SD-Karte neue formatieren
- DMA-Unterstützung deaktivieren (falls es noch der vor mir verbrochene 
Low-Level-Code ist, gibt es dafür ein define)
Wenn weiterhin Probleme bestehen, mit Hilfe des Debuggers die 
low-level-Funktion write_block untersuchen (wenn richtig erinnert in 
sd_spi_stm32.c). Chans FAT-Code ist eigentlich recht ordentlich, Fehler 
sind meistens eine Ebene darunter zu suchen.

von Andy (Gast)


Angehängte Dateien:

Lesenswert?

Danke schon mal für die Hinweise.
@Martin
- mit der SPI-Frequenz war ne gute Idee, hat aber nichts geändert, war 
sogar runter bis auf 200kHz
- SD-Karten hab ich schon verschiedene ausprobiert und auch mehrfach neu 
formatiert mit FAT16/FAT32, zeigen aber alle das gleiche Verhalten
- ich hab nur Teile deines Codes ohne DMA verwendet

Ich habe die LowLevel-Datei jetzt nochmal mit angehängt, vielleicht 
fällt jemandem dort ja etwas auf.

Außerdem habe ich noch ein komisches Verhalten festgestellt, wenn ich 
Schritt für Schritt debugge, dann springt er nicht mit einem Fehler aus 
der Cluster-Funktion, sondern sucht den richtigen Cluster raus und die 
f_write-Funktion gibt die korrekte Anzahl geschriebener Bytes aus. 
Allerdings wird auch dann nichts auf die Karte geschrieben, sondern es 
wird lediglich angezeigt.

von Andy (Gast)


Lesenswert?

Achso, mir fällt noch ein, dass ich die disk_timerproc-funktion 
weggelassen habe, weil ich die nicht richtig verstanden habe. Könnte das 
auch einen Einfluss haben?

von Andy (Gast)


Lesenswert?

Lösung gefunden!
Für alle Leute die auf ein ähnliches Problem stoßen, hier meine Lösung.
Es lag bei mir daran, dass die wait_ready Funktion scheinbar nicht lange 
genug gewartet hat. Nachdem ich den dortigen Timer wesentlich erhöht 
habe, funktioniert der Schreibvorgang einwandfrei. Außerdem muss man 
unbedingt darauf achten, dass man nach dem Schreiben f_close ausführt.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Oder nen flush auslöst solange das geschriebene noch innerhalb der 
Sektorengrenze ist.

von gustle (Gast)


Lesenswert?

Wenn ich mich recht erinnere ist in der ffconfig.h ein  define 0, 1, 2 
drin welches du einstellen kannst
Ob nur gelesen wird oder auch geschrieben wird

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.