Arduino schreibt nur corrupte Files auf SD-Karte

Hallo,

ich will gerne Daten auf eine SD-Karte schreiben.
Die SD-Karte ist im Slot für einen TouchTFT.

Ich hab es mit der tinyFAT.h von rinkydink versucht und mit der standard SD.h

Bei beiden funktioniert das Lesen von Dateien, die via PC auf die Karte kamen einwandfrei. Auch Dateien erstellen und öffnen und schließen geht wunderbar.

Aber sobald ich was in eine Datei schreibe kann die Datei vom PC danach nicht mehr geöffnet werden und der Arduino erkennt zwar die Datei, kann aber nichts auslesen, weil es leer ist. Die erstellten Dateien sind jedoch genau so groß wie der Inhalt, der eigentlich in ihnen stehen sollte.

Ich habe es auch schon mit den exakten Beispielcodes aus den libs versucht und dort nur das "Serial" in "Serial1" geändert, sowie bei dem SD.h Beispielcode den CS PIN. Beide Beispielcodes läuft durch und geben keine Fehlermeldung aus. Die Dateien sind nach dem Durchlauf da und belegen Speicher, aber sind nicht lesbar.

Könnt ihr mir Tipps geben, was ich noch versuchen kann? Ich hab keine Idee woran das liegen könnte.

Files nicht geschlossen sondern direkt rausgezogen?

Hallo,

also schließen tue ich (der Arduino) den File.

Der Code in Kurzform:
WiIe gesagt, sonst verhalten sich auch die Beispiel Sketche genau so.

    file.create("BIG.TXT");
    file.openFile("BIG.TXT", FILEMODE_TEXT_WRITE); 
    file.writeLn("Hallo");
    file.closeFile();

Ich hab auch schon versucht direkt im Anschluss nach dem Schreiben wieder zu lesen,

Ich hab auch schon SPI Frequenz auf niedrigste gestellt.

Mal eine andere SD Karte ausprobiert?

Hab ich grade ausprobiert, genau das gleiche :frowning:

Ich hab auch alle Leitungen durch geklingelt und keine Probleme Entdeckt.

Dshing:

    file.writeLn("Hallo");

Welche SD-Library verwendest Du, in der diese Zeile fehlerfrei kompiliert werden kann?
Diese Zeile kann mit der Arduino SD library nicht kompiliert werden.

Auch die Zeile

file.create("BIG.TXT");

sieht mir nicht ganz astrein aus.

Kompletter Code des Test-Programms?

Hat die verwendete SD-Karte überhaupt eine FAT-Formatierung?

jurs:
Welche SD-Library verwendest Du, in der diese Zeile fehlerfrei kompiliert werden kann?
Diese Zeile kann mit der Arduino SD library nicht kompiliert werden.

Mit der tinyFAT.h soll es gehen, in Zeile 117 steht es mal so drin.

uint16_t	writeLn(char *st);

Scherheinz:
Mit der tinyFAT.h soll es gehen

Geht es noch mickeriger:

tinyFAT: The library supports FAT16 formatted SD cards up to 2GB in size.

Gibt es im Handel überhaupt noch 2 GB SD-Karten zu kaufen?

Und dann muß man bei der Library auch noch aufpassen, dass sie mit FAT16 und nicht mit FAT32 formatiert wird, damit diese kastrierte Library mit der Karte funktioniert.

Ohne Not würde ich mir so ein Downgrade von der zur Arduino-IDE mitgelieferten SD Library zur tinyFAT Library bestimmt nicht antun wollen.

Gibt es im Handel überhaupt noch 2 GB SD-Karten zu kaufen?

Gibt es auf eBay massig

Er hat die Entwicklung wegen der angeblichen schwierigen Verfügbarkeit der Karten eingestellt.

Das größte Problem der Standard SD library sind die 2 * 512B RAM Puffer.
Der andere Kram (komplexe Pfade) ist selten erforderlich im Arduino-Bereich, denke ich.

Aus meinem Datenlogger Projekt erinnere ich mich an das Problem, was passiert wenn die Karte mal draussen war und danach wieder verfügbar, evtl. gar ein Schreibversuch fehlgeschlagen, ohne dass der Arduino-Datenlogger resettet werden sollte.
Das hat früher (1.0) die Standard-Library nicht geschafft ohne einen Patch. (Ob die Karte da ist, wird nur bei open() entdeckt. Es fehlte das Gegenstück zu SD.begin(); Und so Zeug, denke ich. )

Das sollte man bei der tinyFAT auch prüfen...

2GB micro SDHC gibts tatäschlich noch. Class 10 ist ja schön und gut, ob sie tatsächlich noch SPI können, ist die andere Frage, bei der freundliche Chinesen-Händler in der Regel überfragt sind...

Ja die befehle oben sind aus der tinyFAT.

Das SD.h Pendant sieht dann in Kurzform so aus.

SD.open("test.txt", FILE_WRITE);
myFile = SD.open("neu.txt", FILE_WRITE);
myFile.println("Blablabla...dadada");
myFile.close();

Hallo,

2GB SDHC sollten funktionieren. Hatte mit dem original Arduino WLAN Shield eine 2GB micro Karte probiert. Hatte funktioniert.

Für das Karten Init Problem gibts eine kleine Korrektur. Dazu muß man die SD.cpp ändern ab Zeile 335. Die komplette Funktion sieht dann so aus.

boolean SDClass::begin(uint8_t csPin) {
  /*
    Performs the initialisation required by the sdfatlib library.

    Return true if initialization succeeds, false otherwise.

   Erster Block ergänzt, root wird geschlossen falls offen, damit kann jederzeit erneut initialisiert werden, zum Bsp. nach Kartenwechsel    
   */
   if (root.isOpen()) root.close();      // allows repeated calls
   return card.init(SPI_HALF_SPEED, csPin) &&
         volume.init(card) &&
         root.openRoot(volume);
}

Für ernsthafte SD Karten Nutzung sollte man aber die modernere SdFat von Greiman verwenden.

Auch wenn einem die Möglichkeiten damit erstmal erschlagen.

Wegen Deinem Code. 2x SD.open macht keinen Sinn. Ich glaube auch der erste Befehl so wie er da steht, erst das File löscht und neu erzeugt. Dir fehlt außerdem noch ein SD.begin
Und wie ist myFile definiert usw.?
Du mußt schon den kompletten Code zeigen, sonst wird das nichts.

Guck Dir mal die Bsp. der SD Lib nochmal genauer an.

Hallo,

ja die erste Zeile sollte eigentlich gelöscht werden, hab ich wieder nicht aufgepasst und die Taste nicht voll durchgedrückt XD

Also der ganze SD.h Code sieht so aus (wie gesagt nicht wirklich was geändert):

/*
  SD card read/write

 This example shows how to read and write data to and from an SD card file
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4

 created   Nov 2010
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe

 This example code is in the public domain.

 */

#include <SPI.h>
#include <SD.h>

File myFile;

void setup()
{
  // Open serial communications and wait for port to open:
  Serial1.begin(9600);
  while (!Serial1) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial1.print("Initializing SD card...");

  if (!SD.begin(53)) {
    Serial1.println("initialization failed!");
    return;
  }
  Serial1.println("initialization done.");

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    Serial1.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    // close the file:
    myFile.close();
    Serial1.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial1.println("error opening test.txt");
  }

  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial1.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial1.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial1.println("error opening test.txt");
  }
}
void loop()
{
  // nothing happens after setup
}

Ich werde mir mal die SdFat anschauen, vielleicht klappt es ja damit :wink:

Dshing:

if (!SD.begin(53))

Der Chip-Select des SD-Moduls an Pin-53 ist sicher?

Abgesichert durch das Datenblatt und den Schaltplan?

Ja, hab so gar durch gegemessen :wink:

Dshing:
Ja, hab so gar durch gegemessen :wink:

Und wie sieht es mit der Stromversorgung für die SD-Karte aus?

SD-Karten brauchen 3.3V, und beim Schreiben brauchen sie davon nicht zu knapp, so vielleicht 200 mA Strom in der Spitze vielleicht.

Die Arduino 8-Bit Boards (UNO, MEGA etc.) können an 3.3V aber meist nur maximal 50 mA bereitstellen. Das DUE Board könnte auch mehr.

Welches Board verwendest Du?

Und wo kommt bei Deinem Shield der Strom für die 3.3V zum Betrieb der SD-Karte her? Kommt der Strom aus dem 3.3V Pin des Boards, reicht das bei UNO und MEGA nicht aus. Kommt der Strom aus dem 5V Pin und wird dann von einem Spannungsregler für die SD-Karte auf 3.3V runtergeregelt, würde es auch bei UNO UND MEGA Boards reichen.

Wenn die Karte beim Lesen von Dateien einwandfrei funktioniert, die Du auf einem PC auf die Karte draufkopiert hast, aber die Karte versagt beim Schreiben von Dateien, dann würde ich in Richtung Stromversorgung suchen: Beim Lesen von SD wird nämlich weniger Strom benötigt als beim Schreiben.