Hallo zusammen,
In meinem GPS Tracker hatte ich bisher die Version 2009-03-30 der SD Lib
von Roland Riegel problemlos verwendet.
Ich habe einen ATmega32 @ 16MHz.
Die GPS Daten werden in 512 Byte "Blöcken" auf die SD Karte geschrieben.
Gestern habe ich auf die aktuelle Version geupdated (2011-04-23),
seitdem habe ich folgendes Problem:
Schiebe ich die SD Karte in einen PC, wird die geschriebene Datei
(*.txt) angezeigt mit richtigem Zeitstempel und Größe, aber wenn ich sie
öffne ist KEIN Inhalt zu sehen.
Ich habe daraufhin in der FAQ von Roland Riegel folgenden Punkt
gefunden:
"Writing to the card returns no failure, but when checking the file's
content the data is not there. What happens?
For performance reasons, writing to the card is always buffered. Before
pulling the card out of its socket (or issuing a reset of the MCU), make
sure sd_raw_sync() gets called such that all buffered data is written
out to permanent card storage."
Also habe ich sd_raw_sync() nach jedem aufruf von fat_write_file()
aufgerufen. Das Fehlerbild bleibt aber das gleiche.
Hier ein Auszug meines Codes:
1 | /* Initialisieren der SD Karte */
|
2 | sd_raw_init();
|
3 | // open first partition
|
4 | struct partition_struct* partition = partition_open(sd_raw_read, sd_raw_read_interval, sd_raw_write, sd_raw_write_interval, 0);
|
5 |
|
6 | // open file system
|
7 | struct fat_fs_struct* fs = fat_open(partition);
|
8 |
|
9 | // open root directory
|
10 | struct fat_dir_entry_struct directory;
|
11 | fat_get_dir_entry_of_path(fs, "/", &directory);
|
12 | struct fat_dir_struct* dd = fat_open_dir(fs, &directory);
|
13 |
|
14 | // create file in root dir
|
15 | while(check != 1)
|
16 | {
|
17 | const char filename[LENGTH_FILENAME] = {'D', 'a', 't', 'a', filenr[2] + 48, filenr[1] + 48, filenr[0] + 48, '.', 't', 'x', 't'};
|
18 | check = fat_create_file(dd, filename, &directory);
|
19 | filenr[0]++;
|
20 | if(filenr[0] == 10) {
|
21 | filenr[0] = 0;
|
22 | filenr[1]++;
|
23 | }
|
24 |
|
25 | if(filenr[1] == 10) {
|
26 | filenr[0] = filenr[1] = 0;
|
27 | filenr[2]++;
|
28 | }
|
29 | // Abbruch von Schleife falls keine Karte drin
|
30 | if(filenr[2] == 10)
|
31 | break;
|
32 | }
|
33 |
|
34 | // open file
|
35 | struct fat_file_struct* filehandle;
|
36 | filehandle = fat_open_file(fs, &directory);
|
37 |
|
38 | /* Endlosschleife */
|
39 | while(1)
|
40 | {
|
41 | GetGPSData(&sync, &no_saved_sdlines, &newdata, filehandle);
|
42 | sd_raw_sync();
|
43 | }
|
in GetGPSData wird dann noch fat_write_file() aufgerufen.
Hat jemand eine Idee was hier schiefläuft?
Vielen Dank schon mal an alle