Gast
#689909
Hallo zusammen
Ich verwende untenstehende Routinen, welche das Ziel haben, Bytes vom
SPI-Master an den SPI-Slave zu senden. Umgekehrt soll der Slave
ebenfalls Bytes zurück an den Master senden, welche jeweils um 1 Byte
verzögert auch ankommen. Das ganze habe ich auf 2 Atmega's (ATmega48 und
128 getestet), wobei der 128er als SPI-Master eingesetzt wird und über
UART angesteuert wird.
Nun zum Problem:
Testweise schiebe ich vom SPI-Slave die eingelesenen Bytes zurück an den
Master, welche dann um 1 Byte verzögert ankommen sollten. Trotzdem
funktioniert dies manchmal nicht (bei ca. jedem 15 byte, ziemlich
willkürlich), d.h. es wird nicht ein Byte vom Slave zurückgeschickt,
sondern das eingelesene Byte ist dann gerade dasjenige, welches ich
geschickt habe.
Ich verstehe nun nicht, wieso diese Synchronisation nicht sauber
funktioniert.
Vielen Dank für Lesen und ich hoffe auf einige Tips!
char SPI_MasterTransmit(char cData)
{
uint8_t rc;
PORTB &= ~(1<<0); //SS low
// Start transmission
SPDR = cData;
while(!(SPSR & (1 << SPIF)));
rc = SPDR;
// Wait for transmission complete
PORTB |= (1<<0); //SS high
return (SPDR);
}
SPI_SlaveInit klar..
char SPI_SlaveReceive(char cData)
{
SPDR=cData;
/* Wait for reception complete */
while (!(SPSR) & (1<<SPIF));
return SPDR;
}