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
Timo .x schrieb: > Hat jemand eine Ahnung was da schief gelaufen ist? kann du den SD-CARD mal RAW auslesen ( Linux mit dd oder irgendeinem Windows tool) Dann kann man die FAT überprüfen, wo das Problem liegt.
Hört sich gut an. Ich google mal eben, ob ich ein passendes Windows-Tool auftreiben kann (oder kennst Du bereits eins?).
@ 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.
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ß :)
Timo .x schrieb: > 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ß :) die 1MB müsste reichen.
@ 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.
Ok. Kannst Du mir auf die Sprünge helfen wie ich die Datei verkleinern kann? in einem Hex-Editor krieg ich das nicht geladen.
Winhex greift direkt auf die SD-Karte zu, da muss man kein Image erzeugen.
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.
So, das sind die ersten 100 KB oder so, danach kommen nur noch 00 er. Könnt ihr mit dem Format so was anfangen oder soll ich es anders formatieren?
Falls die Information was nützt, wenn ich mit WinHex direkt die mem.txt öffnen möchte stürzt auch dieser Editor mit einer Fehlermeldung ab :(. Kann man denn an dem Image irgendetwas sehen?
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 | } |
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.