SD Card mit Atmega beschrieben (FAT32) - Datei nicht lesbar in Windows

OP #4007708
Lesenswert?

Hallo,

wie der Thread-Name schon sagt, habe ich mit den FAT32 Sourcen von 
Daniel R. (http://www.mikrocontroller.net/articles/AVR_FAT32) eine 
SD-Card beschrieben, mit einem Atmega1284P.

Ich kann die Datei über den Atmega problemlos weiterschreiben und auch 
über den Atmega wieder einlesen. Wenn ich die SD-Card nun aber in meinen 
Laptop stecke, kann ich die Datei nicht mehr lesen!

Windows meldet "Die Datei oder das Verzeichnis /mem.txt ist beschädigt 
und nicht lesbar". Hat es irgendetwas mit Byteorder (Little Endian/Big 
Endian??) oder sowas zu tun? Ich habe auch die FAT schon mit dem 
Programm TestDisk überprüft, und da scheint alles in Ordnung zu sein.

Falls es irgendwie relevant ist, ich habe folgendes in die Datei 
geschrieben:

"test012;3632419318;000050000;000155;05\r\n
test234;3632419553;000000020;000010;05\r\n
test567;3632419391;000045000;000120;00\r\n"


Hat jemand eine Ahnung was da schief gelaufen ist?


Wäre für Hilfe sehr dankbar.

Grüße
#4007723
Lesenswert?

@ Timo .x (waswasi)

>Ich kann die Datei über den Atmega problemlos weiterschreiben und auch
>über den Atmega wieder einlesen.

Wo ist dein Programm dazu?

>Windows meldet "Die Datei oder das Verzeichnis /mem.txt ist beschädigt
>und nicht lesbar". Hat es irgendetwas mit Byteorder (Little Endian/Big
>Endian??)

Nein.

> oder sowas zu tun?

Ja.

Vielleicht wird die Datei nicht korrekt geschlossen und es sind noch 
gepufferte Daten im Mirkocontroller, welche nicht korrekt auf die 
SD-Karte geschrieben werden.
OP #4007739
Lesenswert?

Also wie gesagt ich verwende die Routinen von Daniel R., also einfach:

ffwrites("test123");
ffwrite(';');
ffclose();


usw. In der Operatin ffclose() wird der gepufferte Bereich auf die 
SD-Card geschrieben. Ich hänge die Original-Source mal an.


Außerdem habe ich jetzt mit TestDisk ein Image von der SD-Card 
abgezogen,
namens image.dd. Ist das die RAW Version die angesprochen wurde? Ich 
würde es gerne anhängen, es ist aber 2GB groß :)
Angehängte Dateien:
#4007748
Lesenswert?

@ Timo .x (waswasi)

>    file.c (32,9 KB, 0 Downloads) | Codeansicht


>Also wie gesagt ich verwende die Routinen von Daniel R., also einfach:

>ffwrites("test123");
>ffwrite(';');
>ffclose();

Willst du mich veralbern? Poste deinen ORIGINALquelltext als Angang, 
auch von deinem Testprogramm!

>usw. In der Operatin ffclose() wird der gepufferte Bereich auf die
>SD-Card geschrieben. Ich hänge die Original-Source mal an.

Das ist der nur Quelltext der Lib, nicht dein Programm!

>Außerdem habe ich jetzt mit TestDisk ein Image von der SD-Card
>abgezogen,
>namens image.dd. Ist das die RAW Version die angesprochen wurde? Ich
>würde es gerne anhängen, es ist aber 2GB groß :)

Nein danke.

Es reicht, mit einem gescheiten Hex-Editor ala WinHex die FAT und die 
Verzeichniseinträge anzusehen, das reicht schon.
OP #4007755
Lesenswert?

Ok mit WinHex kann ich es laden. Gib mir kurz Zeit, ich erstelle die 2 
MB.


Zu meinem Original-Code. Den zu posten ist nicht so einfach da er über 
verschiedene Stellen verteilt ist. Ich rufe es in einer Telnet-Session 
auf mit User Interaktion. Es läuft uIp als Ethernet-Stack. Kann es also 
nicht ohne weiteres runter copy/pasten.
Gast #4380779
Lesenswert?

Hey, ich habe das selbe(?) Problem.

Nachdem ich mmc_init()und fat_loadFatData() aufgerufen habe, und das 
Programm beende funktionert meine SD-Karte noch, wenn ich diese an dem 
PC anschauen.

Sobald ich versuche, eine Datei zu öffnen mit(die if-Abfrage wird 
abgearbeitet, also wird doch eine Datei angelegt?!):
1
DISABLE_INTERRUPTS;
2
if (ffopen(fname, 'c') == MMC_FILE_CREATED) 
3
{
4
 ffwrites((uint8_t*) "abc");
5
 ffwrite(0x0D);
6
}
7
ffclose();
8
ENABLE_INTERRUPTS;

und dann versuche, die Datei auf dem PC anzuschauen, kann die SD-Karte 
nicht mehr gelesen werden.

Weiß einer, wo das Problem liegen könnte?
1
while (1) {
2
if ((GPIOD_PDIR & (1 << 1)) == 0) {  // Wenn taster gedrückt wird
3
      green_on();
4
      SDCard_init();
5
      SDCard_write();
6
  //    SDCard_read();
7
      green_off();
8
    }
9
 }
10

11
void SDCard_init() {
12
  if (!mmc_initialized) {
13
    if (MMC_PI) {  //SD-Karte vorhanden?
14
      spi_slow();
15
      delay(1);
16
      if (mmc_init()) {
17
        if (fat_loadFatData()) {
18
          mmc_initialized = true;
19
          spi_fast();
20
         yellow_on();
21
          delay(1);
22
        }
23
      }
24
      spi_fast();
25
      delay(1);
26
    } else {
27
      delay(100);
28
    }
29
  }
30
}
31

32
void SDCard_write() {
33
  if (mmc_initialized) {
34

35
    uint8_t i;
36

37
    DISABLE_INTERRUPTS;
38
    if (ffopen(fname, 'c') == MMC_FILE_CREATED) 
39
{
40
      ffwrites((uint8_t*) "abc");
41

42
    }
43

44
    ffclose();
45
    ENABLE_INTERRUPTS;
46
  }
47
}
#4380837
Lesenswert?

Timo .. schrieb:
> So, das sind die ersten 100 KB oder so, danach kommen nur noch 00 er.

Ganz sicher? Bei mir sind SDHC Karten so formatiert, das die FATs an 
Page Grenzen ausgerichtet sind. Das bedeutet das die FAT (also die 
Allokierungsinfos) erst ab 4 MB oder 8 MB anfängt. Die Daten kommen 
noch viel später...

Erschwerend kommt bei Dir hinzu, dass das nur der Anfang der Partition 
aber nicht die komplette "Disk" ist. SD Karten haben praktisch immer 
eine Partitionstabelle - die sieht WinHex aber nur wenn man als Admin 
den korrekten physischen Datenträger geöffnet hat.

Das Posten von hex Daten ohne Zeilenumbrüche ist für Analysezwecke 
ungeeignet. Mit dem bloßen Auge erkenne ich nicht die Anfänge der Bytes,
und für Tools müsste ich irgendwie wieder nach Binär kovertieren. Was 
ich mir geschenkt habe, da ich keine Daten als FAT Einträge erkennen 
kann.
Gast #4381030
Lesenswert?

Boote doch einfach eine Ubuntu Linux CD, dann kannst du die Karte mit 
dem dd Befehl auslesen.

Außerdem gibt der Kernel in seinem Log (dmesg Befehl) in der Regel recht 
detaillierte Fehlermeldungen aus, wenn es zu Lesefehlern kommt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren