Инициализация карты 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 отключен по умолчанию.