www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FAT16: Ende des Datenträgers finden


Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe eine SD-Karte via SPI an einen AT91SAM7 angebunden und benutze 
das FAT File System Module von http://elm-chan.org .
Alle R/W-Operationen funkionieren bis jetzt einwandfrei, allerdings gibt 
es ein Problem, das Ende des Datenträgers zu finden.
512MB SD-Karte --> Schreibtest (file öffenen; blockweise schreiben, bis 
der Datenträger voll ist; file schliessen)
Beim Auslesen der Karte mit dem Cardreader hat das File zwar die 
richtige Größe und laut Datenträgereigenschaften ist die Karte auch 
randvoll, allerdings ist das file selber leer --> Der 512B String der 
sich wiederholen sollte ist nicht drin.
Getestet hab ichs bisher in 10MB Abständen und bisher hat alles 
wunderbar geklappt.

Wie stelle ich sicher, dass das Ende des Datenträgers gefunden und der 
Schreibvorgang rechtzeitig abgebrochen wird?

Schonmal danke für eure Hilfe,

LG Klaus

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Anzahl des Sektoren kann man doch auslesen. Schau dir mal die 
Spezifikationen der FAT an.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, schon aber die Anzahl der Sektoren != Anzahl der beschreibbaren 
Sektoren. Und beide Zahlen ändern sich, sobald man eine andere Karte 
nimmt.

Mich würde interessieren wie ich die Anzahl der Sektoren die ich 
schreiben darf herausfinde, bevor ich das FS zerstöre.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst auch die Anzahl der FAT und Boot-Sektoren auslesen, und von 
der Gesamtanzahl abziehen. Schau dir mal die Spezifikationen der FAT an.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RTFM !
f_getfree()

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normalerweise sollte dir f_write() ein FR_RW_ERROR
zurückgeben wenn keine Cluster mehr frei sind.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau das ist der Punkt. Tut es leider nicht. Irgendwann sendet die 
Karte keine Response mehr und der Schreibvorgang wird abgebrochen --> 
Ich schreibe nur Blockweise. Multiple Blocks sind für meine Anwendung 
nicht notwendig. f_getfree() tuts aber bis jetzt ganz gut. Habs jetzt 
mit 3 verschieden großen Karten getestet und es funzt.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wahrscheinlich ist das hier in f_write() falsch:

> if (clust == 0) break;  >/* Disk full */
> if (clust == 1 || clust >= fs->max_clust) goto fw_error;

Das break bei Disk full sollte wohl besser auch ein
goto fw_error; werden. Sonst wird f_write() ohne Fehlerflag
und Fehlermeldung verlassen.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das werd ich auf jeden Fall auch mal ausprobieren, danke!

Autor: Stefan Wimmer (wswbln)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...und elm-chan reporten, wenn's erfolgreich war? ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.