Forum: Mikrocontroller und Digitale Elektronik Fehler beim Schreiben auf SD-Karte via SPI


von Dennis D. (schwebo)


Angehängte Dateien:

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

von Falk B. (falk)


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

von Dennis D. (schwebo)


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.

von Jim M. (turboj)


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.

von Stefan F. (Gast)


Lesenswert?

Ich habe auch Zugriffszeiten im Bereich von 100 bis 300ms. Das ist 
normal.

von Falk B. (falk)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich habe auch Zugriffszeiten im Bereich von 100 bis 300ms. Das ist
> normal.

Du hast vor allem mal wieder keine Ahnung, wie man technische 
Sachverhalte gescheit kommuniziert. Der Begriff "Zugriffszeit" sagt 
alles und nichts! Jim M. hat es korrekt formuliert!

von Stefan F. (Gast)


Lesenswert?

Danke Falk, mit deiner gewählten Ausdrucksweise machst du dich sehr 
beliebt.

von Falk B. (falk)


Lesenswert?

Stefan ⛄ F. schrieb:
> Danke Falk, mit deiner gewählten Ausdrucksweise machst du dich sehr
> beliebt.

Wahre Worte sind nicht schön, schöne Worte sind nicht wahr.

Laotse

Vielleicht versuchst du es mal mit der Hälfte der Antworten pro Tag? 
Dann hast du doppelt soviel Zeit über diese und deren Formulierungen 
nachzudenken.

von ACDC (Gast)


Lesenswert?

es fehlen 100nF und 10uF an der SD Karte.

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.