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

 
 
> SDHC тормозит
avp
сообщение Jun 19 2009, 13:47
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 10-10-06
Пользователь №: 21 175



Привет All!
Замаялся с сабж. Карта SDHC 4 Gb от Toshiba. Режим SPI. Контакты 8 и 9 подтянуты к "+" через резисторы 10К. Макс. частота SPI_CLK на которой добился ее "работоспособности" 40 кГц...

При этом, MMC 16 Mb (другой нет) на том же не скоростном в смысле разводки "железе" и том же коде (после инициализации) легко работает на 1.5 мГц. Видимо дело все же в пресловутой инициализации SDHC.
Кратко алгоритм для SDHC без ветвей обработки других типов карт:

СMD_GO_IDLE_STATE
CMD_SEND_IF_COND //(возврат pattern нормальный)

for (ACMD41_RETRY_CNT){
СMD_APP_CMD
CMD_SD_SEND_OP_COND //(с параметром 0x40000000 - поднять HCS)

if (R1_OK) // responce R1 OK?
break;

Delay1sec(); // 1 сек задержка
}

====== Начало общей части для любого типа карт ======
CMD_READ_OCR // после первой же попытки (через 1 сек) возвращает
POWER_UP=OK, HCS=1
SPI_Mode(FAST_SPI); // поднял скорость
SD_SRC(OFF);
SD_SET_BLOCKLEN(512); // по-идее, здесь "возможен/должен быть" параметр 2048, но он и 1024 или 4096 возвращают
// Illegal Command
SD_RD_Sector(ROOT_DIR,DEV_EXCH_BUF); // читаю сектор - одни 0x0.

===============================================
О том, какие еще варианты пробовал не пишу - не помогает. Впечатление такое, что карта живет своей асинхронной жизнью. Если задать SPI_CLK порядка 300 Гц, то в буфере чтения можно найти отдельные последовательности реальных данных.
Возможно может быть ключом следующее:

Если "крутить ACMD41 в связке с CMD_READ_OCR", то в определенный момент самый младший разряд OCR выставляется в 1.
После этого сбрасывается в 0. Вопрос - зачем производитель выставляет на обозрение бит, зарезервированный для его нужд? Но как сие "прокачать" пока не нашел.

Т.е. цикл выглядит так:
Cnt = ACMD41_RETRY_CNT;

do {
СMD_APP_CMD
CMD_SD_SEND_OP_COND //(с параметром 0x40000000 - поднять HCS)
// 1 сек задержку не включаем
CMD_READ_OCR

if (OCR_BIT0) {
... // возможно тут надо как-то подтолкнуть инициализацию?
}

Cnt--;
} while (!OCR_POWER_UP_BIT & Cnt);
===============================================

Буду крайне признателен за помощь - подгружаю DEV_EXCH_BUF с одной стороны по DMA и вдруг такие грабли с другой. Откликнитель, плз, кто в курсе дела.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Jun 19 2009, 14:10
Сообщение #2


Гуру
******

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



Цитата(avp @ Jun 19 2009, 17:47) *
CMD_SD_SEND_OP_COND //(с параметром 0x40000000 - поднять HCS)

Кроме HCS нужно еще и напряжение указать, очень возможно, что карта именно поэтому и не работает. Попробуйте такие параметры:
Код
#define    SDHC_HCS_CCS    (1UL << 30)
#define    SDHC_VHS_TP        ((1UL << 8) | 0xaa)                /* 2.7-3.6V */
#define    SDHC_OP_CONDS    (SDHC_HCS_CCS | (1UL << 20))    /* HCS, 3.2-3.3V */

SDHC_VHS_TP - аргумент для SEND_IF_COND, там тоже указывается напряжение.

Цитата(avp @ Jun 19 2009, 17:47) *
SD_SET_BLOCKLEN(512); // по-идее, здесь "возможен/должен быть" параметр 2048, но он и 1024 или 4096 возвращают

У SDHC размер блока всегда 512.
Go to the top of the page
 
+Quote Post
avp
сообщение Jun 20 2009, 06:13
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 10-10-06
Пользователь №: 21 175



Цитата(aaarrr @ Jun 19 2009, 17:10) *
Кроме HCS нужно еще и напряжение указать, очень возможно, что карта именно поэтому и не работает. Попробуйте такие параметры:
Код
#define    SDHC_HCS_CCS    (1UL << 30)
#define    SDHC_VHS_TP        ((1UL << 8) | 0xaa)                /* 2.7-3.6V */
#define    SDHC_OP_CONDS    (SDHC_HCS_CCS | (1UL << 20))    /* HCS, 3.2-3.3V */

SDHC_VHS_TP - аргумент для SEND_IF_COND, там тоже указывается напряжение.


У SDHC размер блока всегда 512.

Для SEND_IF_COND указывал, а для SEND_OP_COND нет. Т.к. не работало и OCR в ответе все равно содержал все возможные напряжения, то отказался от принудительного указания напряжения.
Спасибо за подсказку. В понедельник попробую.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 10:43
Рейтинг@Mail.ru


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