Anyone using SD.h with Leonardo?

Anyone tried SD.h with Leonardo?

While updating SdFat for Leonardo, I realized that the version of SdFat used in Arduino 1.01 assumes an ATmega32U4 is a Teensy 2.0.

I tried SD.h with a Leonardo and a SD in the Ethernet shield and it failed.

I modified the SD library by editing Sd2Card.h in the SD/utility folder.

I changed this:

/** The default chip select pin for the SD card is SS. */
uint8_t const  SD_CHIP_SELECT_PIN = SS_PIN;
// The following three pins must not be redefined for hardware SPI.
/** SPI Master Out Slave In pin */
uint8_t const  SPI_MOSI_PIN = MOSI_PIN;
/** SPI Master In Slave Out pin */
uint8_t const  SPI_MISO_PIN = MISO_PIN;
/** SPI Clock pin */
uint8_t const  SPI_SCK_PIN = SCK_PIN;

To this:

#include <Arduino.h>
/** The default chip select pin for the SD card is SS. */
uint8_t const  SD_CHIP_SELECT_PIN = SS;
// The following three pins must not be redefined for hardware SPI.
/** SPI Master Out Slave In pin */
uint8_t const  SPI_MOSI_PIN = MOSI;
/** SPI Master In Slave Out pin */
uint8_t const  SPI_MISO_PIN = MISO;
/** SPI Clock pin */
uint8_t const  SPI_SCK_PIN = SCK;

That made this version of the ReadWrite example work with Leonardo and a SD in the Ethernet shield.

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

  // disable Ethernet
   pinMode(10, OUTPUT);
   digitalWrite(10, HIGH);

  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.

  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
}

Yes i am using this version.

The new version of SdFat now supports the Leonardo for both Hardware SPI and Software SPI. It is sdfatlib20120719.zip at Google Code Archive - Long-term storage for Google Code Project Hosting..

By default Software SPI supports the pin configuration for 328 shields with:

/** Software SPI Master Out Slave In pin */
uint8_t const SOFT_SPI_MOSI_PIN = 11;
/** Software SPI Master In Slave Out pin */
uint8_t const SOFT_SPI_MISO_PIN = 12;
/** Software SPI Clock pin */
uint8_t const SOFT_SPI_SCK_PIN = 13;

To use Software SPI on Leonardo and Hardware SPI with other CPUs, edit SdFatConfig.h at about line 121 like this:

#define LEONARDO_SOFT_SPI 1

@fat16lib

I am using Arduino Leonardo with Seeedstudio SD shield v4 (SD Card shield V4.0 | Seeed Studio Wiki)
and i use latest version of SDFat library but still not working with Leonardo..i get always SD card cant be initialized

any ideas please ?