No se puede inicializar 8GB SDHC CMD8 responde con (0xFF)

1

Estoy intentando interconectar un SDHC de 8GB con el controlador STM32L0 a través de SPI.

Siguió este tutorial.

Como sugiere este , seguí la secuencia de comandos de la siguiente manera :

  1. CMD0 arg: 0x0 , CRC: 0x95 (respuesta: 0x01 )
  2. CMD8 arg: 0x000001AA , CRC: 0x87 (respuesta: 0x01 )

Estoy enviando algunos relojes con CS Activado y Desactivado entre estos comandos como se explica aquí .

De alguna manera, obtengo la respuesta de CMD0 como 0x01 pero CMD8 siempre responde con 0xFF .

A continuación se muestra el código que estoy usando para iniciar mi tarjeta SD:

void SD_INIT(void){
    CS_HIGH;
    for(count = 0; count < 8; count++){
            SPI_SEND_CMD_DUMMY();
    }
    CS_LOW;
    for(count = 0; count < 8; count++){
            SPI_SEND_CMD_DUMMY();
    }

    uint8_t txBuff[] = {0x40,0x00, 0x00, 0x00, 0x00, 0x95 };
    HAL_SPI_TransmitReceive(&hspi2,txBuff,readBuff,6,100);

    //count = 255;   //Try 255 times..
    for(count = 255;count>0;count--){
            uint8_t dummy[] = {0xFF};
            HAL_SPI_TransmitReceive(&hspi2,dummy,readBuff,1,100);
            if(readBuff[0] == 0x01){
                    status = 1;
                    break;
        }

    }

    for(count = 0; count < 8; count++){
            SPI_SEND_CMD_DUMMY();
    }
    CS_HIGH;
    for(count = 0; count < 8; count++){
            SPI_SEND_CMD_DUMMY();
    }


/*-------------------SDHC TRY----------------*/

    if(status==1){

    //status=0;
    CS_LOW;
    for(count = 0; count < 8; count++){
            SPI_SEND_CMD_DUMMY();
    }
        //HIGH CAPACITY 0x000001AA 
    uint8_t tx1Buff[] = {0x48,0x00, 0x00, 0x01, 0xAA, 0x87 };
    HAL_SPI_TransmitReceive(&hspi2,tx1Buff,readTempBuff,6,100);

    //count = 255;   //Try 255 times.. //10ms = 160000
    for(count = 100;count>0;count--){
            uint8_t dummy[] = {0xFF};
            HAL_SPI_TransmitReceive(&hspi2,dummy,readTempBuff,1,100);
            if(readTempBuff[0] == 0x05){  //Invalid Command
                    status = 3;
                    break;
        }
    }

    for(count = 0; count < 8; count++){
            SPI_SEND_CMD_DUMMY();
    }
    CS_HIGH;
    for(count = 0; count < 8; count++){
            SPI_SEND_CMD_DUMMY();
    }
    }

void SPI_SEND_CMD_DUMMY(void){

        uint8_t txBuff = 0xFF;
        HAL_SPI_Transmit(&hspi2,&txBuff,1,100);
}

La respuesta que estoy recibiendo en readTempBuff es:

readTempBuff[0]  :  0xFF
readTempBuff[1]  :  0xFF
readTempBuff[2]  :  0xFF
readTempBuff[3]  :  0xFF
readTempBuff[4]  :  0xFF
    

1 respuesta

1
  

para (count = 100; count > 0; count -) {

Eso es solo 100 bytes de respuesta, mi código usa 1000 para cada comando SD. Algunas tarjetas pueden necesitar el tiempo extra / relojes.

Tenga en cuenta que IIRC también necesita procesar la respuesta R7 del CMD8.

El código de la tarjeta SDHC no es trivial, pero hay muchas implementaciones de código abierto para aprender.

    
respondido por el Turbo J

Lea otras preguntas en las etiquetas