реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
Arlleex
сообщение Nov 14 2011, 23:38
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 15 2011, 00:18
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Arlleex @ Nov 15 2011, 03:38) *
Далее проверять биты ответа R7 нет смысла, поскольку первый байт его мы уже приняли, но, как я и говорил, не в том виде, в котором хотелось бы получить: 0x05 [illegal command].

Ну, если на SCK ничего лишнего нет, то остается заключить, что карта все-таки не поддерживает CMD8. Как я уже писал, реакция в этом случае бывает разной - некоторые отвечают illegal command, другие молчат. Вполне можно допустить, что наблюдаемая картина является вариантом нормы (ведь фактически это молчание), а 0xC17F - не более чем совпадение. Недаром процедура проверки включает в себя сравнение отправленного и принятого аргумента - разработчики стандарта, по всей видимости, хотели застраховаться от возможных случайностей.

Возьмите для теста карту, которая точно должна ответить на CMD8 (любая HC). Вообще, лучше всегда иметь не менее полудюжины разных карт для экспериментов.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Nov 15 2011, 07:57
Сообщение #18


Местный
***

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



Цитата(aaarrr @ Nov 15 2011, 04:18) *
Ну, если на SCK ничего лишнего нет, то остается заключить, что карта все-таки не поддерживает CMD8. Как я уже писал, реакция в этом случае бывает разной - некоторые отвечают illegal command, другие молчат. Вполне можно допустить, что наблюдаемая картина является вариантом нормы (ведь фактически это молчание), а 0xC17F - не более чем совпадение. Недаром процедура проверки включает в себя сравнение отправленного и принятого аргумента - разработчики стандарта, по всей видимости, хотели застраховаться от возможных случайностей.

Возьмите для теста карту, которая точно должна ответить на CMD8 (любая HC). Вообще, лучше всегда иметь не менее полудюжины разных карт для экспериментов.

Совпадение с чем?
Спасибо, попробую другую карту (еще найти бы) sm.gif
Кстати, нашел тут такую же проблему у наших зарубежных камрадов:
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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 15 2011, 09:49
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Arlleex @ Nov 15 2011, 11:57) *
Спасибо, попробую другую карту (еще найти бы) sm.gif

А если на той же карте попробовать, скажем, CMD58?

Цитата(Arlleex @ Nov 15 2011, 11:57) *
Совпадение с чем?
...
Кстати, нашел тут такую же проблему у наших зарубежных камрадов:

Совпадение с ожидаемым ответом. У зарубежных камрадов карта точно не должна была отвечать illegal command, раз она HC.

Но выглядит странно, да. NRC не забыто случайно?
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Nov 15 2011, 10:11
Сообщение #20


Местный
***

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



Цитата
...NRC не забыто случайно?

Оно не забыто циклом постоянной передачи значения 0xFF SD карте памяти, ведь в течение этого времени она будет передавать в ответ такое же значение 0xFF.
Именно циклом опроса ответа (отличающегося от 0xFF) и определяется, прошло ли время NCR, и по его окончании принимается байт ответа.

Насчет команды CMD58 скажу чуть позже, для нее CRC не важно вроде как?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 15 2011, 11:04
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 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 не важно, пока не включите вручную.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Nov 15 2011, 11:23
Сообщение #22


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 15 2011, 12:24
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Nov 15 2011, 13:30
Сообщение #24


Местный
***

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



Вот видимо из за этого времени NRC и были проблемы.
Сейчас, после получения ответа на CMD0, отправил 0xFF и затем отправил команду CMD8 после чего принял ответ R7 с содержанием старшего байта (R1), равным 0x01, что соответствует спецификации 2.0 или позднее.
Верно?
Кстати, как скачать ваш документ, отсюда не получается.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 15 2011, 13:35
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Arlleex @ Nov 15 2011, 17:30) *
Верно?

Похоже на то.

Цитата(Arlleex @ Nov 15 2011, 17:30) *
Кстати, как скачать ваш документ, отсюда не получается.

Странно, счетчик идет.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Nov 15 2011, 16:35
Сообщение #26


Местный
***

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



Все, нашел.
Ну что же, большое человеческое спасибо Вам, aaarrr.
Надеюсь, если снова возникнут проблемы, Вы снова откликнитесь wink.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 15 2011, 16:39
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Arlleex @ Nov 15 2011, 20:35) *
Надеюсь, если снова возникнут проблемы, Вы снова откликнитесь wink.gif

Да без проблем wink.gif
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Nov 15 2011, 17:41
Сообщение #28


Местный
***

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



Добрался до команды CMD58.
Что собственно она у меня представляет:
[0x7A 00 00 00 00 FD]
Проверяю ответ, 10 раз команду повторяю, и он один и тот же:
R3=0x01 00 FF 80 00
Хотя бит Card power up status bit уже наверняка должен быть установлен, поскольку этот бит устанавливается, когда происходит стабилизация питающего напряжения.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 15 2011, 17:46
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Arlleex @ Nov 15 2011, 21:41) *
Хотя бит Card power up status bit уже наверняка должен быть установлен, поскольку этот бит устанавливается, когда происходит стабилизация питающего напряжения.

Он должен не установиться, а, наоборот, сброситься.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Nov 15 2011, 17:49
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 16:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01514 секунд с 7
ELECTRONIX ©2004-2016