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.
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.
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.
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...
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.
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
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.