Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SDHC тормозит
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам
avp
Привет 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 и вдруг такие грабли с другой. Откликнитель, плз, кто в курсе дела.
aaarrr
Цитата(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.
avp
Цитата(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 в ответе все равно содержал все возможные напряжения, то отказался от принудительного указания напряжения.
Спасибо за подсказку. В понедельник попробую.
avp
Цитата(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.


Вчера не мог проверить - сегодня вновь день потерян. Что-то записать/прочесть из SDHC можно только на самой малой скорости.

Вы правы - по даташиту команда SD_SEND_OP_COND в режиме запроса (как было у меня - параметр=0), не производит инициализацию. К тому же, перед использованием этой команды необходимо разрешить CRC. Возможно я вновь что-то не учел, но похоже есть какой-то нюанс. Ведь и картинку про требуемую 1 сек задержку не сразу найдешь в этих доках. Пишут просто - повторяйте ACMD41 пока не инициируется.

Снова привожу псевдокод, но уже с побайтной расшифровкой команд (кому-то может пригодится):

80 холостых циклов SPI (запись 0xff)
SD_CS=0; // разрешили карту
CMD_CRC(ON); // Разрешили проверку CRC - 0x7B,0x00,0x00,0x00,0x01,0x83
CMD_GO_IDLE_STATE; // 0x40,0x00,0x00,0x00,0x00,0x95
CMD_SEND_IF_COND; // 0x48,0x00,0x00,0x01,0xAA,0x87

if (!IF_COND_PATTERN) // Проверяем ответ карты
return UNUSABLE_CARD;

// Паттерн 0xAA получен и напряжения поддерживаются
for (RetrCntr){
APP_CMD; // 0x77,0x00,0x00,0x00,0x00,0x65
CMD_SD_SEND_OP_COND; // 0x69,0x40,0xFF,0x80,0x00,0x17 - инициируем и запрашиваем поддержку всех напряжений

if (resp.R1 == 0) // Инициализация закончена?
break;

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

if (!RetrCnt)
return UNUSABLE_CARD;

// Проверяем закончен ли PowerUp, поддерживаются ли запрошенные напряжения и определяем тип карты
CMD_READ_OCR; // 0x7A,0x40,0x00,0x00,0x00,0x6F

if (!resp.POWER_UP || !resp.VOLT_REQUESTED)
return UNUSABLE_CARD;

SPI_MODE(FAST); // Поднял скорость
CMD_CRC(OFF); // Запретили проверку CRC - 0x7B,0x00,0x00,0x00,0x00,0x91

и т.д.
В чем же я ошибаюсь?
aaarrr
Хм, а какой смысл включать CRC непосредственно перед GO_IDLE_STATE, которая по сути является software reset?

У меня последовательность такая:
80CLK
CMD0
CMD8
ACMD41
CMD59 - CRC On
CMD58 - Read OCR
avp
Цитата(aaarrr @ Jun 23 2009, 19:07) *
Хм, а какой смысл включать CRC непосредственно перед GO_IDLE_STATE, которая по сути является software reset?

У меня последовательность такая:
80CLK
CMD0
CMD8
ACMD41
CMD59 - CRC On
CMD58 - Read OCR


Согласен и включал вначале после GO_IDLE_STATE. Перед самой отправкой последнего сообщения глянул в библиотеку МЧип. Там есть ветка где CMD59 включена до (хотя SDHC библиотека не поддерживает). К сожалению, ни так ни этак не работает. Я уж не знаю что и делать... Можете выложить какой-нить рабочий пример именно по сабж?
aaarrr
Пример выпиливать долго, если только совсем без него никак...

Nrc между командами выдерживаете? Другие карты пробовали?
avp
Цитата(aaarrr @ Jun 23 2009, 22:19) *
Пример выпиливать долго, если только совсем без него никак...

Nrc между командами выдерживаете? Другие карты пробовали?

С примером понятно - самому было бы лень.
Насчет Nrc как раз сейчас и думаю покопать - выдерживаю 8 бит после каждой команды. Попробую 16 для SDHC. Других карт кроме 16Мб ММС не пробовал, но с ней не вопрос.
avp
Цитата(aaarrr @ Jun 23 2009, 22:19) *
Пример выпиливать долго, если только совсем без него никак...

Nrc между командами выдерживаете? Другие карты пробовали?

В общем, почти получилось - инициализация и чтение корневого сектора уверенное на 1.5 МГц (больше пока не пробовал). С записью пока неустойчиво. Алгоритм инициализации не изменял, Ncr также прежний, но разъяснения в даташит касательно TAAC,NSAC и R2W_FACTORa заставили несколько изменить код ф-ии отправки команд на карту. Там же надо "подчищать" SPI-буфер перед операцией.

Думаю это последний вопрос перед закрытием темы - какая обвязка карты у Вас на плате? На той, что у меня только PullUp 10К резисторы. По даташиту должно быть 50-100К. Но думаю на DI и DO нужны еще и емкости. Не люблю этого в цифровой техники, но даже со всеми выше указанными изменениями чтение было нестабильное, пока не подключил осциллограф. Если встать щупом на DO, то чтение становится стабильным. Получается я внес доп. емкость. Начинал с 16Мб ММС и все было Ок при текущей схемотехнике. В Инете встретил статью, где ставят до 3-х емкостей. Как сделано у Вас для SDHC?

Спасибо за потраченное время и участие.
aaarrr
Цитата(avp @ Jun 24 2009, 19:29) *
Как сделано у Вас для SDHC?

У меня никаких емкостей, только pull-up резисторы на незадействованных DAT-линиях.

Цитата(avp @ Jun 24 2009, 19:29) *
Если встать щупом на DO, то чтение становится стабильным.

А вот это похоже на проблемы с целостностью сигналов на плате. Попробуйте добавить последовательные 33Ом резисторы на все линии интерфейса.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.