In meiner Initialisierung der FAT auf einer microSD steht u. a. folgende
Funktion, die das Dateisystem auf der Karte prüft. In den 5 Bytes ab
0x54 muss ja in meinem Fall "FAT16" stehen (bei Wikipedia steht zwar,
dass es ab 0x52 ist:
http://de.wikipedia.org/wiki/File_Allocation_Table#Bootsektor - aber es
hat bis heute immer funktioniert).
Heute morgen hab ich seit etwa einem Vierteljahr mal wieder meine
microSD formatiert (als FAT), und jetzt steht das nicht mehr an dieser
Stelle. Zumindest bekomm von der Funktion immer UNKNOWN zurück.
Mit dem Hex-Editor finde ich ab 0x36 (physikalisch als auch logisch) die
Zeichenfolge "FAT16".
Woran kann das liegen? Da wird sich doch in 3 Monaten nichts am
Formatierungsstandard geändert haben?
EDIT: Ich lese gerade auf WIKI, dass bei FAT12 und FAT16 die Variante
wie bei mir im Hex-Editor ab 0x36 steht. Warum hat es aber bisher immer
mit 0x54 geklappt??
Schudi schrieb:> Dez. 54 = Hex 0x36> Dez. mit Hex vertauscht?
Ok, das stimmt! Dann steht das FAT16 an der richtigen Stelle auf der
Speicherkarte. Formatierung stimmt also. Dann muss es wohl am
µC-Programm liegen. Das sind mir die liebsten Fehler, die einfach so
kommen, ohne dass der Sourcecode geändert wurde...wie gesagt, hat es ja
bis zum Formatieren heute morgen geklappt.
Thomas O. schrieb:> ja ja mein Vater behauptet auch immer er hätte am PC nichts gemacht,> nach dem jede Option ausprobiert wurde ;-)
Ich bin nicht aus der Generation deines Vaters :-) Das Programm lief
einwandfrei. Jetzt war ich 3 Monate weg, habe heute Morgen die microSD
neu formatiert, und es läuft nicht mehr. Andere "Optionen" gab es nicht.
Markus schrieb:> @Mark>> Was macht du, wenn du den Eintrag 'FAT16' in buf[54] bis buf[58] nicht> vorfindest?
Weiß jetzt nicht genau, auf was du anspielen möchtest. Hab jedenfalls im
Debugger gesehen, dass in buf[54] bis buf[58] irgendwas wirres
drinsteht. Das liegt daran, dass
1
readSector(0,buf)
nicht richtig arbeitet. Im Detail ist es das hier:
Ich sehe im Debugger, dass die Card-Response 0xFE nicht kommt bzw. der
entsprechende if-Zweig übersprungen wird, sodass nichts in buf
eingelesen wird.
Habe es aber mit zwei verschiedenen microSDs versucht...selbes Problem.
Hatte mal das Problem, dass die 5v->3V Wandlung durch Spannungsteiler zu
hochohmig war. Zuerst gings. Nach Tagen dann nimmer. War grenzwertig.
Hab den Spannungsteiler dann niederohmiger gemacht. Danach hatte ich nie
mehr Probleme.
Es ist nicht erlaubt den FAT-Typ so zu bestimmen wie du es machst, darum
funktioniert es auch nicht (immer).
Laut MS-Whitepaper geht das so:
is determined by the count of clusters on the volume and nothing else.
If(BPB_FATSz16 != 0)
FATSz = BPB_FATSz16;
Else
FATSz = BPB_FATSz32;
If(BPB_TotSec16 != 0)
TotSec = BPB_TotSec16;
Else
TotSec = BPB_TotSec32;
DataSec = TotSec – (BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) +
RootDirSectors);
Now we determine the count of clusters:
CountofClusters = DataSec / BPB_SecPerClus;
Please note that this computation rounds down.
Now we can determine the FAT type. Please note carefully or you will
commit an off-by-one error!
In the following example, when it says <, it does not mean <=. Note also
that the numbers are correct. The first number for FAT12 is 4085; the
second number for FAT16 is 65525. These numbers and the ‘<’ signs are
not wrong.
If(CountofClusters < 4085) {
/* Volume is FAT12 */
} else if(CountofClusters < 65525) {
/* Volume is FAT16 */
} else {
/* Volume is FAT32 */
Ok, ein Neustart des Compilers hat jetzt zumindest bei einer Karte
geholfen. Die zweite geht aber immernoch nicht. Vielleicht sind ja auch
die Spannungspegel ein Problem bei manchen Karten.
@Hubu: Ich hatte vorher mal die FATxx-Identifikation auskommentiert,
weil ich wusste, dass es ohnehin FAT16 ist. Dann hat aber garnichts mehr
funktioniert. Ich denke aber, dass das Problem nicht allein am Speicher,
sondern eben am Compiler lag. Der macht manchmal komische Sachen.
Außerdem habe ich die Fatlib nicht selbst geschrieben. Wobei es Sinn
macht, dass das System nicht nur allein durch diese 3 Buchstaben und 2
Ziffern irgendwo am Anfang des Mediums bestimmt wird. Da muss ja nur mal
ein Bit kippen oder so und alles ist im Eimer.
Vielleicht hängt es mit einer Einstellung in Deinem Compiler zusammen,
dass er Zahlen ausschliesslich in Dez. oder Hex. interpretiert, wenn sie
keine explizite Kennzeichnung haben und so eine Fehlinterpretation
entsteht?
Schudi schrieb:> Vielleicht hängt es mit einer Einstellung in Deinem Compiler zusammen,> dass er Zahlen ausschliesslich in Dez. oder Hex. interpretiert, wenn sie> keine explizite Kennzeichnung haben und so eine Fehlinterpretation> entsteht?
Kann ich mir nicht vorstellen, da es mit der einen Speicherkarte
funktioniert, mit der anderen aber nicht.
Wenn die eine Speicherkarte funktioniert und die andere nicht kann ich
mir auch gut vorstellen dass es ein Timing-Problem ist. Erhöh mal
probeweise die delays auf der SPI-Schnittstelle.
Mark M. schrieb:> Kann ich mir nicht vorstellen, da es mit der einen Speicherkarte> funktioniert, mit der anderen aber nicht.
Ist denn eine vielleicht größer als die andere und wird daher in
einem anderen Format initialisiert? Wenn du das Initialisieren
unter Windows machst, dann läuft das doch alles nach dem Motto:
"Wir machen das hier schon richtig, Sie müssen nicht genau wissen,
was wir wirklich tun."
Jörg Wunsch schrieb:> Ist denn eine vielleicht größer als die andere und wird daher in> einem anderen Format initialisiert? Wenn du das Initialisieren> unter Windows machst, dann läuft das doch alles nach dem Motto:> "Wir machen das hier schon richtig, Sie müssen nicht genau wissen,> was wir wirklich tun."
Es sind schon beide "gleich groß", also offiziell jeweils 2GB. Das ganze
Programm läuft auf einem MSP430, also nichts mit Windows. Auf Windows
formatiere ich die Karte nur in FAT.
Mark M. schrieb:> Auf Windows> formatiere ich die Karte nur in FAT.
Ja, eben, und an dieser Stelle wird ja die Struktur festgelegt, die
auf der Karte steht.
Wenn sie gleich groß sind, ist es natürlich nicht wirklich
verständlich, warum die Struktur von heute auf morgen anders
geschrieben wird. Andererseits, solange es in der (von MS festgelegten)
Spec für ein FAT-Filesystem liegt, kann und muss es dir egal sein.
Könnte es an der Clustergröße liegen?
Beim "normalen" formatieren in Windows (GUI) kann man ja die
Clustergröße nicht festlegen (macht es glaub ich automatisch).
Unter der Kommandozeile geht das z.B. so:
format [Laufwerk:] /FS:FAT /A:512
Grüße