|
SDHC vs SD. Идентификация карты., Не устанавливается "power-up status bit" в OCR |
|
|
|
Mar 28 2008, 10:25
|

Местный
  
Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719

|
Порядок инициализации: Код send_comstr( CMD_0, 0, 6); ocr = 0; do { send_comstr(CMD_55, 0, 6); send_comstr(ACMD_41, ocr, 6); ocr = (comstr->arg3)|(comstr->arg2<<8)|(comstr->arg1<<16)|(comstr->arg0<<24); } while (!(comstr->arg0 & 0x80)); У обычной SD через два-три цикла бит power-up устанавливается. SDHC отвечает, ответные аргументы и crc совпадают с SD, но power-up не устанавливается. Нормального даташита на HC нет. Может там другой порядок идентификации.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 20)
|
Mar 29 2008, 13:32
|
Местный
  
Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490

|
Цитата(KAlex @ Mar 28 2008, 13:25)  Порядок инициализации: Код send_comstr( CMD_0, 0, 6); ocr = 0; do { send_comstr(CMD_55, 0, 6); send_comstr(ACMD_41, ocr, 6); ocr = (comstr->arg3)|(comstr->arg2<<8)|(comstr->arg1<<16)|(comstr->arg0<<24); } while (!(comstr->arg0 & 0x80)); У обычной SD через два-три цикла бит power-up устанавливается. SDHC отвечает, ответные аргументы и crc совпадают с SD, но power-up не устанавливается. Нормального даташита на HC нет. Может там другой порядок идентификации. См. ссылку в посте (про команду CMD8) - http://electronix.ru/forum/index.php?showtopic=35898
|
|
|
|
|
Mar 30 2008, 07:31
|

Местный
  
Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719

|
Я правильно делаю? После CMD0 посылаю CMD8 - не отвечает. SD не HC тоже не отвечают, но работают(power-up устанавливается). Код send_comstr( CMD_0, 0, 6); ocr = 0; do { send_comstr( CMD_8, 0, 6); // !!! нет ответа send_comstr(CMD_55, 0, 6); send_comstr(ACMD_41, ocr, 6); ocr = (comstr->arg3)|(comstr->arg2<<8)|(comstr->arg1<<16)|(comstr->arg0<<24); } while (!(comstr->arg0 & 0x80)); На 55 и 41 отвечает. Работаю с ARM7 под Jtag. Проходил пошагово. В софте ошибок нет. И может главное - работаю в SD-mode.
|
|
|
|
|
Apr 9 2008, 07:13
|

Местный
  
Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719

|
Цитата(skripach @ Apr 8 2008, 15:38)  1)Как посчитать CRC для разных команд? или где взять посчитаные? Код unsigned char calc_crc7(unsigned char *ptr, signed char count ){ char crc=0; unsigned char i,data; while (count--) { data=*ptr++; for (i=0;i<8;i++) { crc <<= 1; if ((data & 0x80)^(crc & 0x80)) crc ^=0x09; data <<= 1; } } return((crc<<1)|1); } Цитата(skripach @ Apr 8 2008, 15:38)  2)И команды и ответы на команды по линии CMD? Да. Цитата(skripach @ Apr 8 2008, 15:38)  3)В SD-mode данные поступают по 4-м линиям, порядок бит? Как распазнаётся первый байт данных? Всегда старшим вперед. При 4-линиях старшая тетрада вперед. После отсылки команды на чтение данных ждем(не забывая CLC) "0" на DAT0 - это стартовый бит. Далее пошли данные.
|
|
|
|
|
Apr 10 2008, 22:59
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
В архиве моя функция по расчету CRC7 с подробнейшими коментариями + пример 'ручного' расчета + дока по CRC вообще. Надеюсь кому-то будет полезно. P.S. Возможно функция не самая оптимальная но работает.
Прикрепленные файлы
CRC7.rar ( 282.14 килобайт )
Кол-во скачиваний: 224
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Apr 14 2008, 06:59
|

Местный
  
Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719

|
Цитата(skripach @ Apr 13 2008, 14:56)  cmd0 - ответа нет cmd55 - отвечает 37 00 00 01 20 83 acmd41 - ответа нет На 41 должна отвечать. 3f 00 ff 80 00 ff или подобное. Карта случаем не HC?
|
|
|
|
|
Apr 20 2008, 07:59
|

Местный
  
Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719

|
Цитата(skripach @ Apr 11 2008, 01:59)  В архиве моя функция по расчету CRC7 Я пошел дальше. По скольку работаю с ARM, памяти немеряно, решил сделать табличный вариант. Таблица генерится в RAM при запуске, далее по определению. !! !! Скорость общения с картой поднялась на порядок! Код #define CRC7_POLYNOMIAL 0x89 /* x^7 + x^3 + 1 */ static unsigned char crc7_syndrome_table[256];
void gen_crc7_syndrome_table (void) { int i, j, syndrome; for (i = 0; i < 256; ++i) { syndrome = ((i & 0x80) != 0)? i ^ CRC7_POLYNOMIAL : i; for (j = 0; j < 7; ++j) if (((syndrome <<= 1) & 0x80) != 0) syndrome ^= CRC7_POLYNOMIAL; crc7_syndrome_table[i] = (unsigned char) syndrome; } }
char crc7 (const unsigned char *ptr) { unsigned char i, crc7_accum = 0; for (i = 0; i < 5; ++i) // 6 - адаптировано для SD crc7_accum = crc7_syndrome_table[(crc7_accum << 1) ^ *ptr++]; return ((crc7_accum<<1)|1); // адаптировано для SD (+ стоп бит) }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|