|
|
  |
SDC: ответ на CMD8 не корректен |
|
|
|
Nov 14 2011, 23:38
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Посмотрел осциллограмму сигнала на линии SPCK во время передачи команды CMD0 и затем CMD8. Последовательность такая у меня: 1) 80 синхроимпульсов при CS="1"; 2) CMD0 [0x40 00 00 00 00 95]; 3) CMD8 [0x48 00 00 01 AA 87]; Заканчиваю опрос линии MISO, когда в регистре данных прием SPI содержится значение, отличающееся от 0xFF. На осциллограмме картина такая: все передается четко по 8 бит, сначала 80 импульсов, затем 8 пачек по 8 импульсов (6 байт команда - и 2 раза опрос линии MISO до получения ответа R1 [0x01]), затем небольшая задержка, в течение которой выключается SPI и еще раз включается для передачи команды CMD8. Далее - снова 8 пачек по 8 импульсов (опять же 6 байт команда и 2 байта опрос линии MISO до получения ответа R7 (значения, отличного от 0xFF)). Соответственно, что получается: первая пачка импульсов команды CMD8 - отправили 0x48; вторая пачка импульсов команды CMD8 - отправили 0x00; третья пачка импульсов команды CMD8 - отправили 0x00; четвертая пачка импульсов команды CMD8 - отправили 0x01; пятая пачка импульсов команды CMD8 - отправили 0xAA; шестая пачка импульсов команды CMD8 - отправили 0x87; седьмая пачка импульсов команды CMD8 - отправляем 0xFF для ожидания ответа, отличающегося от 0xFF (при этом проверяем ответ, сейчас он равен 0xFF); восьмая пачка импульсов команды CMD8 - отправляем 0xFF и в этот раз получаем ответ 0xC1.
Далее проверять биты ответа R7 нет смысла, поскольку первый байт его мы уже приняли, но, как я и говорил, не в том виде, в котором хотелось бы получить: 0x05 [illegal command].
Сообщение отредактировал Arlleex - Nov 14 2011, 23:40
|
|
|
|
|
Nov 15 2011, 00:18
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Arlleex @ Nov 15 2011, 03:38)  Далее проверять биты ответа R7 нет смысла, поскольку первый байт его мы уже приняли, но, как я и говорил, не в том виде, в котором хотелось бы получить: 0x05 [illegal command]. Ну, если на SCK ничего лишнего нет, то остается заключить, что карта все-таки не поддерживает CMD8. Как я уже писал, реакция в этом случае бывает разной - некоторые отвечают illegal command, другие молчат. Вполне можно допустить, что наблюдаемая картина является вариантом нормы (ведь фактически это молчание), а 0xC17F - не более чем совпадение. Недаром процедура проверки включает в себя сравнение отправленного и принятого аргумента - разработчики стандарта, по всей видимости, хотели застраховаться от возможных случайностей. Возьмите для теста карту, которая точно должна ответить на CMD8 (любая HC). Вообще, лучше всегда иметь не менее полудюжины разных карт для экспериментов.
|
|
|
|
|
Nov 15 2011, 07:57
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Цитата(aaarrr @ Nov 15 2011, 04:18)  Ну, если на SCK ничего лишнего нет, то остается заключить, что карта все-таки не поддерживает CMD8. Как я уже писал, реакция в этом случае бывает разной - некоторые отвечают illegal command, другие молчат. Вполне можно допустить, что наблюдаемая картина является вариантом нормы (ведь фактически это молчание), а 0xC17F - не более чем совпадение. Недаром процедура проверки включает в себя сравнение отправленного и принятого аргумента - разработчики стандарта, по всей видимости, хотели застраховаться от возможных случайностей.
Возьмите для теста карту, которая точно должна ответить на CMD8 (любая HC). Вообще, лучше всегда иметь не менее полудюжины разных карт для экспериментов. Совпадение с чем? Спасибо, попробую другую карту (еще найти бы)  Кстати, нашел тут такую же проблему у наших зарубежных камрадов: K <<< 4GB Sandisk SDHC
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 40 00 00 00 00 95 FF 01 48 00 00 01 AA 87 FF C1 7F FF FF FF <<< also 0xC1 ???Источник: http://embdev.net/topic/214834
Сообщение отредактировал Arlleex - Nov 15 2011, 08:01
|
|
|
|
|
Nov 15 2011, 09:49
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Arlleex @ Nov 15 2011, 11:57)  Спасибо, попробую другую карту (еще найти бы)  А если на той же карте попробовать, скажем, CMD58? Цитата(Arlleex @ Nov 15 2011, 11:57)  Совпадение с чем? ... Кстати, нашел тут такую же проблему у наших зарубежных камрадов: Совпадение с ожидаемым ответом. У зарубежных камрадов карта точно не должна была отвечать illegal command, раз она HC. Но выглядит странно, да. NRC не забыто случайно?
|
|
|
|
|
Nov 15 2011, 10:11
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Цитата ...NRC не забыто случайно? Оно не забыто циклом постоянной передачи значения 0xFF SD карте памяти, ведь в течение этого времени она будет передавать в ответ такое же значение 0xFF. Именно циклом опроса ответа (отличающегося от 0xFF) и определяется, прошло ли время NCR, и по его окончании принимается байт ответа. Насчет команды CMD58 скажу чуть позже, для нее CRC не важно вроде как?
|
|
|
|
|
Nov 15 2011, 11:04
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Arlleex @ Nov 15 2011, 14:11)  Оно не забыто циклом постоянной передачи значения 0xFF SD карте памяти, ведь в течение этого времени она будет передавать в ответ такое же значение 0xFF. Именно циклом опроса ответа (отличающегося от 0xFF) и определяется, прошло ли время NCR, и по его окончании принимается байт ответа. Я имел в виду именно NRC, а не NCR. После получения ответа от карты нужно выдать один пустой байт при нулевом CS перед следующей командой. Цитата(Arlleex @ Nov 15 2011, 14:11)  Насчет команды CMD58 скажу чуть позже, для нее CRC не важно вроде как? В SPI не важно, пока не включите вручную.
|
|
|
|
|
Nov 15 2011, 11:23
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Цитата Я имел в виду именно NRC, а не NCR. После получения ответа от карты нужно выдать один пустой байт при нулевом CS перед следующей командой. Пустой - значит 0x00 или 0xFF? Нет, такой задержки не выдерживал, да и не было указано в спецификации на SD (по крайней мере в моей), так же как и не было указано выдерживать 80 импульсов перед подачей команды CMD0. Можете ли вы скинуть ссылку или прикрепить сюда файл вашей спецификации, поскольку, чувствую, что что-то не то у меня. (У меня спецификация версии 2.00 физический уровень, и почему-то с сокращениями, не указано нигде никаких временных диаграмм, и т.д.). // Передача команды CMD0 SPI_Enable(AT91C_BASE_SPI0); // Включение SPI0 SPI_Write(AT91C_BASE_SPI0, 1, 0x40); // Запись первого байта команды CMD0 response=SPI_Read(AT91C_BASE_SPI0); // В ответе 0xFF SPI_Write(AT91C_BASE_SPI0, 1, 0x00); // Запись второго байта команды CMD0 response=SPI_Read(AT91C_BASE_SPI0); // В ответе 0xFF SPI_Write(AT91C_BASE_SPI0, 1, 0x00); // Запись третьего байта команды CMD0 response=SPI_Read(AT91C_BASE_SPI0); // В ответе 0xFF SPI_Write(AT91C_BASE_SPI0, 1, 0x00); // Запись четвертого байта команды CMD0 response=SPI_Read(AT91C_BASE_SPI0); // В ответе 0xFF SPI_Write(AT91C_BASE_SPI0, 1, 0x00); // Запись пятого байта команды CMD0 response=SPI_Read(AT91C_BASE_SPI0); // В ответе 0xFF SPI_Write(AT91C_BASE_SPI0, 1, 0x95); // Запись шестого(последнего) байта команды CMD0 response=SPI_Read(AT91C_BASE_SPI0); // В ответе 0xFF while(response==0xFF) { SPI_Write(AT91C_BASE_SPI0, 1, 0xFF); // Сдвиг "1" на линию данных response=SPI_Read(AT91C_BASE_SPI0); // Чтение данных } SPI_Write(AT91C_BASE_SPI0, 1, 0x00); // Запись шестого(последнего) байта команды CMD0 response=SPI_Read(AT91C_BASE_SPI0); // В ответе 0xFF SPI_Disable(AT91C_BASE_SPI0); // Отключение SPI0 //******************************************************************************** ********************** // Передача команды CMD8 SPI_Enable(AT91C_BASE_SPI0); // Включение SPI0 SPI_Write(AT91C_BASE_SPI0, 1, 0x7A); // Запись первого байта команды CMD0 response=SPI_Read(AT91C_BASE_SPI0); // В ответе 0xFF SPI_Write(AT91C_BASE_SPI0, 1, 0x00); // Запись второго байта команды CMD0 response=SPI_Read(AT91C_BASE_SPI0); // В ответе 0xFF SPI_Write(AT91C_BASE_SPI0, 1, 0x00); // Запись третьего байта команды CMD0 response=SPI_Read(AT91C_BASE_SPI0); // В ответе 0xFF SPI_Write(AT91C_BASE_SPI0, 1, 0x00); // Запись четвертого байта команды CMD0 response=SPI_Read(AT91C_BASE_SPI0); // В ответе 0xFF SPI_Write(AT91C_BASE_SPI0, 1, 0x00); // Запись пятого байта команды CMD0 response=SPI_Read(AT91C_BASE_SPI0); // В ответе 0xFF SPI_Write(AT91C_BASE_SPI0, 1, 0xFD); // Запись шестого(последнего) байта команды CMD0 response=SPI_Read(AT91C_BASE_SPI0); // В ответе 0xFF while(response==0xFF) { SPI_Write(AT91C_BASE_SPI0, 1, 0xFF); // Сдвиг "1" на линию данных response=SPI_Read(AT91C_BASE_SPI0); // Чтение данных } USART_Write(AT91C_BASE_US0, response, 0); SPI_Disable(AT91C_BASE_SPI0); // Отключение SPI while(1); }В USART после передачи команды CMD58 приходит тот же ответ, первый байт 0xC1, и, допустим, даже если сдвинуть на несколько битов влево, получим нелегальную команду, а это означает (по блок-схеме из спецификации), что данная карта памяти не является SD.
Сообщение отредактировал Arlleex - Nov 15 2011, 11:48
|
|
|
|
|
Nov 15 2011, 12:24
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Arlleex @ Nov 15 2011, 15:23)  Пустой - значит 0x00 или 0xFF? 0xFF. Удобно отправлять его после получения ответа перед снятием CS. Цитата(Arlleex @ Nov 15 2011, 15:23)  Можете ли вы скинуть ссылку или прикрепить сюда файл вашей спецификации, поскольку, чувствую, что что-то не то у меня. (У меня спецификация версии 2.00 физический уровень, и почему-то с сокращениями, не указано нигде никаких временных диаграмм, и т.д.).
Part1.pdf ( 649.69 килобайт )
Кол-во скачиваний: 842Для работы достаточно этого и имеющейся у вас упрощенной 2.0
|
|
|
|
|
Nov 15 2011, 13:35
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Arlleex @ Nov 15 2011, 17:30)  Верно? Похоже на то. Цитата(Arlleex @ Nov 15 2011, 17:30)  Кстати, как скачать ваш документ, отсюда не получается. Странно, счетчик идет.
|
|
|
|
|
Nov 15 2011, 16:35
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Все, нашел. Ну что же, большое человеческое спасибо Вам, aaarrr. Надеюсь, если снова возникнут проблемы, Вы снова откликнитесь
|
|
|
|
|
Nov 15 2011, 17:49
|

Местный
  
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264

|
Цитата(aaarrr @ Nov 15 2011, 21:46)  Он должен не установиться, а, наоборот, сброситься. Цитата Bit 31 - Card power up status bit, this status bit is set if the card power up procedure has been finished. ... The Card Capacity Status bit is valid after the card power up procedure is completed and the card power up status bit is set to 1.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|