Неиспользуемые линии данных карты подтянуты через резисторы к питанию?
Кроме того -
Цитата
shitch CRC check on - required before ACMD41
Это цитата из моих исходников, между прочим. Где вычитал - наверное, в спецификации... Возмите чей-нибудь (хоть мой) рабочий вариант и сравните - всё ли у Вас правильно делается.
CODE
// set MMC in Idle mode
// Вызывается, подразумевая что CS установлен
static char mmcGoIdle(void)
{
unsigned char response;
unsigned long cmd58answer, cmd8answer = 0;
SDCARD_CS_HIGH();
nvram_read_byte(targetsdcard);
SDCARD_CS_LOW();
nvram_read_byte(targetsdcard);
//Send Command 0 to put MMC in SPI mode
mmcSendCmdCRC7(MMC_GO_IDLE_STATE, 0); // CMD0 - Обязательно с правильным CRC
//Now wait for READY RESPONSE
if ((response = mmcGetResponseR1()) != 0x01)
{
return MMC_INIT_ERROR;
}
nvram_read_byte(targetsdcard);
mmcSendCmdCRC7(MMC_SEND_IF_COND, 0x000001aa); // CMD8 - Обязательно с правильным CRC. 3.3 Volt VCC
response = mmcGetResponseR7(& cmd8answer);
if ((response & 0x04) != 0) // illegal command or pattern not match
{
mmcAddressMultiplier = MMC_SECTORSIZE;
mmcCardVersion2 = 0;
// if no responce
// Ver2.00 or later SD Memory Card(voltage mismatch)
// or Ver1.X SD Memory Card
// or not SD Memory Card
debug_printf_P("Ver1.X SD Memory Card or not SD Memory Card\n");
// check voltage range here
nvram_read_byte(targetsdcard);
mmcSendCmd(0x40 + 58, 0); // CMD58
response = mmcGetResponseR3(& cmd58answer);
//debug_printf_P("CMD58 has responce %02x, value = %08lx\n", response, cmd58answer);
if (response == 0x00 || response == 0x01)
{
if ((cmd58answer & (1UL << 21)) || (cmd58answer & (1UL << 20)))
{
debug_printf_P("3.3 volt VCC suitable.\n");
}
else
{
debug_printf_P("3.3 volt VCC NOT suitable.\n");
return MMC_INIT_ERROR;
}
}
for (;;)
{
nvram_read_byte(targetsdcard);
mmcSendCmd(MMC_APP_CMD, 0); // APP_CMD
//Now wait for READY RESPONSE
response = mmcGetResponseR1();
//debug_printf_P("APP_CMD responce R1 = %02x\n", response);
if (response != 0x01 && response != 0x00)
continue;
nvram_read_byte(targetsdcard);
mmcSendCmd(MMC_ACMD41, 0); // ACMD41(0)
//Now wait for READY RESPONSE
response = mmcGetResponseR1();
//debug_printf_P("ACMD41 responce R1 = %02x\n", response);
if (response == 0x00)
break;
}
//debug_printf_P("ACMD41 has responce %02x\n", response);
//return MMC_INIT_ERROR;
}
else if ((cmd8answer & 0xff) != 0xaa)
{
debug_printf_P("Bad CMD8 answer. SD CArd unuseable\n");
return MMC_INIT_ERROR;
}
else
{
mmcCardVersion2 = 1;
// Ver2.00 or later SD Memory Card
debug_printf_P("Ver2.00 or later SD Memory Card\n");
// check voltage range here
nvram_read_byte(targetsdcard);
mmcSendCmd(0x40 + 58, 0); // CMD58
response = mmcGetResponseR3(& cmd58answer);
//debug_printf_P("CMD58 has responce %02x, value = %08lx\n", response, cmd58answer);
if (response == 0x00 || response == 0x01)
{
if ((cmd58answer & (1UL << 21)) || (cmd58answer & (1UL << 20)))
{
debug_printf_P("3.3 volt VCC suitable.\n");
}
else
{
debug_printf_P("3.3 volt VCC NOT suitable.\n");
return MMC_INIT_ERROR;
}
}
nvram_read_byte(targetsdcard);
mmcSendCmd(0x40 + 59, 1); // shitch CRC check on - required before ACMD41
response = mmcGetResponseR1();
//debug_printf_P("CMD59 has responce %02x\n", response);
for (;;)
{
nvram_read_byte(targetsdcard);
mmcSendCmdCRC7(MMC_APP_CMD, 0); // APP_CMD
//Now wait for READY RESPONSE
response = mmcGetResponseR1();
//debug_printf_P("APP_CMD responce R1 = %02x\n", response);
if (response != 0x01 && response != 0x00)
continue;
nvram_read_byte(targetsdcard);
mmcSendCmdCRC7(MMC_ACMD41, 0x40000000); // HCS (High Capacity Support)
//Now wait for READY RESPONSE
response = mmcGetResponseR1();
//debug_printf_P("ACMD41 responce R1 = %02x\n", response);
if (response == 0x00)
break;
}
nvram_read_byte(targetsdcard);
mmcSendCmdCRC7(0x40 + 59, 0); // shitch CRC check off
response = mmcGetResponseR1();
//debug_printf_P("CMD59 has responce %02x\n", response);
// Check CCS bit (capacity) bit
nvram_read_byte(targetsdcard);
mmcSendCmd(0x40 + 58, 0); // CMD58
response = mmcGetResponseR3(& cmd58answer);
//debug_printf_P("CMD58 has responce %02x, value = %08lx\n", response, cmd58answer);
if ((cmd58answer & 0x40000000) != 0) //CCS (Card Capacity Status)
{
debug_printf_P("SDHC or SDXC (High Capacity)\n");
mmcAddressMultiplier = 1; // Для SDHC (адресация идёт в 512-ти байтовых блоках)
}
else
{
debug_printf_P("SDSD - up to 2GB\n");
mmcAddressMultiplier = MMC_SECTORSIZE; // Для обычных SD карт
}
}
//debug_printf_P("mmcGoIdle() done.\n");
nvram_read_byte(targetsdcard);
return (MMC_SUCCESS);
}