|
Опять SD карта, проблема с CMD17 |
|
|
|
Jan 26 2012, 15:38
|
Знающий
   
Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458

|
Всем привет!
Проблема с SD картой, работаю в режиме SPI на частоте 4MHz.
С иницилизацией как-то гладко все получилось. Шлю команды CMD0, CMD8, CMD55, ACMD41, CMD16 со всей сопутствующей логикой – читаю OCR регистр анализирую биты Busy и CCS, отличаю CDHC и SDSC, смотрю режим адресации, при необходимости выставляю 255 байт.
Проблемы начинаются при попытке прочитать сектор CMD17. Сначала вычитываю R1=00, потом жду 0xFE и читаю 255 байт.
Две карты читаются замечательно (SDHC 4Gb и SDSC 1Gb).
А две карты (SDSC 2Gb и SDSC 128Mb) возвращают полную ерунду – 99% байт не совпадают с реальным содержимым нулевого сектора, а два последних байта почему-то всегда совпадают 0x55, 0xAA.
Подобная ситуация воспроизводится и с нулевым сектором и с любым другим, т.е. режим адресации, вроде, не причем.
Может у кого-то было что-то похожее? Уже не знаю, что делать…
|
|
|
|
|
 |
Ответов
(1 - 12)
|
Jan 27 2012, 04:12
|
Знающий
   
Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458

|
Цитата(aaarrr @ Jan 26 2012, 19:51)  Если с нулевым, то можно заподозрить путаницу с нулевым логическим/физическим. А вообще, включите CRC - все сразу станет понятно. А разве CMD17 может работать с логическими секторами??? Это же понятие структуры FAT, ни контроллер ни CMD17 понятия не имеют о FАT. Или я что-то путаю? На отправку команды - вставлял корректный код CRC7, та-же картина, на прием - не пробовал это'ж надо код для подсчета CRC16 написать.
|
|
|
|
|
Jan 27 2012, 11:19
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(AndreyVN @ Jan 27 2012, 08:12)  А разве CMD17 может работать с логическими секторами??? Это же понятие структуры FAT, ни контроллер ни CMD17 понятия не имеют о FАT. Или я что-то путаю? Я имел в виду путаницу в той части, в которой вы смотрите "реальное" содержимое сектора. Карта, разумеется, ничего не знает о структуре диска. Цитата(AndreyVN @ Jan 27 2012, 08:12)  На отправку команды - вставлял корректный код CRC7, та-же картина, на прием - не пробовал это'ж надо код для подсчета CRC16 написать. Да что там этого кода: Код const unsigned short sd_crc16_table_a[16] = { 0x0000, 0x1231, 0x2462, 0x3653, 0x48c4, 0x5af5, 0x6ca6, 0x7e97, 0x9188, 0x83b9, 0xb5ea, 0xa7db, 0xd94c, 0xcb7d, 0xfd2e, 0xef1f };
const unsigned short sd_crc16_table_b[16] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef };
unsigned short sd_crc16(unsigned char *buff, unsigned int len) { unsigned char data; unsigned short crc = 0;
while(len--) { data = *buff++ ^ (crc >> 8); crc = (sd_crc16_table_a[(data & 0xf0) >> 4] ^ sd_crc16_table_b[data & 0x0f]) ^ (crc << 8); } return crc; }
|
|
|
|
|
Jan 27 2012, 11:31
|
Знающий
   
Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458

|
Цитата(aaarrr @ Jan 27 2012, 15:19)  Я имел в виду путаницу в той части, в которой вы смотрите "реальное" содержимое сектора. Карта, разумеется, ничего не знает о структуре диска. Это могло-бы все объяснить! Смотрю, действительно, через карт-ридер и WinHex. Цитата Да что там этого кода: Спасибо!!! О результатах доложу.
|
|
|
|
|
Jan 27 2012, 18:13
|
Знающий
   
Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458

|
Цитата(AndreyVN @ Jan 27 2012, 15:31)  Это могло-бы все объяснить! Смотрю, действительно, через карт-ридер и WinHex. CRC16 считается идеально. То есть карта возвращает корректные данные с корректрой CRC, которые не имеют ничего общего с тем, что показывает WinHex. Картина воспроизводится на 3х SD-картах из 5. Интересно, что последовательность байт которую читает контроллер, вообще не находится WinHex'ом при поиске по всей карте. Напрашивается версия о "битых" или еще как-то скрытых секторах, которые Windows не показывает. (???) Форматирование тоже ничего не меняет. К стати, проверку СRC (CMD59) можно было и не включать, все карточки не зависимо от CMD59 возвращают после данных, прочитанных CMD17 корректную CRC. Фактически, CMD59 включает только проверку CRC7 перед исполнении команды.
|
|
|
|
|
Jan 27 2012, 19:28
|
Знающий
   
Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458

|
Цитата(aaarrr @ Jan 27 2012, 22:26)  Можете привести дамп "неправильного" нулевого сектора? 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 19 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 82 1C 03 00 0B 50 CA C6 00 20 00 00 00 C0 EC 00 00 00 1D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA CRC= 68C0
|
|
|
|
|
Jan 28 2012, 07:11
|
Знающий
   
Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458

|
Цитата(aaarrr @ Jan 27 2012, 23:49)  Дык это таблица разделов с одним разделом FAT32 на 120МБайт. Только битая таблица. Да, действительно, похоже, но с множественными ошибками. 1BE = 00 (1) 0 - раздел не активный; 1BF=82 (1) Номер головки для начального сектора раздела 1C0=03,00 (2)Номер сектора и цилиндра для начального сектора 1C2=0B (1) не подходит (0 - неизвестная система; 1, 4 – DOS); 1С3=50 (1)Номер головки для последнего сектора раздела. 1С4=СА,C6 (2)Номер сектора и цилиндра для последнего сектора раздела 1С6=00,20,00,00 (4)Относительный номер сектора начала раздела 1СA=C0,EC,00,00 (4) Размер раздела в секторах =3236691968 dec. Тем не менее, продолжил поиски этих данных средствами Windows - нету! Достаточно задать поиск кода CA он находится только один раз в самом последнем секторе карточки, который забит мусором (карта только из магазина, содержит FAT32 и нули во всех секторах кроме последнего). Попробую зайти с другой стороны - писать контоллером и смотеть Windows, где оно появилось...
|
|
|
|
|
Jan 28 2012, 10:37
|
Знающий
   
Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458

|
Цитата(aaarrr @ Jan 28 2012, 12:44)  Откройте её в WinHEX'е как физический диск - должно быть все видно. Точнно, открыл как физический диск - все совпало! А я неделю бился, все смотрел на опцию "физический сектор", думал, что раз она неподсвечена, значит он и есть физический. Еще раз спасибо!  PS: А поиск не находил цепочку байт, потому, что она в Unpartitioned space.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|