На самом деле, большая часть информации / кода, которую вы можете найти при инициализации SD, либо датирована, либо неточна, поскольку она предшествует SDHC и SDXC по годам. В настоящее время процедура более сложная, так как она заставляет работать со старым оборудованием обратно-совместимым способом.
Во-первых, как упоминалось другими, выберите низкую начальную тактовую частоту (обычно в диапазоне 100 кГц - 400 кГц; используйте 400 кГц, если это возможно); позже вы сможете переключиться на более высокие часы, если устройство это позволяет. В то время как новые карты могут безопасно выдерживать тактовую частоту МГц, старые будут жаловаться (т.е. не общаться или возвращать мусор).
Следующее, что вы не должны использовать CMD1
для инициализации карт SD / SDHC / SDXC, если ваша карта не распознает CMD55
/ ACMD41
; как сказано в спецификации SD-карты:
В любом случае CMD1 не рекомендуется, поскольку хосту может быть трудно различить MultiMediaCard и SD Memory Card.
Некоторые контроллеры (в основном новые и более емкие карты) просто останутся в бездействии, если вы CMD1
их выдадите . Сначала вы должны выполнить CMD8 0x1AA
команду reset ( CMD0
), а затем попытаться использовать CMD55 + ACMD41
. Если и только если это не поможет, используйте CMD1
.
tl; dr для инициализации карты в режиме SPI необходимо:
CMD0
arg:, 0x0
CRC: 0x95
(response:) 0x01
- обратите внимание, что в случае 0xFF
искаженного ответа вы должны просто повторить этот шаг; см. ниже для получения дополнительной информации.
CMD8
arg:, 0x000001AA
CRC: 0x87
(response:, 0x01
за которым следует echo of arg, в данном случае 0x000001AA
) - хотя может показаться, что эта команда необязательна, она полностью обязательна для новых карт. Хотя 0x1AA
это обычное значение arg, вы можете передавать и другие значения; см. «Таблица 7-5. Работа платы для CMD8 в режиме SPI», стр. 108 в спецификации для деталей.
3a. CMD55
Arg: 0x0
КПР: любой, на 0x65
самом деле (ответ: 0x01
, CMD55
будучи префикс каждый ACMD
, если ответ 0x05
, у вас есть старая карта - повторить CMD1
с Arg 0x0
[CRC 0xF9
] вместо CMD55
/ ACMD41
)
3b. ACMD41
, arg:, 0x40000000
CRC: any, 0x77
фактически (обратите внимание, что этот аргумент предполагает, что карта является картой HCS, как это обычно бывает; используйте 0x0
arg [CRC 0xE5
] для более старых карт). Если ответ 0x0
, ты в порядке; если это так 0x01
, переходите к 3а; если это так 0x05
, см. примечание к нему выше (в 3а.); если это не так, то с этим что-то не так (см. также ниже).
CMD1
CMD0
CMD8
CMD55
ACMD41
CMD55
ACMD41
CMD0
CMD8
CMD1
CMD1
CMD55
ACMD41
CMD1
0x05
NN0
0xFF
CMD0
NCMD0
0xFF
0x01
CMD8
Обратите внимание, что ответы, которые имеют установленный MSB, но 0xFF
обычно не предполагают, что ваш SPI получил сдвиг в тактировании (в результате, например, сброса Vcc, который обычно происходит, когда вы выполняете горячее подключение SD). Чтобы это исправить, вы можете попробовать полностью перезагрузить устройство (включение / выключение питания, деактивация / активация S̲S̲ и т. Д.); это обычно работает.
Также в спецификации сказано
После последней транзакции по шине карты памяти SD хост должен предоставить 8 (восемь) тактовых циклов, чтобы карта могла завершить операцию перед выключением часов.
Это может работать без него, но так как 8 циклов = 1 выходной байт SPI, это не сильно повредит, и просто хорошо иметь его.
Обратите внимание, что вы должны утверждать низкий уровень S̲S̲ (он же CS) по крайней мере до и после каждого CMD
- это абсолютно обязательно в случае CMD0
(устройство не включается без него) и, в действительности, требуется для всех остальных, CMD
если у вас есть стандарты SD-карта Постоянное подключение карты S̲S card к GND может показаться постояннымбудет хорошей идеей, если карта является единственным SPI-клиентом, к которому когда-либо подключится ваш хост, поскольку это избавит вас от вывода вывода UC и от необходимости вообще управлять им по коду, а также потому, что карта должна предполагать, что она выбрана все времени. В действительности, некоторые карты (если не большинство из них) на самом деле ожидают включения наклона от высокого к низкому уровню вместо того, чтобы просто определять низ, и, таким образом, сердиться, если вы вообще не переключаете бит S̲S then, а затем либо запаздываете часы или плевок мусора; некоторые (обычно новые) карты должны работать, некоторые (старые) могут не работать, YMMV (еще раз). Тем не менее, для любой более надежной конфигурации SPI (> 1 подчиненного устройства) не забывайте утверждать низкий уровень перед любой фактической транзакцией с данной SD-картой.
Кроме того, хотя в спецификации сказано, что CRC должен быть только в режиме SPI CMD0
и CMD8
должен иметь его, для некоторых карт SD (например, Transcend) требуется соответствующий CRC для CMD55
/ ACMD41
- если вы хотите быть в безопасности, просто используйте для них предварительно рассчитанное значение.
Кроме того, хотя SPI сам по себе не требует подтягиваний / падений, выбрасывание 47K в MISO может быть хорошей идеей; некоторые устройства оставляют свои выводы DO высокой Z при определенных обстоятельствах (например, не инициализируются), и плавающие контакты всегда могут быть источником странных проблем. Если ваш УК имеет 3,3 Vcc, вы можете использовать внутренние подтягивания; если это 5В, не делайте этого, если ваша линия MISO уже не имеет правильной логической трансляции 5-> 3.3В.
Дальнейшее чтение:
Как использовать MMC / SDC
Спецификации SD, часть 1 Упрощенная спецификация физического уровня Упрощенная спецификация - наиболее важные разделы 6.4.1 Включение питания и 7.2.1 Выбор и инициализация режима с рисунком 7-1 : Диаграмма состояния карты памяти SD (режим SPI)
CMD8
предварительного выпуска. Кроме того, часы, как правило, не являются проблемой, если они находятся в разумных пределах.Может быть, это слишком поздно, но ответ с карты в порядке! После CMD0 ответ должен быть 0x01 - это означает, что карта находится в состоянии IDLE и готова к работе. Если у вас есть что-то вроде 0b00000101, то 1 на 2-м месте говорит, что это недопустимая команда, а 1 на 0-м месте говорит, что sard все еще находится в состоянии IDLE и готов к работе. Если ответ 0x00, это означает, что карта НЕ находится в состоянии IDLE, и вы должны отправить еще одну команду RESET.
источник
I tried this, but I am getting 01 even for CDM1
- получение IDLE в ответCMD1
на NOT OK. Вы не решаете его настоящую проблему своим «ответом».