I am trying to get the following code to write a simple text file to an SD card, but I keep getting card.init failed (1,FF). I have tried 2 SD cards one being a SD2/2GB SanDisk and the other being a SD6/16GB ADATA. My computer can use both cards so I know the cards are fine. I am using the SD/MMC breakout board found on Sparkfun and resistors to lower the 5V logic down to 3.3V logic. The DO pin on the breakout board is connected directly to the Arduino though. Anybody know what is going on? I heard the Arduino is picky with what SD cards you use.
#include <SdFat.h>
#include <SdFatUtil.h>Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;#define error(s) error_P(PSTR(s))
void error_P(const char* str)
{
PgmPrint("error: ");
SerialPrintln_P(str);
if(card.errorCode())
{
PgmPrint("SD error: ");
Serial.print(card.errorCode(),HEX);
Serial.print(",");
Serial.println(card.errorData(),HEX);
}
while(1);
}void writeCRLF(SdFile& f)
{
f.write((uint8_t*)"\r\n", 2);
}void writeNumber(SdFile& f, uint32_t n)
{
uint8_t buf[10];
uint8_t i = 0;
do{
i++;
buf[sizeof(buf) - i] = n%10 + '0';
n /= 10;
}while(n);
f.write(&buf[sizeof(buf) - i], i);
}void writeString(SdFile& f, char *str)
{
uint8_t n;
for(n = 0; str[n];n++);
f.write((uint8_t *)str, n);
}void setup()
{
Serial.begin(9600);
Serial.println();
Serial.println("Type any character to start");
while(!Serial.available());
if(!card.init(SPI_HALF_SPEED))
{
error("card.init failed");
}if(!volume.init(&card))
{
error("volume.init failed");
}if(!root.openRoot(&volume))
{
error("openRoot failed");
}char name[] = "TESTFILE.TXT";
file.open(&root,name,O_CREAT | O_EXCL | O_WRITE);
file.timestamp(2,2010,12,25,12,34,56);
for(uint8_t i = 0; i <10; i++)
{
writeString(file, "Line: ");
writeNumber(file, i);
writeString(file, " Write test.");
writeCRLF(file);
}file.close();
Serial.println("File Created");if(file.open(&root, name, O_READ))
{
Serial.println(name);
}
else
{
error("file.open failed");
}Serial.println();
int16_t character;
while((character = file.read()) > 0)
{
Serial.print((char)character);
}Serial.println("\ndone");
}void loop()
{
}