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

 
 
> 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 23 2009, 15:48
Сообщение #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.


Вчера не мог проверить - сегодня вновь день потерян. Что-то записать/прочесть из 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

и т.д.
В чем же я ошибаюсь?
Go to the top of the page
 
+Quote Post



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

 


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


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