Forum: Mikrocontroller und Digitale Elektronik AVR FAT32 0.6.4


von Alex (Gast)


Lesenswert?

Hallo,

ich versuche eine (bei mir) funktionierende Library zur Verwendung einer 
32GB microSD-Karte zu finden.
Über die Bib von Roland Riegel 
(http://www.roland-riegel.de/sd-reader/index.html), welche bei mir 
leider nicht funktioniert hat, bin ich bei der AVR FAT32 Version 0.6.4 
gelandet (http://www.mikrocontroller.net/articles/AVR_FAT32).

Das Beispielprogramm aus der main_simple.c funktioniert, was mich schon 
sehr euphorisch gestimmt hat. Allerdings traten/treten nun Effekte auf, 
die ich mir nicht erklären kann. Vielleicht hat hier jemand Erfahrung 
und kann mir weiterhelfen.

Folgende Probleme.
1. Wenn ich eine Datei TEST1.TXT erstelle und beschreibe und mir das 
Ergebnis unter Windows mit dem Texteditor anschaue sieht alles wunderbar 
aus.
Codeauszug:
1
uint8_t test1_file[12]   = "TEST1.TXT";
2
uint8_t data1 [15] = "00000000000090";
3
data1[14] = '\0';
4
uint8_t *ptr_write_buffer1 = data1;
5
6
status = ffopen(test1_file, 'c');
7
ffwrites(ptr_write_buffer1);
8
ffwrite(0x0D);    // line feed
9
ffwrite(0x0A);    // carriage return
10
ffclose();
Wenn ich allerdings die Datei TEST1.TXT bereits unter Windows anlege und 
diese nur durch den µC mit dem Text beschreiben möchte, wird der Text 
zwar geschrieben (kann mir das über die read-Funktion per Uart 
ausgeben), allerdings kann ich die Datei danach unter Windows nicht mehr 
öffenen.
Fehlermeldung: "Die Datei Y:\TEST1.TXT kann nicht geöffnet werden. 
Stellen Sie sicher, dass sich ein Datenträger im angegebenen Laufwerk 
befindet."

Warum auch immer scheint es nur zu funktionieren, wenn die Dateien durch 
den µC angelegt werden. Hatte jemand dieses Problem schonmal?

2. Aufbauend auf obigem Problem trat anschließend noch der Effekt auf, 
dass beim Erstellen und Beschreiben mehrere Dateien durch den µC (z.B. 
TEST1.TXT beschrieben mit "01", TEST2.TXT mit "02", TEST3.TXT mit "03") 
in allen Dateien "03" stand. Also immer das, was als letztes in 
irgendeine Datei geschrieben wurde, stand nach Sichtung unter Windows 
immer in allen Dateien, welche im Programmdurchlauf des µC eine 
Schreibfunktion erlitten.
Das ganze ging nach zwei/drei mal Testen soweit dass die Karte (plus 
Weitere) unter Windows gar nicht mehr erkannt wurden.
Dank meines Beaglebone konnte ich die Karten wieder formatieren, sodass 
diese wieder von Windows erkannt werden. Der Code funktionierte danach 
komischerweise wieder wie gewollt, also jede Datei wies ihren Text auf.

Können die genannten Probleme damit zusammenhängen, dass ich keine SPI 
bzw. SD-Card disable-Funktion habe? Bisher ziehe ich die Karte entweder 
unter "Last" raus oder ziehe das Stromkabel vom Board ab und ziehe dann 
die Karte raus. Beides führt irgendwann mal unter Windows zur 
Fehlermeldung:
"Möchten Sie (Y:) Wechseldatenträger überprüfen und reparieren? Es 
besteht eventuell ein Problem mit einigen Dateien..."

Eigentlich möchte ich "nur" direkt im root-Verzeichnis ca. 10 Textfiles 
haben, welche ich über Wochen hinweg robust(!) beschreiben und danach 
unter Windows ohne Fehlermeldungen wieder auslesen möchte.
So wie es sich jetzt verhält ist das ganze leider eher Glückssache...


Gruß
Alex

von Luminus (Gast)


Lesenswert?

Wird das Dateisystem ordentlich geschlossen?

Wenn im Zweifel: Vor und nach dem Beschreiben der SD-Card den Befehl 
chkdsk Lw: in der DOS-Box aufrufen (Lw ist der Buchstabe des Laufwerks).

von Alex (Gast)


Lesenswert?

@Luminus
Ich gehe mal davon aus, dass das Dateisystem auf Windows richtig 
geschlossen wird, wenn ich die SD-Karte ordentlich auswerfe. Zumindest 
kommt der Fehler nicht, wenn ich die Karte gleich erneut in den PC 
stecke. Das Verhalten tritt wie beschrieben nur dann auf, wenn die Karte 
durch den µC beschrieben wurde. Hier habe ich keine CMD-Zeile zum 
ausführen von chkdsk...

von Luminus (Gast)


Lesenswert?

> Das Verhalten tritt wie beschrieben nur dann auf, wenn die Karte
> durch den µC beschrieben wurde.

Mir ging es um den Vergleich vorher und nachher.


> Hier habe ich keine CMD-Zeile zum  ausführen von chkdsk...


Sollte unter jedem Windows-System gehen.

Start drücken, RUN drücken, cmd.exe eingeben, chkdsk Lw: eingeben.

von Jim M. (turboj)


Lesenswert?

Alex schrieb:
> Können die genannten Probleme damit zusammenhängen, dass ich keine SPI
> bzw. SD-Card disable-Funktion habe? Bisher ziehe ich die Karte entweder
> unter "Last" raus oder ziehe das Stromkabel vom Board ab und ziehe dann
> die Karte raus. Beides führt irgendwann mal unter Windows zur
> Fehlermeldung:
> "Möchten Sie (Y:) Wechseldatenträger überprüfen und reparieren? Es
> besteht eventuell ein Problem mit einigen Dateien..."

SD Karten mögen es nicht wenn beim Schreiben der Strom ausfällt...

Windows zeigt Dir hier aber nur eine Inkonsitenz beim Dateisystem an, 
die beim plötzlichen Abstecken durchaus entstehen kann. Ein FAT 
Dateisystem ist nur dann in sich konsistent wenn keine Dateien zum 
Schreiben offen sind. Leider vertragen SD Karen auch nur begrenz 
Schreibzyklen, weswegen man die Dateien nicht sofort nach jedem 
Schreiben schließen sollte.

Viele µC Implementationen ignorieren die 2. FAT komplett. Das fällt 
Windows dann schnell auf.

von Peter II (Gast)


Lesenswert?

Jim M. schrieb:
> Ein FAT
> Dateisystem ist nur dann in sich konsistent wenn keine Dateien zum
> Schreiben offen sind.

nein. Aus Sicht vom Dateisystem gibt es keine offenen Dateien! Wenn nach 
dem schreiben in einer Datei auch die Meta-Daten  (Größe + FAT) 
aktualisiert gibt es gar kein Problem.

von Alex (Gast)


Lesenswert?

@Luminus, da haben wir wohl aneinander vorbeigeredet, ich dachte du 
wolltest das ich chkdsk auf dem µC ausführe...

1. Testphase
Also, wenn ich unter Win zwei Dateien ohne Inhalt auf der SD-Karte 
erstelle und chkdsk ausführe zeigt er mir das an:

C:\Users\Wilke>chkdsk Y:\
Der Typ des Dateisystems ist FAT32.
Volumeseriennummer : C515-4CE0
Dateien und Ordner werden überprüft...
Die Datei- und Ordnerüberprüfung ist abgeschlossen.
Das Dateisystem wurde überprüft. Es wurden keine Probleme festgestellt.
   31.150.704 KB Speicherplatz auf dem Datenträger insgesamt
            0 KB in 2 Dateien
   31.150.688 KB sind verfügbar

       16.384 Bytes in jeder Zuordnungseinheit
    1.946.919 Zuordnungseinheiten auf dem Datenträger insgesamt
    1.946.918 Zuordnungseinheiten auf dem Datenträger verfügbar

Wenn ich die SD-Karte durch den µC beschreiben lasse funktioniert (es 
jetzt) erst nach doppeltem Reset. Nach dem ersten Reset bleibt er 
offenbar beim 1. Schreibprozess hängen (zumindest bekomme ich die 
nachfolgende UART-Ausgabe nicht). Nach dem 2. Reset läuft es durch und 
ich bekomme unter Windows das:

C:\Users\Alex>chkdsk Y:\
Der Typ des Dateisystems ist FAT32.
Volumeseriennummer : C515-4CE0
Windows hat auf dem Datenträger Fehler gefunden, wird diese aber nicht 
reparieren, weil der Parameter /F nicht angegeben wurde.
Der angegebene Datenträger scheint kein Windows XP-Datenträger zu sein.
FAT-Medientyp wird aktualisiert.
Dateien und Ordner werden überprüft...
Der Eintrag \00000000.000 enthält eine fehlerhafte Verknüpfung.
Die Datei- und Ordnerüberprüfung ist abgeschlossen.
Windows hat Probleme im Dateisystem festgestellt.
Führen Sie CHKDSK mit der Option /F (Fehlerbehebung) aus, um die 
Probleme zu beheben.
   31.150.704 KB Speicherplatz auf dem Datenträger insgesamt
           32 KB in 2 Dateien
   31.150.656 KB sind verfügbar

       16.384 Bytes in jeder Zuordnungseinheit
    1.946.919 Zuordnungseinheiten auf dem Datenträger insgesamt
    1.946.916 Zuordnungseinheiten auf dem Datenträger verfügbar

Wie zu erkennen habe ich jetzt einen zusätzlichen Ordner mit Namen 
"00000000.000" ohne Inhalt. Der Text wurde allerdings richtig in die 
.TXT-Files geschrieben und diese lassen sich ganz normal öffnen.

2. Testphase.
Das Aufspielen meines (im 1. Beitrag) aufgeführten Codes funktioniert 
immer noch. Nach dem Aufspielen des Codes zum Beschreiben von zwei 
Dateien wird jetzt (warum auch immer) das Programm zwar komplett 
durchlaufen, allerdings wohl nichts mehr geschrieben. Lesen kann ich die 
SD-Karte sowie drei weitere allerdings nun wiedermal auch nicht mehr 
unter Windows...

Auch dieses Feature wird seinen Einsatzzweck finden! Allerdings ist dies 
ein Fall für die Marketingabteilung. Sowas hätte man studieren müssen, 
dann wäre ich etliche graue Haare ärmer...



@Jim Meba: Normalerweise lasse ich mir per UART eine Meldung ausgeben 
wenn eine Datei beschrieben wurde und ziehe erst danach den Saft ab. 
Sollte das genügen? Bisher war es jedenfalls nicht zielführend.

@ Peter II:
Ob die Meta-Daten richtig geschrieben werden kann ich (auf die Schnelle) 
nicht sagen. Meine Intention ist es ja durch die Library-Funktionen 
nicht bis aufs Bit abtauchen zu müssen...


Könnten noch Probleme entstehen, da ich bisher rein die Signale DO und 
SCK über Pullups an 3.3 V hängen habe?

von Jim M. (turboj)


Lesenswert?

Peter II schrieb:
> nein. Aus Sicht vom Dateisystem gibt es keine offenen Dateien! Wenn nach
> dem schreiben in einer Datei auch die Meta-Daten  (Größe + FAT)
> aktualisiert gibt es gar kein Problem.

Genau das passiert nur beim fclose(). Der fwrite() call akutalisiert 
den Verzeichniseintrag normalwerweise nicht. Daher ergibt sich beim 
Schreiben (append) eine Situation, wo die Dateilänge laut 
Verzeichniseintrag nicht mit der Anzahl der Cluster in der FAT 
übereinstimmt - bis fclose() das Verzeichnis aktualisiert.

Das will man auf SD Karten aber keinesfalls nach jedem einzelnen 
Schreibvorgang machen, da würden die in kurzer Zeit durch die 
zusätzlichen Schreib/Lösch Zyklen kaputt gehen.

von Alex (Gast)


Lesenswert?

Hallo,

mein "Nichtaufgebengewissen" hat mich geplagt und ich konnte doch noch 
etwas herausfinden.
Die Fehlermeldung: "Die Datei Y:\TEST1.TXT kann nicht geöffnet werden.
Stellen Sie sicher, dass sich ein Datenträger im angegebenen Laufwerk
befindet." tritt nur dann auf, wenn die unter Windows erstelle Datei 
leer ist. Steht etwas drinnen, was überschrieben oder woran angfügt 
wird, dann funktioniert das spätere Lesen am PC wieder.
Werde also ein paar 0en reinschreiben welche dann im Verlauf des 
Projektes überschrieben werden.
Der Effekt mit dem zusätzlichen Ordner trat heute übrigens nicht mehr 
auf...

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.