EDIT 1: realicé cambios en el código como @Anonymous sugirió en la respuesta. Parece que ha mejorado, pero ahora parece que estoy recibiendo una respuesta incorrecta O LA TARJETA SD está poniendo la respuesta en el momento incorrecto.
El archivo de datos lógicos después de hacer los cambios como Anónimo sugirió en la respuesta
Estoy tratando de hacer bitbang en la interfaz SPI para la tarjeta SD. Al principio estaba confundido con respecto al modo a utilizar. así que le pregunté a con respecto al modo SPI aquí .
Estoy inicializando mi CLK como salida con un pull-up interno y un nivel bajo de conducción. Lo mismo ocurre con el MOSI. mientras que MISO es de entrada, levante hacia arriba y nada conduce eso.
Aquí está mi SPI Enviar y recibir.
int spi_bb_send(spi_bb_config_t *spi_conf,unsigned char data)
{
int i;
uint8_t data_in = 0;
// send bits 7..0
for (i = 0; i < 8; i++)
{
spi_pin_clear(&(spi_conf->clk));
// consider leftmost bit
// set line high if bit is 1, low if bit is 0
if (data & (1<<7))
spi_pin_set(&(spi_conf->mosi));
else
spi_pin_clear(&(spi_conf->mosi));
data_in <<= 1;
data_in |= gpio_read(&(spi_conf->miso));
Delay(SPI_TIME_IN_US(SPI_FREQ_KHZ));
// pulse clock to indicate that bit value should be read
spi_pin_set(&(spi_conf->clk));
Delay(SPI_TIME_IN_US(SPI_FREQ_KHZ));
//read the miso
//data_in |= gpio_read(&(spi_conf->miso));
// shift byte left so next bit will be leftmost
data <<= 1;
}
Delay(SPI_TIME_IN_US(SPI_FREQ_KHZ));
spi_pin_clear(&(spi_conf->clk));
return data_in;
}
int spi_bb_recieve(spi_bb_config_t *spi_conf)
{
return(spi_bb_send(spi_conf,0xFF));
}
El comando de inicialización se ha intentado de acuerdo con Documento de capa física proporcionado por SD ORD , es decir, siguiendo este flujo de inicialización.
Ademásdelflujodeinicializaciónqueencontréenesta
El problema al que me estoy enfrentando es que estoy recibiendo el comando y la respuesta para los primeros dos comandos correctamente, que son CMD0 y CMD8, y no estoy enfrentando ningún problema sin importar cuántas veces lo intente. Cuando envío el tercer comando, es decir:
1) CMD58 según el documento de la organización SD, no recibo ninguna respuesta. 2) CMD55, según la respuesta de la persona en este SE, parece que recibo la respuesta correcta, pero la respuesta que leí obtiene un 0xF antes de la respuesta, por lo que creo que la tarjeta SD comienza a responder desde la mitad del tiempo generado. Así que le conecté un analizador lógico y aquí están los resultados.
Nohayrespuestaenelprimerreloj:
Hay algunas ideas proporcionadas en el enlace para responder pegadas arriba que dicen:
Tenga en cuenta que las respuestas que tienen el MSB establecido pero no es 0xFF generalmente sugieren que su SPI tiene un cambio en la sincronización del reloj (como resultado de, por ejemplo, la caída de Vcc, que ocurre de manera rutinaria cuando está haciendo hotplugs de SD). Para solucionarlo, puede intentar reiniciar completamente el dispositivo (encender / apagar, desactivar / confirmar SS̲, etc.); por lo general funciona.
Pero no estoy haciendo ningún hotplug y ninguno de los reinicios / ciclos de alimentación funciona, entonces, ¿alguien puede ayudarme? ¿Por favor?