Hello guys,
I'm having a strange problem with my SD card writing/reading and I don't know how to fix it.
I have 2GB SD card installed in my module and I'm running the SD library sample files.
If I run the "CardInfo" sample it correctly displays the data about my card, so the wiring must be correct. Further more if I run the "DumpFile" sample it displays my "Lorem Ipsum" .txt file in the serial monitor successfully and without a problem. But strange thing start to happen when I run the "ReadWrite" sample or "Datalogger" sample. The console gets flooded with strange characters and and file becomes corrupted and gigantic in size. Like about 1,6GB in a matter of seconds. Or the write to the card fails (says it passed with success) but there is nothing in the file.
/*
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 <SD.h>
File myFile;
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print("Initializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.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) {
Serial.print("Writing to test.txt...");
myFile.println("testing 1, 2, 3.");
// close the file:
myFile.close();
Serial.println("done.");
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
// re-open the file for reading:
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
// read from the file until there's nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
}
void loop()
{
// nothing happens after setup
}
It's the sample that comes with Arduino IDE and I haven't changed it.
There is another strange behavior I noticed just now using the SDFat library. If I run the benchmark sample it failes to write on the SDCard but it still creates the file. Corrupted of course. While the sample that displays the information about the card work without an error.
There is a possibility that this is a card issue, but I have 16MB and 128MB cards that arent working at all.
I formatted the card several times using the offical software drom SD website.
Can you post a sample of code using the SDFat that works for you? So I can try to run it and see the results.
One more thing I read something about the length of the cables between sdCard module and arduino. Mine are quite long about 10cm, could that be the problem maybe?
Any of the samples with the SDFat library work for me. In most of my code, I am generally reading from the card rather than writing.
I would not have thought that 10cm was excessive length. I built my reader onto a prototype shield with jumpers to be able to select the ENABLE I/O line as it often clashes.
Have you tried formatting the card with the SDFat library formatter?