Инициализация карты microSD с использованием интерфейса SPI - PullRequest
17 голосов
/ 05 июня 2009

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

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

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

  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 ГБ.

Как мне решить эту проблему?

Ответы [ 5 ]

16 голосов
/ 07 июня 2009

Кажется, я нашел проблему. Когда я вычисляю правильный CRC для CMD55 и отправляю его вместо фиктивного CRC, команда принимается (результат 0x01). Если вы посмотрите на спецификацию физического уровня в разделе 7.2.2, там явно сказано, что:

Интерфейс SPI по умолчанию инициализируется в режиме CRC OFF. (кроме команд CMD0 и CMD8).

Это не относится к данной серии карт Transcend, что нарушает спецификацию. Также в случае ошибки CRC ответ должен быть 0x09 вместо 0x05. Я пытался явно отключить проверку CRC с помощью CMD59, но, похоже, это не помогает.

=> Расчет правильного CRC для (всех?) Команд приводит к работе карты.

Я связался с поддержкой Transcend по этому поводу. Если я узнаю что-то полезное, я узнаю здесь.

Обратите внимание, что раньше я использовал другие 2 ГБ карты Transcend, но они были сделаны на Тайване, а новая - в Корее (и, похоже, карта Samsung (MMAGR02GUDCA)).

2 голосов
/ 31 июля 2013

Вы сказали, что использовали CRC 0 для неудачной команды. Я предполагаю, что вы имели в виду, что вы отправили весь последний байт как 0x00. Обратите внимание, что CRC7 - это только первые 7 битов последнего байта - последний бит, называемый end bit, всегда должен быть 1. Поэтому, если вы отправляете 0x00 в качестве последнего байта, а 0 в качестве последнего бита, ошибка будет понятна, и даже код ошибки будет иметь смысл. Если вы отправите 1 как последний бит, он должен работать, т.е. используйте что-то вроде 0x01 или 0xFF в качестве последнего байта.

2 голосов
/ 11 мая 2012

У меня была почти такая же проблема. При отправке ACMD41 я отправил CMD55, а затем CMD41. Ответ для CMD55 был 0x01, указывая на состояние бездействия и запуск процесса инициализации (я думаю, это нормально). CMD41 ответит 0x05, указывая на недопустимую команду. Оказывается, что моя конкретная карта выполняет проверку CRC по умолчанию, даже в режиме SPI, и ошибочно сообщает об ошибках CRC как недопустимые команды (то есть не соответствует спецификации SD). Когда я рассчитываю правильный CRC, он работает нормально. Вот код вычисления CRC7, который я использовал, он хорошо сработал для меня:

https://github.com/hazelnusse/crc7

Если вы не позаботились об отключении проверки CRC, я думаю, что, вероятно, лучше предположить, что она не отключена, и убедиться, что вы вычисляете правильный CRC для каждого командного кадра. Из того, что я могу сказать, некоторые карты отключают его по умолчанию в режиме SPI, а другие включают его, хотя в спецификации SD указано, что он должен быть отключен по умолчанию в режиме SPI, за исключением CMD8.

1 голос
/ 11 августа 2014

При отправке CMD0 только с выбором микросхемы (0) плата не инициализируется в режиме SPI. Это только устанавливает режим SPI. Карта не инициализируется до тех пор, пока не будет принят ACMD41. Тогда CRC выключен по умолчанию.

1 голос
/ 05 июня 2009

Это нормально, скорее всего, это внутренний зарядный насос, используемый для создания напряжения стирания, которое занимает больше времени, чем обычно, чтобы быть готовым ... вы должны настаивать на комбинации CMD55 + ACMD41, пока не закончится инициализация.

CMD58 также может помочь вам проверить правильность подачи напряжения (иногда у розеток возникают проблемы с контактами).

...