Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SDHC microSD card and SPI initialization

Tags:

spi

I have a 32 GB Kingston SDHC microSD card which has to communicate to MSP430F2618 via SPI. I was not able to initialize it by using CMD55 + ACMD41 (with bit30 set to 1), as it is described in SD specification paper. What works is this sequence:

  CMD0, arg: 0         , CRC: 0x95 (response:0x01)
  CMD8, arg: 0x1AA     , CRC: 0x87 (response:0x01)
  CMD1, arg: 0x40000000, CRC: 0xFF (response:0x00)

I tried it also with a 8 GB SanDisk card and works for that too. So actually, I am using CMD1 here, not ACMD41, with HCS bit set to 1. However, it is not stable, sometimes it works, sometimes it does not. This may be about hardware.

Is it not strange that cards are responding to CMD1 with argument 0x40000000?

like image 573
user1039871 Avatar asked Nov 10 '11 14:11

user1039871


People also ask

What is SPI mode for SD card?

The SPI mode is an alternative operating mode that is defined to use the MMC/SD cards on microcontrollers without a native host interface. The MMC/SD can be used on a microcontroller via a generic SPI interface or some GPIO ports. Therefore, the SPI mode is suitable for low cost embedded applications.

Do SD cards use SPI?

SD cards use the Serial Peripheral Interface (SPI) protocol to communicate with microcontrollers and other computers. SPI is a synchronous serial protocol that supports two-way communication between a controller device such as a microcontroller and a peripheral device like an SD card reader.

Is initializing an SD card the same as formatting?

Initialization is also referred to as 'formatting'. If you are intending to re-use a memory card which is already full of data, you would remove all data from the memory card by initializing, or formatting it.


1 Answers

You shouldn't use CMD1 to initialize SDHC cards; as said in the SD Card specification:

In any of the cases CMD1 is not recommended because it may be difficult for the host to distinguish between MultiMediaCard and SD Memory Card.

Some controllers (newer and higher capacity cards mostly) will simply stay in IDLE if you issue CMD1 to them. You should first issue CMD8 0x1AA after the reset (CMD0), and then use CMD55 + ACMD41.

tl;dr to initialize the card you should:

  1. CMD0 arg: 0x0, CRC: 0x95 (response: 0x01)

  2. CMD8 arg: 0x000001AA, CRC: 0x87 (response: 0x01)

  3. CMD55 arg: 0x0, CRC: any (CMD55 being the prefix to every ACMD)

  4. ACMD41 , arg: 0x40000000, CRC: any

  5. if response: 0x0, you're OK; if it's 0x1, goto 3.

Note that most cards require steps 3/4 to be repeated, usually once, i.e. the actual sequence is CMD0/CMD8/CMD55/ACMD41/CMD55/ACMD41 - to be sure, try it n times (select n within your reason), and assume fail if it doesn't.

Also, note that you should assert S̲S̲ (aka CS) low at least before and after CMD0 - and, in reality, probably always when sending any command to the SD card.

like image 144
Walid BR Avatar answered Oct 11 '22 12:10

Walid BR