Попытка инициализировать карту SDHC с помощью SPI. После отправки CMD55 для подготовки к ACMD41 ответ = 0x01. ACMD41 всегда «отвечает» 0xFF. Мысли?

Для начала я приложу свой код.

      uint8_t SD_init(void)
{
    uint8_t res[5], cmdAttempts = 0;

        // Pulls CS high, waits 10ms, then sends 80 dummy bytes
        // all with the card de-selected
    SD_powerUpSeq();

        // SD_goIdleState() sends CMD0, argument, and CRC
        // Repeats until the result is 0x01 (idle state)
    while((res[0] = SD_goIdleState()) != SD_IN_IDLE_STATE)
    {
        cmdAttempts++;
            // 255 attempts
        if(cmdAttempts == CMD0_MAX_ATTEMPTS)
        {
            return SD_ERROR;
        }
    }

    delayMs(1);
        // SD_sendIfCond() sends CMD8, argument, and CRC
    SD_sendIfCond(res);
        
        // checks if the first response is 0x01 (idle state)
    if(res[0] != SD_IN_IDLE_STATE)
    {
        return SD_ERROR;
    }

        // checks if echo is correct (I have never gotten stuck here)
    if(res[4] != 0xAA)
    {
        return SD_ERROR;
    }

    cmdAttempts = 0;
    do
    {           // 255 attempts
        if(cmdAttempts == CMD55_MAX_ATTEMPTS)
        {
            return SD_ERROR;
        }
                // sends CMD55 in preparation for ACMD41
                // First response is 0x01, then 0xFF on subsequent attempts
        res[0] = SD_sendApp();
                //#define SD_R1_NO_ERROR(X)   X < 0x02
        if(SD_R1_NO_ERROR(res[0]))
        {
            // Sends ACMD41
            // Always returns 0xFF (unless I step through it, odd)
            // (even if I do step through it, the card does not respond 
            // (response = 0xFF) to read/write commands afterwards)
            res[0] = SD_sendOpCond();
        }

        delayMs(1);

        cmdAttempts++;
    }
    while(res[0] != SD_READY);
        
    delayMs(1);
        // I never get to this point
    SD_readOCR(res);

    return SD_SUCCESS;
}

и на всякий случай кто-то этого хочет:

      #define CMD55               55         // (CMD|0x40) is sent to the card
#define CMD55_ARG           0x00000000
#define CMD55_CRC           0x65        
#define ACMD41              41
#define ACMD41_ARG          0x40000000
#define ACMD41_CRC          0x77

Это SDHC-карта на 16 ГБ. Инициализация проходит нормально до ACMD41, который постоянно возвращает 0xFF, указывая, что карта абсолютно ничего не делает.

Попытка исправления № 1: отправьте CMD1 после превышения отведенного количества попыток ACMD41. Все еще 0xFF.

Попытка исправления № 2. Пройдите через функцию.

Это интересно, потому что при прохождении ответ становится 0x00. Единственная проблема заключается в том, что карта не отвечает ни на какие последующие команды чтения/записи.

Попытка исправить № 3: попробуйте другую SD-карту.

Эта карта намного старше, 8 ГБ, но я думаю, что это все еще SDHC (этикетка очень потерта, и мне трудно найти документацию по любой из карт). Он правильно реагирует на команды CMD55 и ACMD41 и хорошо реагирует на команды чтения/записи, за исключением того факта, что он фактически ничего не записывает. Изменение адреса чтения всегда возвращает одни и те же данные, а просмотр диска в Hex Workshop после записи показывает, что на самом деле ничего не изменилось. В остальном жетоны ответов такие же, какими они должны быть на заменяемой карте.

Многие ответы по интерфейсу SPI с SD-картами на этом сайте довольно старые, поэтому есть вероятность, что с годами что-то изменилось. Если кто-нибудь что-нибудь знает, пожалуйста, дайте мне знать.

Более новый, желаемый вывод карты:

      Sending CMD0....
Sucess! Response: 01
Sending CMD8....
Sucess! Response: 01000001AA
Sending CMD55....
Response: 01
Sending ACMD41....
Response: FF
Sending CMD55....
Response: FF
Sending CMD55....
Response: FF
Sending CMD55....
Response: FF
Sending CMD55....
Response: FF
Sending CMD55....
Response: FF

и так далее.

Старая версия карты емкостью 8 ГБ:

      Sending CMD0....
Sucess! Response: 01
Sending CMD8....
Sucess! Response: 01000001AA
Sending CMD55....
Response: 01
Sending ACMD41....
Response: 01
Sending CMD55....
Response: 01
Sending ACMD41....
Response: 01
Sending CMD55....
Response: 01
Sending ACMD41....
Response: 01
Sending CMD55....
Response: 01
Sending ACMD41....
Response: 01

Это повторяется до достижения значения тайм-аута.

0 ответов

Другие вопросы по тегам