|
Опять 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.
Подобная ситуация воспроизводится и с нулевым сектором и с любым другим, т.е. режим адресации, вроде, не причем.
Может у кого-то было что-то похожее? Уже не знаю, что делать…
|
|
|
|
|
 |
Ответов
|
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 перед исполнении команды.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|