Fehler beim Schreiben auf SD-Karte via SPI

OP #6605768
Lesenswert?

Hallo zusammen,

beim Zugriff auf eine SD-Karte via Microcontroller (SPI, direkter 
Zugriff auf Blöcke, ohne Filesystem) kommt es bei mir öfter zu 
Schreibfehlern. Das Schreiben dauert dann sehr lange und wenn ich die 
Daten wieder auslese, steht da Murks drin.

Es hat wochenlang ohne Probleme funktioniert. Dann ging es sporadisch 
mal nicht. Inzwischen klappt es gar nicht mehr. Ich hatte angenommen, 
dass die Karte defekt ist, aber wenn ich mit dem PC über einen 
Card-Reader dieselben Blöcke beschreibe oder lese, funktioniert alles. 
Auch das Schreiben mit dem PC und Lesen derselben Daten mit dem 
Microcontroller klappt.

Zusammengefasst:
- Initialisierung funktioniert (zumindest reagiert die Karte immer wie 
erwartet)
- Lesen funktioniert
- Schreiben dauert sehr lange (ca. 170-240 ms pro Block! Als es noch 
funktionierte waren es ca. 3 ms)
- es werden Daten geschrieben, aber völlig andere als die, die ich 
übertrage
- ansonsten sieht es gut aus:
    - das CMD24 wird mit 0x00 beantwortet
    - nach dem Übertragen der Block-Daten an die Karte antwortet sie mit 
0x05 ("data response byte")
    - unmittelbar danach kommt das "busy flag"
    - ein CMD13 im Anschluss wird mit 0x0000 beantwortet


Ich habe zwei kommentierte Saleae-Files angehängt: eins nur mit 
Lesezugriff, eins mit lesen + schreiben. Der Analyzer hing direkt am 
Card-Reader. Ich habe es auch mit unterschiedlichen Card-Readern 
versucht.

Könnt ihr euch dieses Verhalten erklären? Mache ich etwas falsch, so 
dass es mal funktioniert, mal nicht? Und kann es sein, dass es doch an 
der Karte liegt, obwohl über den Zugriff über den PC alles ok ist?
Ich bin etwas verzweifelt und freue mich über eure Tipps.

Viele Grüße,
Dennis
Angehängte Dateien:
#6605974
Lesenswert?

Dennis D. schrieb:
> Und kann es sein, dass es doch an
> der Karte liegt, obwohl über den Zugriff über den PC alles ok ist?

Eher nicht.

> Ich bin etwas verzweifelt und freue mich über eure Tipps.

Wie sieht deine Hardware aus? Alles solide? Gescheite Pegelwandler?
Deine Dateien werden nur sehr Wenige lesen können, welche die passende 
Software haben.

>- Schreiben dauert sehr lange (ca. 170-240 ms pro Block! Als es noch
>funktionierte waren es ca. 3 ms)

Das ist ggf. normal, den je nach Organisation muss die SD-Card den Flash 
vorher sektorweise löschen. Ein direktes Beschreiben von Blöcken ohne 
FAT Filesystem ist eher nicht so empfehlenswert, denn damit kommt 
möglicherweise der optimierte Algorithmus für das wear leveling 
durcheinander. Das könnte die langen Schreibzeiten erklären.

Was soll der direkte Zugriff bringen? Performance? Eher nicht.
Tu dir einen Gefallen, nimm eine der bewährten FAT-Libs und nutze die. 
Die von Elm Chan ist weit verbreitet und seit langer Zeit stabil. Dann 
kannst du auch die Dateien problemlos an jedem PC lesen und schreiben.

http://elm-chan.org/fsw/ff/00index_e.html
OP #6606155
Lesenswert?

Danke für Deine Tipps Falk!

Die Idee hinter dem direkten Block-Zugriff war, den Code schlank und 
simpel zu halten. Wenn der Zugriff via FAT-Filesystem aber sogar 
Vorteile für das Wear-Leveling bringt, versuche ich das.

Ich werde die elm-chan-Lib einbinden und hoffe, dass dann das Problem 
nicht mehr auftritt.
#6607222
Lesenswert?

Dennis D. schrieb:
> Schreiben dauert sehr lange (ca. 170-240 ms pro Block! Als es noch
> funktionierte waren es ca. 3 ms)

Dann wurde nicht korrekt gemessen. Die 240ms sind nix ungewöhnliches - 
wenn man bedenkt das die SD Karte nicht mit 512 Byte sondern mit 1 oder 
4 MB Blöcken intern arbeitet. Überschreitet man eine solche Grenze wird 
der nächste Schreibzugriff langsam.

Die langsamsten Karten hier hatten Schreibzugriffe im Sekundenbereich. 
Und ja, das gäbe die SDHC Spec her. Die besseren Sandisk oder Samsung 
liegen aber im Bereich um ca. 300ms beim "langen" Schreiben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren