Arduino Leonardo + Seedstudio SD card shield V4.3 SD CARD CAN NOT BE INITIALIZED

Hello

I have been searching for almost three days for an answer for my issue and did not get any and it is as following :

I have arduino Leonardo + Seedstudio SD card shield V4.3 (http://wiki.seeed.cc/SD_Card_shield_V4.0/)

and i tried both codes mentioned in the wiki but none of them worked

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

     The circuit:
        SD card attached to SPI bus as follows:
     ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
     ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
     ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
     ** CS - depends on your SD card shield or module.
     ** Pin 4 used here for consistency with other Arduino examples


     created  28 Mar 2011
     by Limor Fried
     modified 9 Apr 2012
     by Tom Igoe
*/
// include the SD library:
#include <SPI.h>
#include <SD.h>

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
const int chipSelect = 4;

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("\nInitializing 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);     // change this to 53 on a mega

 digitalWrite(10, HIGH); // <<<<< I ADDED THIS AND STILL NOT WORKING>>>>

  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card is inserted?");
    Serial.println("* Is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    return;
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  // print the type of card
  Serial.print("\nCard type: ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }


  // print the type and size of the first FAT-type volume

  uint64_t volumesize64;
  uint32_t volumesize32;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();

  volumesize64 = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize64 *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize64 *= 512;                            // SD card blocks are always 512 bytes

  Serial.print("Volume size (bytes): ");
  printLLNumber(volumesize64, DEC);
  Serial.println();

  Serial.print("Volume size (Kbytes): ");
  volumesize32 = volumesize64 / 1024;
  Serial.println(volumesize32);

  Serial.print("Volume size (Mbytes): ");
  volumesize32 /= 1024;
  Serial.println(volumesize32);
  /*uint64_t volumesize;
    Serial.print("\nVolume type is FAT");
    Serial.println(volume.fatType(), DEC);
    Serial.println();

    volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
    volumesize *= volume.clusterCount();       // we'll have a lot of clusters
    volumesize *= 512;                            // SD card blocks are always 512 bytes
    Serial.print("Volume size (bytes): ");
    Serial.println(volumesize,DEC);
    Serial.print("Volume size (Kbytes): ");
    volumesize /= 1024;
    Serial.println(volumesize,DEC);
    Serial.print("Volume size (Mbytes): ");
    volumesize /= 1024;
    Serial.println(volumesize,DEC);
  */

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}


void loop(void) {

}
void printLLNumber(uint64_t n, uint8_t base)
{
  unsigned char buf[16 * sizeof(long)];
  unsigned int i = 0;

  if (n == 0)
  {
    Serial.print((char)'0');
    return;
  }

  while (n > 0)
  {
    buf[i++] = n % base;
    n /= base;
  }

  for (; i > 0; i--)
    Serial.print((char) (buf[i - 1] < 10 ?
                         '0' + buf[i - 1] :
                         'A' + buf[i - 1] - 10));
}

I tried both SD and SDFat libraries CardInfo examples and none worked, after searching alot, some mentioned that on Leonardo we should set pin10 to HIGH and i did it and still not working…

I have tested two SD cards : SanDisk Ultra (16GB, micro SDHC, FAT32 format) and Joyflash (4GB, micro SDHC, FAT16 format) and both could not be initialized…

i found also somewhere this code which looks cool but same problem

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

void setup() {
  Serial.begin(9600);
  while (!Serial);

  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);

  Serial.print("Starting SD...");
  if (!SD.begin(4)) Serial.println("failed");
  else Serial.println("ok");
}

void loop() {
}

any ideas please before i get mad :frowning:

Look at a diagram of the Leonardo and determine which pin is SS. It's possibly different from the SS pin on e.g. an Uno. To my knowledge that pin must be set as output.

sterretje: Look at a diagram of the Leonardo and determine which pin is SS. It's possibly different from the SS pin on e.g. an Uno. To my knowledge that pin must be set as output.

thanks for reply. SS pin of Leonardo is D17 which is hidden and connected to Rx LED. I tried to set it as an output too but it did not work :(

I tried this on a Leonardo:

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

// Chip Select pin for my SD module.
#define SD_CS_PIN 4

void setup() {
  Serial.begin(9600);
  while (!Serial);

// don't do this - SD.h was fixed five years ago.
//  pinMode(10, OUTPUT);
//  digitalWrite(10, HIGH);

  Serial.print("Starting SD...");
  if (!SD.begin(SD_CS_PIN)) Serial.println("failed");
  else Serial.println("ok");
}

void loop() {
}

And it printed:

Starting SD…ok

fat16lib:
I tried this on a Leonardo:

#include <SD.h>

#include<SPI.h>

// Chip Select pin for my SD module.
#define SD_CS_PIN 4

void setup() {
 Serial.begin(9600);
 while (!Serial);

// don’t do this - SD.h was fixed five years ago.
//  pinMode(10, OUTPUT);
//  digitalWrite(10, HIGH);

Serial.print(“Starting SD…”);
 if (!SD.begin(SD_CS_PIN)) Serial.println(“failed”);
 else Serial.println(“ok”);
}

void loop() {
}



And it printed:

thanks alot for your reply, but that did not work too :frowning: … i got “failed”

I have just measured the voltage on pin4 (CS) and it varies 3-3.35 V and as written in the documentation the minimum voltage must be 3.5V and the typical is 5 V (http://wiki.seeed.cc/SD_Card_shield_V4.0/) could this be the problem ?? but it is written also that the shield is compatible with Arduino Leonardo and Pin4 is reserved for CS !! :/

I tried also pin10 as CS and the voltage was 5V but it did not work too :(

You must use the hardware pin number that is connected to chip select on your SD shield.

Look at the documentation for your hardware.

See this.

Looks like pin 4 is CS and the shield connects to the ICSP connector as required by Leonardo.

fat16lib: You must use the hardware pin number that is connected to chip select on your SD shield.

Look at the documentation for your hardware.

Your shield must have an ICSP connector.

I used this shield.

Printed on the board near the SD socket:

So digital pin 4 is CS.

thanks again for reply. i do use the hardware pin number which is also digital pin4 (printed next socket) and the shield has also ICSP connector

I use this shield

EDITED : did you measure the voltage on pin4 ?

The voltage on pin 4 will be floating until pin 4 is initialized so is meaningless.

During use of the shield pin 4 is 5V when the SD is not accessed and close to zero when the SD is selected.

Pin 4 is chip select on your shield so don't do anything with pin 10. SPI is connected to the ICSP connector.

See this.

CS_A is pin 4

DO_A, DI_A, and CLK_A is on the ICSP connector.

I uploaded your code as it is which matches also my hardware…i have tried many other codes too

so now i am assuming the SD card could be the problem ? altough i bought it new and formatted it to FAT32

I tested also this card

:frowning:

Don’t ever format a 4GB card FAT16. The SD standard is cards up to and including 2GB are formatted FAT16. Cards with 2GB < size <= 32GB are FAT32, and over 32GB are exFAT.

Hope you are using SdFormatter to format cards.

OS utilities can produce a GUID partition table (GPT) instead of a Master boot record (MBR) and will fail with SD.h.

fat16lib:
Don’t ever format a 4GB card FAT16. The SD standard is cards up to and including 2GB are formatted FAT16. Cards with 2GB < size <= 32GB are FAT32, and over 32GB are exFAT.

Hope you are using SdFormatter to format cards.

OS utilities can produce a GUID partition table (GPT) instead of a Master boot record (MBR) and will fail with SD.h.

I formatted the 4GB card FAT16 according to this (http://www.instructables.com/id/Format-USB-Flash-Drive-to-FATFAT16-not-FAT32/) but anyway both FAT16 & FAT32 didnt work and yes i was using SdFormatter. Now i can definitely say it is hardware problem. I should try other SD cards, otherwise the ICSP connector maybe the problem although i didnt solder it by myself and it looks good !