PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sd-karte dateizugriff und große dateien



Roboman93
25.03.2009, 17:42
ich bin dabei, meinen avr-webserver zu programmieren. wenn ich nun zb ein bild oder eine andere große datei senden will, kann ich ja wohl kaum alle daten der datei in eine array packen und versenden. gibt es gute libs für den sd zugriff, mit denen das problem gelöst werden kann?

mfg roboman

Ceos
26.03.2009, 08:30
der zugriff auf ne SD karte passiert ja per SPI was du da siehst ist quasi das FAT format als rohdaten (auslesen tut man immer 512Byte große sektoren) also müsste man tehoretisch nur die datei nach FAT spezifikation zusammensetzen

thewulf00
26.03.2009, 09:12
Dazu gibt es Treiber (als Libs). Such mal im Netz.

Roboman93
26.03.2009, 15:53
ich habe gesucht, aber immer nur funktionen gefunden, mit denen ich den inhalt einer ganzen datei auslesen kann. ein bild zb ist aber zu groß, um es auf einmal auszulesen. gibt es dafür eine lib?

Ceos
26.03.2009, 17:47
gib mal link, die lib würde mich schwer interessieren und so schwer kanns nich sein das umzuschreiben um sequentiell zu lesen ... mind. 512 byte spreicher musste sowieso vorsehn

thewulf00
27.03.2009, 07:39
Die Lib umzuschreiben ist bestimmt nicht sooo schwer.
Hier ein Beispiel vom Ulrich Radig: http://www.ulrichradig.de/home/index.php/avr/mmc-sd

Es gibt sicherlich noch weitere Libs, evtl. auch vom Ulrich Radig.

Ceos
27.03.2009, 08:19
di lib ist doch schon fast perfekt,

void fat_read_file(...) aus der fat_16.c

gibt dir in 512 byte blöcken die datei wieder, das ist doch ideal ... aber die 4MB grenze ist schwierig, wenn da mal wirklich n etwas größeres bild iss wirds eng

Roboman93
27.03.2009, 17:12
ok, danke. wenn ich den code richtig verstehe, muss ich den cluster angeben, wo die datei anfängt( den krieg ich mit fat_search_file raus), den buffer wo der cluster gespeichert werden soll und den block, der gespeichert werden soll.
ich hab noch ne frage zu fat_search_file: ich versteh nicht, was ich in der variable unsigned int *Cluster angeben muss.

mfg roboman

Jaecko
27.03.2009, 21:24
Ich hab die FAT-Libs von Roland Riegel. Da kann ich mit dem Read-Befehl auswählen, wie viele Bytes ich haben will.
Zum Anzeigen von Bildern auf nem GLCD hol ich mir auch nur die einzelnen Bytes nacheinander und dübel die aufs Display.
Vorteil: Kein extra Puffer nötig.
Nachteil: Bildaufbau durch "Langsame" Karte sichtbar.

thewulf00
27.03.2009, 22:30
ich hab noch ne frage zu fat_search_file: ich versteh nicht, was ich in der variable unsigned int *Cluster angeben muss.

Der * in dieser Definition zeigt, dass es ein Pointer ist, d.h. die Funktion ist in der Lage, diese Variable zu füllen (d.h. zu schreiben) und nicht nur zu lesen. Ergo steht in dieser Variable nach dem Ausführen der Funktion der gesuchte Cluster. Dafür musst Du das aber mit '&' aufrufen, um den Pointer und nicht die Variable selbst zu übergeben:


char cluster = 0;
fat_search_file(..., &cluster, ...);
if (cluster > 0)
// AHA! Der gesuchte Cluster!


@Jaecko:
Danke für den Tipp, werd ich mir merken. Puffer sind eh immer ein Problem auf µC.