SD.h library, initialization failed. (using resistor/zener level shifter).

greets

so I’ve hooked up the SD card module to the Arduino UNO pins through resistor/zener diode level shifters.

the resistors are 1K and 3.3V zener diodes.

my SD card module, from eBay (China).

I powered it from the 5V pin on the UNO.

I’ve used the sketch Read/Write but other sketches from the Arduino SD folder also give the same error:

Initializing SD card…initialization failed!

here is the sketch itself [I only added the two 1000ms delays because I wanted to use my scope to see what’s happening on the SPU lines]

/*
 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
 */
 
#include <SD.h>

File myFile;

void setup()
{
  Serial.begin(9600);
  delay(1000);

  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)) {
    delay(1000);
    Serial.println("initialization failed!");
    return;
  }
  delay(1000);
  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
}

as you can see on the scope screen shots the voltages on the MOSI, MISO and SCK lines are wrong, the CS is ok.

I’ve tried other diodes and resistors and it’s the same thing. Am I overlooking something?

Maybe 1Kohm on R1 is too much resistance? Try 220 ohms instead. If your o-scope lead is connected to the 3.3v input of the SD card, it appears you are not getting sufficient voltage on the 3.3v side.

edit: Insure the zener diode is connected correctly! If connected backwards, it will cause a similar voltage pattern.

I found a cd4050 buffer chip, hooked it up and it works. I connected the MISO line directly from the SD module to the Arudino pin. My resistor/zener diode method probably did not work because I used a level shifter on the MISO line, I'll have to do a test.

Stick with the 4050. It is a better solution.

SurferTim: Stick with the 4050. It is a better solution.

of course I will, and prolly will order some more, however I'm still curious why the first method didn't work.

Other than the CD4050 what other chip from the CD or 74HC family could be used for level shifting, do you know?