He estado trabajando en algún código para hablar con una tarjeta SD con el MSP430. No puedo hacer que la tarjeta entre en modo inactivo, y en realidad estoy bastante perplejo en cuanto a por qué. He mirado la salida del microcontrolador con un analizador lógico y todo se ve como debería. He probado algunas tarjetas diferentes y adaptadores de tarjetas SD con los mismos resultados, por lo que parece un problema de código. Estoy inicializando la tarjeta SD con este código:
void MMC_initSPI(void){
//SOMI: 3.1
//SIMO: 3.0
//CLK: 3.2
//CS: 1.4
//chip select
SD_CSn_PxDIR|=SD_CSn_PIN;
SD_CSn_PxOUT|=SD_CSn_PIN;
UCB0CTL1 = UCSSEL_2 | UCSWRST; // source USCI clock from SMCLK, put USCI in reset mode
UCB0CTL0 |= SPI_MODE_0; // SPI MODE 0 - CPOL=0 CPHA=0
// note: UCCKPH is inverted from CPHA
//do I need to do this??
UCB0BR0 = LOBYTE(SPI_400kHz); // set initial speed
UCB0BR1 = HIBYTE(SPI_400kHz);
P3SEL |= BIT0 + BIT1 + BIT2; // configure for USCI
UCB0CTL1 &= ~UCSWRST; // release for operation
}
y luego enviar 0xFF
dentro de un bucle for 11 veces (bien dentro de los 71 pulsos de reloj necesarios para despertar la tarjeta a nuevos datos) antes de usar la función mmc_GoIdle()
, que es la siguiente:
char mmc_GoIdle(){
char response=0x01;
CS_LOW();
//Send Command 0 to put MMC in SPI mode
mmcSendCmd(MMC_GO_IDLE_STATE, 0, 0x95);
//Now wait for READY RESPONSE
if(mmcGetResponse()!=0x01)
return MMC_INIT_ERROR;
while(response==0x01)
{
CS_HIGH();
spiSendByte(0xff);
CS_LOW();
mmcSendCmd(MMC_SEND_OP_COND,0x00,0xff);
response=mmcGetResponse();
}
CS_HIGH();
spiSendByte(0xff);
return (MMC_SUCCESS);
}
pero siempre vuelve
%código%. ¿Alguien puede detectar algo obviamente malo? El analizador lógico me dice que está devolviendo MMC_INIT_ERROR
y no 0x00
como debería. ¿Algunas ideas?