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