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 для инициализации карты вы должны:
CMD0
Arg:0x0
CRC:0x95
(ответ:0x01
)CMD8
Arg:0x000001AA
CRC:0x87
(ответ:0x01
)CMD55
Arg:0x0
CRC: любой (CMD55
быть приставкой к каждомуACMD
)ACMD41
, arg:0x40000000
CRC: любойесли ответ:
0x0
, ты в порядке; если это0x1
Перейти к 3.
Обратите внимание, что большинство карт требуют повторения шагов 3/4, как правило, один раз, т.е. CMD0
/CMD8
/CMD55
/ACMD41
/CMD55
/ACMD41
- чтобы быть уверенным, попробуйте n
раз (выберите n
в пределах вашей причины), и предположим, что потерпим неудачу, если это не так.
Кроме того, обратите внимание, что вы должны утверждать S̲S̲ (он же CS) минимум как минимум до и после CMD0
- и, в действительности, вероятно всегда при отправке какой-либо команды на SD-карту.