5

So I am using an Arduino Mega with the Sparkfun MP3 shield. And I can't seem to read the μSD card. It's formatted in FAT32 and it has a single .txt file on it. I always get this error:

SD initialization failed.
Do not reformat the card!
Is the card correctly inserted?
Is chipSelect set to the correct value?
Is there a wiring/soldering problem?
errorCode: 0x1, errorData: 0xff

I have tried chipSelect 8,9 and 10. I've seen all the other forum threads about the error but none apply here as it is a bought board and not self built, so the wiring should be correct. I've tried software that has ran on the same configuration, and I get the same error.

Thanks in advance,

Michidez

The code that I use to try the SD card (QuickStart, from the SdFat Library):

// Quick hardware test
#include <SdFat.h>
// Test with reduced SPI speed for breadboards.
// Change spiSpeed to SPI_FULL_SPEED for better performance
// Use SPI_QUARTER_SPEED for even slower SPI bus speed
const uint8_t spiSpeed = SPI_HALF_SPEED;
//------------------------------------------------------------------------------
// Normally SdFat is used in applications in place
// of Sd2Card, SdVolume, and SdFile for root.
Sd2Card card;
SdVolume volume;
SdFile root;
// Serial streams
ArduinoOutStream cout(Serial);
// input buffer for line
char cinBuf[40];
ArduinoInStream cin(Serial, cinBuf, sizeof(cinBuf));
// SD card chip select
int chipSelect;
void cardOrSpeed() {
 cout << pstr(
 "Try another SD card or reduce the SPI bus speed.\n"
 "The current SPI speed is: ");
 uint8_t divisor = 1;
 for (uint8_t i = 0; i < spiSpeed; i++) divisor *= 2;
 cout << F_CPU * 0.5e-6 / divisor << pstr(" MHz\n");
 cout << pstr("Edit spiSpeed in this sketch to change it.\n");
}
void reformatMsg() {
 cout << pstr("Try reformatting the card. For best results use\n");
 cout << pstr("the SdFormatter sketch in SdFat/examples or download\n");
 cout << pstr("and use SDFormatter from www.sdcard.org/consumer.\n");
}
void setup() {
 Serial.begin(9600);
 while (!Serial) {} // wait for Leonardo
 cout << pstr(
 "\nSD chip select is the key hardware option.\n"
 "Common values are:\n"
 "Arduino Ethernet shield, pin 4\n"
 "Sparkfun SD shield, pin 8\n"
 "Adafruit SD shields and modules, pin 10\n");
}
bool firstTry = true;
void loop() {
 // read any existing Serial data
 while (Serial.read() >= 0) {}
 if (!firstTry) cout << pstr("\nRestarting\n");
 firstTry = false;
 cout << pstr("\nEnter the chip select pin number: ");
 cin.readline();
 if (cin >> chipSelect) {
 cout << chipSelect << endl;
 } else {
 cout << pstr("\nInvalid pin number\n");
 return;
 }
 if (!card.init(spiSpeed, chipSelect)) {
 cout << pstr(
 "\nSD initialization failed.\n"
 "Do not reformat the card!\n"
 "Is the card correctly inserted?\n"
 "Is chipSelect set to the correct value?\n"
 "Is there a wiring/soldering problem?\n");
 cout << pstr("errorCode: ") << hex << showbase << int(card.errorCode());
 cout << pstr(", errorData: ") << int(card.errorData());
 cout << dec << noshowbase << endl;
 return;
 }
 cout << pstr("\nCard successfully initialized.\n");
 cout << endl;
 uint32_t size = card.cardSize();
 if (size == 0) {
 cout << pstr("Can't determine the card size.\n");
 cardOrSpeed();
 return;
 }
 uint32_t sizeMB = 0.000512 * size + 0.5;
 cout << pstr("Card size: ") << sizeMB;
 cout << pstr(" MB (MB = 1,000,000 bytes)\n");
 cout << endl;
 if (!volume.init(&card)) {
 if (card.errorCode()) {
 cout << pstr("Can't read the card.\n");
 cardOrSpeed();
 } else {
 cout << pstr("Can't find a valid FAT16/FAT32 partition.\n");
 reformatMsg();
 }
 return;
 }
 cout << pstr("Volume is FAT") << int(volume.fatType());
 cout << pstr(", Cluster size (bytes): ") << 512L * volume.blocksPerCluster();
 cout << endl << endl;
 root.close();
 if (!root.openRoot(&volume)) {
 cout << pstr("Can't open root directory.\n");
 reformatMsg();
 return;
 }
cout << pstr("Files found (name date time size):\n");
 root.ls(LS_R | LS_DATE | LS_SIZE);
 if ((sizeMB > 1100 && volume.blocksPerCluster() < 64)
 || (sizeMB < 2200 && volume.fatType() == 32)) {
 cout << pstr("\nThis card should be reformatted for best performance.\n");
 cout << pstr("Use a cluster size of 32 KB for cards larger than 1 GB.\n");
 cout << pstr("Only cards larger than 2 GB should be formatted FAT32.\n");
 reformatMsg();
 return;
 }
 // read any existing Serial data
 while (Serial.read() >= 0) {}
 cout << pstr("\nSuccess! Type any character to restart.\n");
 while (Serial.read() < 0) {}
}
sa_leinad
3,2182 gold badges23 silver badges51 bronze badges
asked Apr 22, 2016 at 15:40
2
  • It would help if you actually posted code. Commented Apr 22, 2016 at 16:04
  • Any code gives me the error. Including 2 examples from SdFat: QuickStart and SdInfo. But I'll add QuickStart to the post. Commented Apr 22, 2016 at 16:09

1 Answer 1

1

Firstly, where did you get the get the SdFat library from? A quick search on GitHub returned 34 results: GitHub search of SdFat. Of those, Greiman and Adafruit were the highest results on Google.

The reason I mention this is that you could be using a library that has issues or requires something specific in the hardware. I would suggest using the Adafruit version, as that would be the most scrutinized and hence the most stable. It appears very similar to the Arduino library (mentioned below).

Arduino has a SD library that comes with the Arduino IDE. It is simply called SD. There are 6 example programs:

  • CardInfo: SD card test - This example shows how use the utility libraries on which the'SD library is based in order to get info about your SD card. Very useful for testing a card when you're not sure whether its working or not.
  • ReadWrite: SD card read/write - shows how to read and write data to and from an SD card file.
  • Files: SD card basic file example - shows how to create and destroy an SD card file.
  • ListFiles: Listfiles - This example shows how print out the files in a directory on a SD card.
  • DumpFile: SD card file dump - shows how to read a file from the SD card using the SD library and send it over the serial port.
  • Datalogger: SD card datalogger - shows how to log data from three analog sensors.

Use the CardInfo example program to verify that your setup is correct. Then progress to one of the other examples such as ListFiles or Dumpfile.

answered Apr 29, 2017 at 13:50

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.