Цитата(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
и т.д.
В чем же я ошибаюсь?