Почему отправка CMD58 через SPI на SD-карту моего класса 10 возвращает 0x01 вместо 0x00? - PullRequest
2 голосов
/ 17 июня 2019

Я пытаюсь инициализировать SD-карту, используя шину SPI и плату обнаружения STM32F4. Я в основном полагаюсь на реализацию Elm Chan функции disk_initialize в примере кода, чтобы основать свою собственную реализацию. К сожалению, я столкнулся с проблемой, когда отправка CMD58 на SD-карту во время процесса инициализации возвращает результат 0x01, что означает, что SD-карта простаивает. Тем не менее, я все еще вижу следующие четыре байта с SD-карты как 0x00, 0xFF, 0x80, 0x00, которые находятся в правильном формате для ответа R3. Тем не менее, я не уверен, могу ли я доверять этим четырем байтам в качестве своего OCR.

На данный момент я пытался не обращать внимания на то, что SD-карта работает на холостом ходу, и просто пытался использовать следующие четыре байта в качестве OCR, но, похоже, код не работает в других точках во время процесса монтирования относительно типа карты. предполагается из OCR.

if (Timer1 && SD_SendCmd(CMD58, 0) == 0) { 
      for (n = 0; n < 4; n++) {
        ocr[n] = SPI_RxByte();
      }  
      type = (ocr[0] & 0x40) ? 6 : 2;  
}

В приведенном выше фрагменте кода я впервые вижу пустой ответ. SD_SendCmd - это то место, куда я отправляю CMD58 на SD-карту и где я получаю 0x01 как самый левый байт пятибайтового ответа. Поскольку я не получаю 0x00, что свидетельствует о том, что на SD-карте нет проблем с переданной ей командой, код прерывается в процессе инициализации и возвращает ошибку. Я был бы очень признателен за любую помощь в этом вопросе, так как в течение некоторого времени я был озадачен этим возвращаемым значением 0x01. Спасибо!

1 Ответ

0 голосов
/ 11 июля 2019

Итак, я смог разобраться в проблеме. Оказывается, что я использовал карту SDHC, где HC обозначает высокую емкость. В соответствии с упрощенной спецификацией SD-карты CRC, который отправляется в конце передачи команды, должен иметь младший значащий бит, установленный в 1. Итак, ИЛИ CRC с 0x01 перед любой из передач позволяют мне инициализировать и используйте любой тип SD-карты. Так что проблема, с которой я столкнулся, была не из CMD58, а из-за того, как я имел дело с CRC в целом. Интересно, что отсутствие ORC CRC, кажется, прекрасно работает с SD-картами не большой емкости. Но ORing CRC с 0x01, кажется, работает со всеми картами (по крайней мере, насколько я тестировал).

...