SDHC-карта microSD и инициализация SPI

У меня есть 32 ГБ карта памяти Kingston SDHC microSD, которая должна связываться с MSP430F2618 через SPI. Я не смог инициализировать его с помощью CMD55 + ACMD41 (бит 30 установлен в 1), как описано в спецификации SD. Что работает, эта последовательность:

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

Я попробовал это также с картой памяти SanDisk на 8 ГБ и работает для этого также. Так что на самом деле я использую здесь CMD1, а не ACMD41, с битом HCS, установленным в 1. Однако он нестабилен, иногда работает, иногда нет. Это может быть о железе.

Разве не странно, что карты отвечают на CMD1 аргументом? 0x40000000?

1 ответ

Вы не должны использовать CMD1 инициализировать SDHC-карты; как сказано в спецификации SD-карты:

В любом из случаев CMD1 не рекомендуется, поскольку хосту может быть сложно различить MultiMediaCard и SD Memory Card.

Некоторые контроллеры (в основном новые и более емкие карты) просто останутся в режиме ожидания, если вы выдадите CMD1 им. Вы должны сначала выпустить CMD8 0x1AA после сброса (CMD0), а затем использовать CMD55 + ACMD41,

tl;dr для инициализации карты вы должны:

  1. CMD0 Arg: 0x0CRC: 0x95 (ответ: 0x01)

  2. CMD8 Arg: 0x000001AACRC: 0x87 (ответ: 0x01)

  3. CMD55 Arg: 0x0CRC: любой (CMD55 быть приставкой к каждому ACMD)

  4. ACMD41, arg: 0x40000000CRC: любой

  5. если ответ: 0x0, ты в порядке; если это 0x1Перейти к 3.

Обратите внимание, что большинство карт требуют повторения шагов 3/4, как правило, один раз, т.е. CMD0/CMD8/CMD55/ACMD41/CMD55/ACMD41 - чтобы быть уверенным, попробуйте n раз (выберите n в пределах вашей причины), и предположим, что потерпим неудачу, если это не так.

Кроме того, обратите внимание, что вы должны утверждать S̲S̲ (он же CS) минимум как минимум до и после CMD0 - и, в действительности, вероятно всегда при отправке какой-либо команды на SD-карту.

Другие вопросы по тегам