Привет 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 и вдруг такие грабли с другой. Откликнитель, плз, кто в курсе дела.