Инициализация карты microSD с использованием интерфейса SPI
Вопрос
я использую микроSD карта во встроенном дизайне.Карта подключается к микроконтроллеру через интерфейс SPI.Это работало нормально для всех карт, которые я использовал раньше, но теперь моя новая карта не инициализируется.Это карта памяти Transcend microSD емкостью 2 ГБ (TS2GUSD).
После отправки начального тактового сигнала для переключения в режим SPI я делаю следующее:
CMD0 (аргумент 0, CRC 0x95) -> Ответ 0x01 -> ОК
CMD8 (аргумент 0x000001AA, CRC 0x87) -> Ответ 0x01 0x000001AA -> означает, что это карта SDC V2+, поддерживается диапазон напряжений 2,7–3,6 В -> ОК
Затем я должен отправить команду ACMD41, но при отправке CMD55 (аргумент 0, CRC 0), который должен предшествовать CMD41, я получаю ответ 0x05 -> Недопустимая команда.Я также пытался отправить CMD1 (для карт MMC), но он выдает аналогичное незаконная команда ответ.Код отлично работает с моей картой microSD Sandisk емкостью 2 ГБ.
Как мне решить эту проблему?
Решение
Кажется, я нашел проблему.Когда я вычисляю правильный CRC для CMD55 и отправляю его вместо фиктивного CRC, команда принимается (результат 0x01).Если вы посмотрите на спецификация физического уровня в разделе 7.2.2 прямо сказано, что:
По умолчанию интерфейс SPI инициализируется в режиме CRC OFF.(кроме команд CMD0 и CMD8).
Похоже, что это не относится к этой серии карт Transcend, что нарушает спецификацию.Также в случае ошибки CRC ответ должен быть 0x09 вместо 0x05.Я пытался явно отключить проверку CRC с помощью CMD59, но это, похоже, не помогает.
=> Вычисление правильного CRC для (всех?) команд заставляет карту работать.
Я обращаюсь по этому поводу в службу поддержки Transcend.Если я узнаю что-то полезное, я сообщу вам об этом здесь.
Обратите внимание, что раньше я использовал другие карты Transcend на 2 ГБ, но они были произведены на Тайване, а новая — в Корее (и, похоже, это карта Samsung (MMAGR02GUDCA)).
Другие советы
У меня была почти такая же проблема.При отправке ACMD41 я отправил CMD55, а затем CMD41.Ответом на CMD55 был 0x01, указывающий на состояние ожидания и запуск процесса инициализации (я думаю, это нормально).CMD41 ответит 0x05, что указывает на недопустимую команду.Оказывается, моя конкретная карта выполняет проверку CRC по умолчанию, даже в режиме SPI, и ошибочно сообщает об ошибках CRC как о незаконных командах (т. Е. Не соответствует спецификации SD).Когда я вычисляю правильный CRC, он работает нормально.Вот код расчета CRC7, который я использовал, он мне помог:
https://github.com/hazelnusse/crc7
Если вы не позаботились об отключении проверки CRC, я думаю, что, вероятно, лучше предположить, что она не отключена, и убедиться, что вы рассчитываете правильную CRC для каждого командного кадра.Насколько я могу судить, некоторые карты отключают его по умолчанию в режиме SPI, а другие включают, хотя в спецификации SD указано, что он должен быть отключен по умолчанию в режиме SPI, за исключением CMD8.
Ты сказал, что использовал CRC 0
для неудачной команды.Я предполагаю, что вы имели в виду, что отправили весь последний байт как 0x00
.Обратите внимание, что CRC7 — это только первые 7 бит последнего байта — последний бит, называемый end bit
всегда должно быть 1
.Итак, если вы отправляли 0x00
в качестве последнего байта, с 0
в качестве последнего бита сбой будет понятен, и даже код ошибки будет иметь смысл.Если вы отправите 1
как последний бит, он должен работать, т.е.используйте что-то вроде 0x01
или 0xFF
как последний байт.
Это нормально, скорее всего, внутренний зарядный насос, используемый для создания напряжения стирания, готов к работе дольше, чем обычно...вам придется настаивать на сочетании CMD55+ACMD41 до завершения инициализации.
CMD58 также может помочь вам проверить, подаете ли вы правильный уровень напряжения (иногда в розетках возникают проблемы с контактами).
Отправка CMD0 только с помощью выбора чипа (0) не инициализирует карту в режиме SPI.Это только устанавливает режим SPI.Карта не инициализируется до тех пор, пока ACMD41 не вернет подтверждение.Тогда CRC отключен по умолчанию.