Какова правильная последовательность команд для инициализации карты microSD в SPI?

18

Я пытаюсь связать карту microSD (2 ГБ, Kingston, Sandisk) с контроллером Silicon Labs C8051F931 .

Я очень смущен последовательностью, которой я должен следовать для инициализации. В книге Проекты SD-карт с использованием микроконтроллера PIC на странице 135 упоминается:

Поэтому шаги для переключения SD-карты в режим SPI должны быть следующими: Включение
питания.
• Отправьте не менее 74 тактовых импульсов на карту с CS и контурами данных, установленными на логику «1».
• Установите низкую линию CD.
• Отправьте 6-байтовую команду CMD0 «40 00 00 00 00 95», чтобы перевести карту в режим SPI.
• Проверьте ответ R1, чтобы убедиться, что биты ошибок не установлены.
• Повторно отправляйте команду CMD1 до тех пор, пока бит «in-idle-state» в ответе R1 не будет установлен на «0»,
и пока не будут установлены биты ошибок. Теперь карта готова к операциям чтения / записи.

Я попробовал это, но я получаю 01 даже для CDM1. 00 ожидается.

Также здесь я вижу другую последовательность команд, где он отправляет CMD8 после CMD0. Но книга говорит, что я должен отправить CMD1.

Какова правильная последовательность?

gpuguy
источник

Ответы:

34

На самом деле, большая часть информации / кода, которую вы можете найти при инициализации 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 необходимо:

  1. CMD0arg:, 0x0CRC: 0x95(response:) 0x01- обратите внимание, что в случае 0xFFискаженного ответа вы должны просто повторить этот шаг; см. ниже для получения дополнительной информации.

  2. 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)

vaxquis
источник
4

Спецификации для SD-карт доступны на sdcard.org . Упрощенная версия не учитывает некоторые детали, но вы должны взглянуть, например, на рисунок 7-2 в части 1, где объясняются последовательности инициализации для SDHC и SD-карт.

Карты MicroSD <= 2 ГБ могут работать как старые карты, поэтому 0x00в CMD1 конечном итоге они должны дать вам результат . Для этого может потребоваться несколько повторных попыток, поскольку карта может использовать внешние часы с шины SPI для управления внутренней обработкой.

Turbo J
источник
2

В дополнение к отличному ответу @vaxquis, я хотел бы процитировать соответствующую таблицу из « Упрощенная спецификация физического уровня, версия 4.10 , © SD 2001-2013 SD Group (Panasonic, SanDisk, Toshiba) и Ассоциация SD Card» (Рисунок 7-2 : Поток инициализации режима SPI):

Последовательность инициализации SPI SD-карты

Здесь вы можете увидеть, какие команды отправлять, в каком порядке и какие ответы нам сообщают о типе карты. Я думаю, что желательно, чтобы устройство поддерживало как можно больше карт; и до тех пор, пока речь идет об основных операциях чтения и записи блоков по 512 байт, это должно быть выполнимо по крайней мере для всех карт SD и HC V1.x и V2.0.

JimmyB
источник
2

Я предлагаю это как еще одну возможность. В режиме SPI Samsung MicroSD EVO 32GB требует, чтобы все коды команд имели действительные коды CRC. Могу поспорить, они не единственные. Я прочитал комментарий, где человек полагал, что все карты выше 32 ГБ могут быть такими. Я отлаживал ошибку более недели. Мой код не будет работать, пока все коды, отправленные на карту, не будут иметь действительных кодов CRC. Я использовал это для вычисления всех кодов CRC https://github.com/hazelnusse/crc7/blob/master/crc7.cc Я даже пытался использовать команду 59 для отключения кодов CRC, нет. Надеюсь, это сэкономит кому-то еще много времени и сил.

Мой код инициализации со значениями CRC ..

Power On..
Clock card at least 74 (I use 80) cycles with cs high
CMD0 0, crc=0x95
CMD8 0x01aa, crc=0x87
CMD58 0, crc=0xfd
CMD55 0, crc=0x65
CMD41 0x40000000, crc=0x77
CMD9 0, crc=0xaf
CMD16, 512, crc=0x81 (If you want block length of 512)

Some random other commands..
CMD17 0, crc=0x3b (Read one block)
CMD18 0, crc=0x57 (Read multiple blocks)
CMD24 0, crc=0x6f (set write address for single block)
CMD25 0, crc=0x03 (set write address for first block)
Дейв
источник
-2

Вы уверены, что ваша шина SPI работает на частоте 400 кГц? Инициализация должна происходить с шиной SPI, работающей на частоте 400 кГц, до тех пор, пока SD-карта не сообщит, что она находится в состоянии ожидания, после чего может быть увеличена тактовая частота шины SPI (точный максимум, кажется, варьируется от производителя к производителю, но кажется 12 МГц - безопасная ставка для большинства карт).

Кроме того, согласно этому: http://elm-chan.org/docs/mmc/mmc_e.html CMD1 является правильной инициализацией. CMD8 требуется только для запроса диапазона напряжения, что не должно быть проблемой для карт без SDHC (<= 2 ГБ).

Zuofu
источник
на самом деле, многие SD-карты (в основном более новые, моя Sony SR-32C4 32ГБ одна) не запускаются вообще без CMD8предварительного выпуска. Кроме того, часы, как правило, не являются проблемой, если они находятся в разумных пределах.
vaxquis
-3

Может быть, это слишком поздно, но ответ с карты в порядке! После CMD0 ответ должен быть 0x01 - это означает, что карта находится в состоянии IDLE и готова к работе. Если у вас есть что-то вроде 0b00000101, то 1 на 2-м месте говорит, что это недопустимая команда, а 1 на 0-м месте говорит, что sard все еще находится в состоянии IDLE и готов к работе. Если ответ 0x00, это означает, что карта НЕ находится в состоянии IDLE, и вы должны отправить еще одну команду RESET.

Пека
источник
ты вообще прочитал вопрос? OP ясно сказал I tried this, but I am getting 01 even for CDM1- получение IDLE в ответ CMD1на NOT OK. Вы не решаете его настоящую проблему своим «ответом».
vaxquis