Инициализация SD-карты в проблемах SPI

Я взглянул на Инициализацию вопроса о Переполнении стека карты памяти microSD с помощью интерфейса SPI и не видел ответов, которые соответствовали моей проблеме (то есть, вещи, которые я уже не попробовал).

У меня есть подобная проблема, где я пытаюсь получить доступ к SD-карте через интерфейс SPI микроконтроллера (конкретно HC908). Я попробовал после блок-схем на Физическом уровне Упрощенную Спецификацию v2.00, и это, кажется, инициализирует правильно на Transcend 1 ГБ и 2 ГБ и карте на 1 ГБ AE&C. Но у меня есть проблемы на трех других случайных картах от моего притона старых карт, которые я использовал на своей камере.

Мой код является всем ассемблером HC908. Я определил объем строки часов SPI, и во время инициализации она выполняет приблизительно 350 кГц (единственный множитель скорости, который HC908 предоставляет в моей низкой тактовой частоте MCU, которая находится в пределах окна на 100 - 400 кГц).

Вот результаты трех карт, которые не завершают мою стандартную программу инициализации (все сделанные последовательно, не изменяя кода или синхронизируя параметры):

Canon 16Meg card (labeled as SD):
Set card select high
Send 80 SPI clock cycles (done by writing 0xFF 10 times)
Set card select low
Send CMD0 [0x400000000095] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x01 (indicates idle)
Send CMD8 [0x48000001AA87] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x05 (idle and illegal command)
Because illegal command set local flag to indicate v1 or MMC card
Send CMD58 [0x7A00000000FD] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x05 (idle and illegal command)
because illegal command branch to error routine
Send CMD13 [0x4D000000000D] (show status buffer) and Loop up to 8 times waiting for high bit on response to go low
R1= 0x05 (idle and illegal command)

Флаг запрещенной команды застревает? Я должен делать что-то после CMD8 для очистки того флага?

SanDisk UltraII 256Meg
Set card select high
Send 80 SPI clock cycles (done by writing 0xFF 10 times)
Set card select low
Send CMD0 [0x400000000095] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x01 (idle)
Send CMD8 [0x48000001AA87] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x05 (idle and illegal command)
Because illegal command set local flag to indicate v1 or MMC card
Send CMD58 [0x7A00000000FD] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x01 (idle)
Send 0xFF 4 times to read OCR
OCR = 0xFFFFFFFF
Send CMD55 [0x770000000065] (1st part of ACMD41) and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x01 (idle)
Send CMD41 [0x6900000000E5] (2nd part of ACMD41) and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x05 (idle and illegal command)
Because illegal command, assume card is MMC
Send CMD1 [0x4100000000F9] (for MMC) and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x05 (idle and illegal command)
Repeat the CMD1 50 times (my arbitrary number to wait until idle clears)
Every R1 response is 0x05 (idle and illegal command)

Почему является OCR всем F? Не кажется надлежащим вообще. Кроме того, почему ACMD41 и CMD1 отвечают запрещенная команда? CMD1 перестал работать, потому что карта ожидает допустимого ACMD после CMD55 даже с ответом запрещенной команды?

SanDisk ExtremeIII 2G:
Set card select high
Send 80 SPI clock cycles (done by writing 0xFF 10 times)
Set card select low
Send CMD0 [0x400000000095] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x01 (idle)
Send CMD8 [0x40000001AA87] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x7F (??? My loop shows the responses for each iteration and I got 0xFF 0xFF 0xC1 0x7F... is the card getting out of sync?)
Send CMD58 [0x7A00000000FD] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x01 (idle and back in sync)
Send 0xFF 4 times to read OCR
OCR = 0x00FF80
Send CMD55 [0x770000000065] (1st part of ACMD41) and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x5F (??? loop responses are 0xFF 0xFF 0xF0 0x5F... again out of sync?)
Send CMD41 [0x6900000000E5] (2nd part of ACMD41) and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x05 (idle and illegal command, but back in sync???)
Because illegal command, assume card is MMC
Send CMD1 [0x4100000000F9] (for MMC) and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x7F (??? loop responses are 0xFF 0xFF 0xC1 0x7F... again out of sync?)
Repeat CMD1 and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x01 (idle)
Repeat CMD1 and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x7F (??? loop responses are 0xFF 0xFF 0xC1 0x7F... again out of sync?)
Repeat CMD1 and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x00 (out of idle)
Send CMD9 [0x4900000000AF] (get CSD) and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x3F (??? loop responses are 0xFF 0xFF 0xC1 0x3F... again out of sync?)
Code craps out because Illegal command bit is high.

Что же, спрашивается, является неправильным с той картой?

Иногда это находится в синхронизации, другие времена нет. (Вышеупомянутый шаблон повторяем.) я определил объем этого, и я не вижу, что любые такты жулика проходят между передачами MOSI/MISO.

11
задан Community 23 May 2017 в 12:02
поделиться

2 ответа

OK... Я нашел свою проблему. Для всех, кто столкнулся с этой проблемой, важно помнить, что после получения ответа нужно отправить дополнительный 0xFF. Это дает карте дополнительные восемь тактов, чтобы подготовиться к следующей команде. Некоторые карты не нуждаются в этом (например, Transcends, который я использую), но другим это необходимо.

На самом деле я поместил простой цикл в начало моей процедуры 'write command', который посылает 0xFF, пока не получит 0xFF в качестве ответа, просто чтобы не ходить по разным местам, где я читаю ответы, чтобы убедиться, что я поместил дополнительную посылку 0xFF. Потому что, насколько SD-карта (обычно) заинтересована в режиме SPI, если нет поступающих тактовых циклов, время стоит на месте.

Одна вещь, которую я заметил и на которую еще не нашел ответа (но пока что это ничему не мешает), после того, как я прочитал 16 байт CSR, кажется, есть дополнительные 2 байта не0xFF, которые выходят... Это CRC16? Странно, поскольку в CSR встроен CRC...

23
ответ дан 3 December 2019 в 03:18
поделиться

Если вы включили CRC (с CMD59), то да, к блокам данных будет добавлен CRC16.

Для получения дополнительной информации см. «Упрощенная спецификация физического уровня, версия 2.00», главы «Защита передачи данных по шине» и «Чтение данных».

3
ответ дан 3 December 2019 в 03:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: