Инициализация карты microSD с использованием интерфейса SPI

StackOverflow https://stackoverflow.com/questions/955587

  •  11-09-2019
  •  | 
  •  

Вопрос

я использую микроSD карта во встроенном дизайне.Карта подключается к микроконтроллеру через интерфейс SPI.Это работало нормально для всех карт, которые я использовал раньше, но теперь моя новая карта не инициализируется.Это карта памяти Transcend microSD емкостью 2 ГБ (TS2GUSD).

После отправки начального тактового сигнала для переключения в режим SPI я делаю следующее:

  1. CMD0 (аргумент 0, CRC 0x95) -> Ответ 0x01 -> ОК

  2. 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 отключен по умолчанию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top