Do not use this SD card module with 5V Arduinos

[Edit: See the last post in this thread for a module that does have level shifting.]

If you search for a standard-size SD card module on the net, you will likely find one that looks like this:

This one is made by LC Technology, but there may be other brands that use the same circuit.

Since all SD cards (standard and micro) are 3.3V devices, the question arises as to how the four Arduino 5V data lines are interfaced to the corresponding SD 3.3V pins. Based on pictures, I thought this LC module had inline series resistors in those lines. They would allow protection diodes on the SD pins to shunt any excess voltage above, say, 3.9V to Vcc, but the inline resistors would limit the current flowing through the diodes. There may have been modules like that in the past.

But I was wrong. I ordered this LC module and traced out the circuit, and the resistors you see are not inline current-limiting resistors. They are 10K pullup resistors to 3.3V. I found a schematic for this module, and it is attached.

When driven at 5V by an Arduino GPIO port pin, such a pullup resistor has essentially no effect on anything. The full 5V is connected directly to the SD pin. If there is a protection diode there, current will flow out of the GPIO port pin through the diode until the output voltage of the port pin drops to 3.9V. That could be quite a few milliamps. And in theory, if enough of the pins are high, enough current could pass through the protection diodes to power the SD card in full, shut down the 3.3V regulator on the module, and raise the SD’s Vcc pin to 4.4V.

If there are no protection diodes on the SD card pins, then the card could be destroyed if those pins are not “5V tolerant”. I’ve seen no datasheet for SD cards that suggests they are.

I don’t know what over-voltage protections are built into SD cards. But even though this module is advertised as providing both 3.3V and 5V input, I think it is clearly a bad choice for use with a 5V processor of any kind. The most likely victim is the SD card, but damage to the Arduino through excess current flow is also a possibilty. What’s amazing to me is that this module apparently does actually work at 5V in some cases. At least for a while.

MicroSD card modules, on the other hand, typically have level-shifting ICs that convert the 5V signals to 3.3V. They work fine. I don’t know why standard-size SD modules don’t also include these ICs.

A modification that might be used to make these SD card modules usable with 5V processors is to insert diodes in series in the three processor SPI output lines - MOSI, CLK, and CS. This is done by connecting diodes between the relevant module header pins and the corresponding SD holder pins, then cutting the original traces that made those connections. The diodes are oriented with the anodes at the holder and the cathodes at the header, so the processor can ground the SD pins, but cannot take them up to 5V. The 3.3V pullup resistors on the module (MOSI and CLK) or in the SD card itself (CS) then provide the correct 3.3V high input when the processor is not bringing the lines low.

I’ve tried this fix using 1N914/1N4148 signal diodes, and it works with the CardInfo and ReadWrite example sketches. But that doesn’t mean they would work at speed. A better choice would be Schottky diodes, which would bring the SD pins a little lower when the processor wants them low.

This is a lot of trouble to go to even for a small number of modules. A better solution would be to add a level shifter I/C as is done with microSD modules.

MartinPrescott has found a standard size SD module with voltage translation:

This should work fine with 5V Arduinos.