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