Hoy, estoy experimentando con un ATmega328P (en un Arduino, pero programado directamente en C sin las bibliotecas de Arduino) y es el bus SPI para comunicación con ningún otro dispositivo de inmediato. viendo pasar los datos en mi osciloscopio.
Pero actualmente tengo un problema en el que no puedo transmitir nada inmediatamente después de inicializar el periférico SPI. Al principio pensé que podría tratarse de un problema de retardo en el que necesito esperar al menos x us / ms entre la inicialización del periférico SPI y la transmisión de datos, pero no puedo encontrar ninguna mención en la hoja de datos. Pero puedo hacer que el bus SPI genere datos cuando coloco SPDR dentro de un bucle infinito y hago que repita el mismo carácter una y otra vez.
Entonces, mi pregunta es ¿cómo puede forzar al microcontrolador a esperar hasta que el bus SPI esté listo para transmitir? ¿O he cometido algún otro error tonto?
int main(void)
{
DDRB = (1 << DDB5) | (1 << DDB3) | (1 << DDB2) | (1 << DDB0);
PORTB |= 1 << PORTB2;
SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0);
PORTB &= ~(1 << PORTB2);
// This doesn't work
//SPDR = 'A';
//while(!(SPSR & (1 << SPIF)));
//_delay_ms(1);
while(1) {
// This works
SPDR = 'A';
while(!(SPSR & (1 << SPIF)));
_delay_ms(1);
}
}