Estoy tratando de transmitir datos de un microcontrolador (frecuencia de reloj predeterminada ATMega8A) a otro microcontrolador (ATMega16 16MHz-cristal).
He configurado ATMega16 como maestro con
DDRB |= (1 << DDB7) | (1 << DDB5); //Set MOSI, SCK as Output
SPCR |= (1 << SPE) | (1 << MSTR) | (1<<SPIE) | (1 << SPR0);//Enable SPI, Set as Master
Tengo una función de recepción
unsigned char ReceiveData(unsigned char Data)
{
SPDR = Data;
while(!(SPSR & (1<<SPIF) ));
return(SPDR);
}
El pin SS'
de ATMega8A (esclavo) está conectado a PB3
y en el bucle principal tengo
for(;;)
{
PORTB &= ~(1<<PB3); //clear SS' of slave
Data = ReceiveData(0x05); //sending dummy 0x08 to slave;
if(Data == 0x08)
//TOGGLE(SOME_PORT,SOMEPINWITHLED); toggle #defined
_delay_ms(200);
PORTB |= (1<<PB3);
}
En el dispositivo esclavo que tengo
int main() // slave main module
{
DDRB |= (1<<DDB4); //MISO as OUTPUT
SPCR |= (1<<SPE); //Enable SPI
DDRB |= (1<<DDB0);
char Data = 2, SendValue = 8;
for(;;)
{
TOGGLE(PORTB,PB0); // #define'd TOGGLE(A,B) A ^= (1<<B);
Data = SendData(SendValue); // exact same as ReceiveData() on master.
}
return 0;
}
El led no se enciende en el módulo maestro, pero sí en el módulo esclavo. ¿Podría sugerirme qué he hecho mal aquí? Puede ser que el maestro y el esclavo no estén sincronizados.
- ¿Debo marcar 'while (! (SPSR & (1 & lt & ltSPIF)))' en el esclavo o 'SPDR = Data; retorno (SPDR); Es suficiente en el esclavo.
- ¿Cómo sabe el maestro cuando el esclavo está enviando datos? Entonces, ¿cuándo debería el maser comprobar 'while (! (SPSR & (1 & lt & ltSPIF)));'?
P.S: En el futuro planeo usar esclavos múltiples y un solo maestro.
Editar : corregí de DDRB |= (1 << DDB3) | (1 << DDB5);