На самом деле, большая часть информации / кода, которую вы можете найти при инициализации 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 необходимо:
CMD0arg:, 0x0CRC: 0x95(response:) 0x01- обратите внимание, что в случае 0xFFискаженного ответа вы должны просто повторить этот шаг; см. ниже для получения дополнительной информации.
CMD8arg:, 0x000001AACRC: 0x87(response:, 0x01за которым следует echo of arg, в данном случае 0x000001AA) - хотя может показаться, что эта команда необязательна, она полностью обязательна для новых карт. Хотя 0x1AAэто обычное значение arg, вы можете передавать и другие значения; см. «Таблица 7-5. Работа платы для CMD8 в режиме SPI», стр. 108 в спецификации для деталей.
3a. CMD55Arg: 0x0КПР: любой, на 0x65самом деле (ответ: 0x01, CMD55будучи префикс каждый ACMD , если ответ 0x05, у вас есть старая карта - повторить CMD1с Arg 0x0[CRC 0xF9] вместо CMD55/ ACMD41)
3b. ACMD41, arg:, 0x40000000CRC: any, 0x77фактически (обратите внимание, что этот аргумент предполагает, что карта является картой HCS, как это обычно бывает; используйте 0x0arg [CRC 0xE5] для более старых карт). Если ответ 0x0, ты в порядке; если это так 0x01, переходите к 3а; если это так 0x05, см. примечание к нему выше (в 3а.); если это не так, то с этим что-то не так (см. также ниже).
CMD1CMD0CMD8CMD55ACMD41CMD55ACMD41CMD0CMD8CMD1CMD1CMD55ACMD41CMD10x05NN00xFFCMD0NCMD00xFF0x01CMD8
Обратите внимание, что ответы, которые имеют установленный 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предварительного выпуска. Кроме того, часы, как правило, не являются проблемой, если они находятся в разумных пределах.