Hi
ist auf der Platte überhaupt irgendwas drauf? Wenn nein dann würde ich
die 0x00 als normal ansehen. Ich hab deine Werte mal durch meine
FAT32-Routinen gejagt und komme als Beginn des Datenbereichs (Einen
definierten Root-Bereich wie bei FAT16 gibt es bei FAT32 nicht) auch
auf 0x7D8
Matthias
Hi,
habe die Karte zunächst in FAT32 formatiert und dann ein paar
Quellcodedateien von meinem Programm draufkopiert. Die Karte ist also
nicht leer. In meinem Kartenleser am PC werden die Dateien ganz normal
angezeigt. Allerding ist in den Daten oben auch ein ganz normaler
String enthalten:
"Medienfehler Datenträger entfernen" oder so ungefähr.
Die Formatierung der Karte geht auch innerhalb von Sekunden. Kann es
vielleicht sein, dass ich mir das Ding irgendwie geschossen habe? Mich
wundert es nur, dass die Karte am PC ganz normal am PC gelesen werden
kann und die ersten Sektoren, welche ich mit dem Controller auslese
auch vernünftige Werte aufweisen. Die FAT liegt ja auch an der
richtigen Stelle.
Gruß,
Ralf
Hallo,
ich hatte dieses Problem auch mal gehabt. Ich habe dann einfach die
Cluster vor und hinter dem berechneten Datenbereich angeschaut (sehr
nuetzliches Programm: http://www.sf-soft.de/winhex/index-m.html), und
letztendlich lag der Beginn des Datenbereichs 2 Cluster (1024 bzw.
0x400 Sektoren) weiter vorne.
Ich hatte das nicht weiter verfolgt, auf jeden Fall funktioniert alles
einwandfrei, wenn ich immer 2 Cluster abziehe (unabhaengig von der
verwendeten Festplatte).
root_dir_first_cluster waere in dem fall 0, der erste Sektor folglich
bei 0x3D8.
Wuerde mich interessieren, ob das bei Dir aehnlich ist. Schau Dir ggf.
auch mal die CF-Karte mit einem Diskviewer an. Dann weisst Du
definitiv, wo Deine Daten anfangen.
Entschuldige, die Angabe
"(1024 bzw. 0x400 Sektoren)"
ist natuerlich falsch (dementsprechend die 0x3D8), der Cluster hat
keine 512 Sektoren. Setz statt dessen Deine Clustergroesse ein.
Jens
Hi
@Jens
Ist ja ulkig. Das was du als Fehler betrachtest ist ein Teil der
FAT32-Spezifikation. Cluster 0 des Datenbereichs ist immer der mit
Clusternummer 2. Du mußt also grundsätzlich 2 von der Clusternummer
abziehen um die entsprechende Sektornummer zu berechnen.
Der passende Startsektor eines Clusters berechnet sich demnach nach:
fat_data_start + ((cluster - 2) * fat_clustersize);
@Ralf
Laß dir einfach mal sequenziell alle Sektoren ausgeben. Irgendwann
müssen deine Daten ja mal kommen.
Matthias
@Jens:
Danke für den Link! Jetzt weiß ich, wo mein Verzeichnis liegt! Es liegt
auf Sektor 1976 = 0x07B8. Ich hatte allerdings 7D8 ausgerechnet, also
genau 0x20 zu viel. Das ist aber genau der Offset, der durch die Volume
ID entsteht. Ist dann meine Formel falsch? Oder wo liegt mein
Vertsändnisproblem?
Leider kann ich es jetzt nich gleich testen, da ich mir gerade noch
meine Schaltung geschossen habe :-((.
@Mathias:
Du hattest doch auch 0x7D8 berechnet. Gibt es vielleicht noch weitere
kleinigkeiten, worauf ich achten muß?
Also dann,
Viele Grüße,
ralf
Ist ja ulkig, dass ich die FAT32-Spezifikationen nicht im Kopf habe...
Im Uebrigen habe ich das nicht als Fehler der Spezifikation betrachtet,
so vermessen bin ich nicht. Der Fehler lag in meiner Berechnung, aber
das Phaenomen war letztendlich dasselbe.
Hi
ich hab eben nochmal in meine Sourcen geschaut. Ich berechne den
Datenstart wie folgt:
fat_data_start = par_begin + fat_res_sectors + fat_length*num_fat;
Das hat bisher eigentlich sehr zuverlässig funktioniert.
Matthias
Hi,
ich glaube der Fehler mit den fehlenden 0x20 lag daran, dass ich die
Software Winhex zunächst falsch verstanden habe. Das Programm fängt bei
der Volume ID an zu zählen und nicht beim Bootsektor. (Wenn man sich
mal blöd anstellt)
Ich habe im Moment die Vermutung, dass nur mein unterstes Byte der
LBA-Adresse richtig gesetzt wird und ich vielleicht bei den oberen
Bytes etwas vertauscht habe. Ich werde also mal die Reihenfolge testen,
wie ich die Register beschreibe. Kann es vielleicht sein, dass man den
LBA-Modus als erstes setzen muß, bevor man die LBA-Adresse schreibt?
Bei mir ist es so, dass ich zuerst Cyl high/low, dann das Drive Head
mit LBA Bit und zuletzt das Sektor No. Register beschreibe. Das würde
für meinen Fehler sprechen. Ich werde heute Abend also mal versuchen,
zuerst das LBA-Bit zu setzen und dann den Rest zu erledigen.
Ralf