Problema de inicialización de la tarjeta SD - CMD16 respuesta incorrecta

0

Estoy usando SPI para interactuar con una tarjeta micro SD de 2GB y obtener respuesta de error en respuesta CMD16 y también respuesta CMD17. Por eso, tampoco puedo leer bytes de la tarjeta SD. Aquí está mi código:

Función de inicialización de la tarjeta SD:

uint8_t SDCard_Initialize(void)         {
   uint8_t i;
   //Send 80 pulses to active SD card
   for(i = 0; i < 10; i++)                      
      SPI_ByteTransfer(0xFF);               //Each byte send = 8 pulses
   GPIO_SPI->BRR = GPIO_CS;                 //Enable SD card CS pin
   SDCard_SendCommand(CMD0, 0, 0x4A);       //SD card go to Idle state
   if(!SDCard_CheckRespond(0x01))
       return 1;                            //Error code 1
   for(i = 0; i < 10; i++)                      {               
       SDCard_SendCommand(CMD1, 0, 0xFF);   //SD card active operations
       if(SDCard_CheckRespond(0x00))        
          break;                                                                        
       }    
   if(i == 10)
       return 2;                           //Error code 2
   SDCard_SendCommand(CMD16, 512, 0xFF);  //SD card active operations
   if(!SDCard_CheckRespond(0x00))
       return 3;
   GPIO_SPI->BSRR = GPIO_CS;               //Disable SD card CS pin
   return 0;
}

Función de comando de envío de tarjeta SD:

void SDCard_SendCommand(uint8_t cmd, uint32_t arg, uint8_t crc)         {
   uint8_t temp;
   int8_t i;
   SPI_ByteTransfer(cmd | 0x40);    //Transmit 6bit command, transmission and start bit first   
   for(i = 3; i >= 0; i--)     {    //Transmit 32bit argument   
       temp = (arg >> (8 * i)) & 0x000000FF;
       SPI_ByteTransfer(temp);
   }
   SPI_ByteTransfer((crc << 1) | 0x01);     //Transmit 7bit CRC and stop bit
}

Función de respuesta de verificación de tarjeta SD:

uint8_t SDCard_CheckRespond(uint8_t res)                {   
   timeout = 0;
   Timer_Initialize(3600, 1999);            //Set timer trigger at 100milisecond        
   while(SPI_ByteTransfer(0xFF) != res) {  //Loop until get correct respond or timeout
       if(timeout)                  {   
           TIM_DeInit(TIM2);
           return 0;                      //Return error if timeout
       }
   }
   TIM_DeInit(TIM2);

   SPI_ByteTransfer(0xFF);             //Add 8 clock after receive respond

   return 1;
}

La respuesta de CMD16 que obtuve en lugar de 0x00 es realmente extraña: no puede ser 0xC0 porque el MSB de la respuesta en el manual debe ser 0.

FF C0 7F FF FF FF FF FF FF FF
    

1 respuesta

0

He agregado 8 horas enviando 0xFF a través de SPI después de recibir la respuesta y ahora obtengo la respuesta correcta. No lo agregue con el comando de bloque de lectura, podría eliminar 1 byte adicional del desplazamiento.

uint8_t SDCard_Initialize(void)         {
   uint8_t i;
   //Send 80 pulses to active SD card
   for(i = 0; i < 10; i++)                      
      SPI_ByteTransfer(0xFF);               //Each byte send = 8 pulses
   GPIO_SPI->BRR = GPIO_CS;                 //Enable SD card CS pin
   SDCard_SendCommand(CMD0, 0, 0x4A);       //SD card go to Idle state
   if(!SDCard_CheckRespond(0x01))
      return 1;                             //Error code 1

   /* ADD 8 CLOCK AFTER RECEIVE RESPONSE */
   **SPI_ByteTransfer(0xFF);**

   for(i = 0; i < 10; i++)                      {               
       SDCard_SendCommand(CMD1, 0, 0xFF);   //SD card active operations
       if(SDCard_CheckRespond(0x00))        
          break;                                                                        
   }    
   if(i == 10)
       return 2;                           //Error code 2

   /* ADD 8 CLOCK AFTER RECEIVE RESPONSE */
   **SPI_ByteTransfer(0xFF);**

   SDCard_SendCommand(CMD16, 512, 0xFF);  //SD card active operations
   if(!SDCard_CheckRespond(0x00))
       return 3;

   /* ADD 8 CLOCK AFTER RECEIVE RESPONSE */
   **SPI_ByteTransfer(0xFF);**

   GPIO_SPI->BSRR = GPIO_CS;               //Disable SD card CS pin
   return 0;
}
    
respondido por el Nguyen Thanh Binh

Lea otras preguntas en las etiquetas