Forum: Projekte & Code FAT16


von Vorname N. (zoltan)


Angehängte Dateien:

Lesenswert?

Hallo,

im Anhang befindet sich meine FAT16 library, mit dem ich eine MMC-Card
lesen und beschreiben kann(MMClib, UARTlib usw stammen von Pascal
Stang, sind jedoch an manchen Stellen leicht modifiziert).

Es ist möglich ein Verzeichnis mit Dateinamen(z.B.: "A/LangerName/A
He/test.hex") als string der FAT16_Search() Funktion zu übergeben.
Diese Funktion durchsucht die MMC. Falls die Datei vorhanden ist, kann
man antweder die alten Daten überschreiben oder die neuen Daten am Ende
der Datei anfügen. Falls die Datei nicht forhanden ist, wird eine
Meldung ausgegeben (TODO: es wird diese Datei erzeugt). Vor dem
power-off der MMC Karte (oder auch ab und zu möglich) muss die
FAT16_Finish_Data() Funktion aufgerufen werden, um die Datengröße auf
der MMC zu sichern.

Mit einem Terminalprogramm( z.B.:
http://hp.vector.co.jp/authors/VA002416/teraterm.html) ist eine
ausführliche debugging der FAT16 Aktivitäten des µC möglich. Diese
debugging Informationen erhöhen die Kodegrösse von 11510 auf 15128 byte
(siehe fatconf.h ~> #define DEBUG_FAT).

Bsp.:

cmd> i

Resetting MMC/SD Card
MMC_GO_IDLE_STATE: R1=0x01
MMC_SEND_OP_COND: R1=0x01
MMC_SEND_OP_COND: R1=0x00
MMC_CRC_ON_OFF: R1=0x00
MMC_SET_BLOCKLEN: R1=0x00

OEM Name        : MSDOS5.0
Bytes Per Sector:    512
Sector Per Clust:      4
Reserved SecCnt :      6
Number Of FAT   :      2
Root Dir Entries:    512
Total Sector 16 :      0
Media           : Found: Hard disk. DOS version 2.0
Total Sector 32 : 250880
Sector Per FAT  :    245
Volume Label    : NO NAME
Filesystem Type : FAT16

RootDirectoryRegionStart:    496
DataRegionStart         :    528
FATRegionSize           :    490
RootDirectoryRegionSize :     32
DataRegionSize          : 250352

cmd> b
Searching for >testdokument.hex
(CONTINUE)
31.07.2005    15:48       4800 testdokument.hex

Data starts at FAT address  :     12
Sector containing file info :    500
Data starts in sector       :    568
FileSize [uint8_t]          :   4800

----- Read file content-----
Current cluster:     12 Current sector:          0
Next cluster   :     13 Next sector   :        568

Sector   :    568
Next FAT :     13
     00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  0123456789ABCDEF
     -----------------------------------------------  ---- ASCII -----
0000 00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00  ................
0010 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00  ................
0020 08 00 00 00 09 00 00 00 0A 00 00 00...........

... gibt den kompletten Datenihalt aus ...

.......... 00 00 99 00 00 00 9A 00 00 00 9B 00 00 00  ˜...™...š...›...
01F0 9C 00 00 00 9D 00 00 00 9E 00 00 00 9F 00 00 00  œ......ž...Ÿ...

----- Searching end of file -----

Data ends in FAT address:     14
Data ends in sector     :    577
FileSize                :   4800
Loading last sector of file ->
     00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  0123456789ABCDEF
     -----------------------------------------------  ---- ASCII -----
0000 60 01 00 00 61 01 00 00 62 01 00 00 63 01 00 00  `...a...b...c...
0010 64 01 00 00 65 01 00 00 66 01 00 00 67 01 00 00  d...e...f...g...
0020 68 01 00 00 69 01 00 00 6A 01 00 00 6B 01 00 00  h...i...j...k...
...



Getestet habe ich das Progamm bis jetzt auf einer Atmega128(mit 8Mhz)
mit einer 128MB MMC Karte(formattiert als superfloppy). Da zwei 512
byte grosse Buffer für die Daten und die FAT verwendet werden ist
mindestens eine ATMEGA32 zum Ausführen des Programms nötig.

Gruss
Zoltan

von marcelKo (Gast)


Lesenswert?

hi,
ich hab auch die lib vom Pascal verwendet, aber muste die ein bischen
ändern, damit die einwandfrei funktioniert.
die SPI geht da nur im interrupt mode.
ich hab aber herausgefunden, das die viel schneller läuft, wenn man
ohne interrupt arbeitet.
damit es ohne unterrupt geht muss man schreiben
SPDR = data;
while(!((SPSR) & (1<<SPIF)));

und in dem original code fehlt das ! und die daten müssen zwingend von
dem warten in SPDR geschrieben werden.
bei dem MMC code fehlt zb nach dem CS high setzten ein sendbyte, damit
das sicher funktioniert.
grüsse

von Vorname N. (zoltan)


Lesenswert?

Die Interrupts habe ich auch ausgeschaltet. Und Du hast Recht, mit den
Ausrufezeichen funktioniert die SPI Library nicht. Ich habe in meiner
Kode nur die "!" entfernt, da jedoch in der spiTransferByte()
Funktion eine zweite Warteschleife korrekt auf die "SPDR = data;"
Zuweisung folgt hat die SPI trotzdem funktioniert. Ich werde die Lib
dennoch korrigieren. Danke für den Tipp!

von Thomas (Gast)


Lesenswert?

Hallo Zoltan,

deine Lib hat mich dazu bewegt, endlich eine MEGA128 Platine zu ätzen
und mir einen Datenlogger zu basteln. Die benötigten Teile müsste
eigentlich nächste Woche kommen. Könntest du evtl. den aktualisierten
Code hier veröffentlichen - dann könnte ich nämlich eine Fehlerqelle
schon im Voraus ausschalten.
Vielen Dank für Deine Mühe.

Thomas

von Vorname N. (zoltan)


Angehängte Dateien:

Lesenswert?

Hi Thomas,

es hat sich nur die spi.c geändert. Falls die beim Testen bugs
begegnen, kannst du sie dann bitte hier posten?

Gruss,
Zoltan

von Thomas (Gast)


Lesenswert?

Werde ich selbstverständlich machen - vielen Dank!!!

Gruß, Thomas

von pittbull (Gast)


Lesenswert?

hallöchen,
wen's interessiert: ein weiteres FAT16 findet ihr hier:
http://alumnus.caltech.edu/~pje/rdcf2.txt

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.