Gast
#4145560
Hallo zusammen,
ich bin gerade dabei eine SPI-Verbindung zwischen 2 UCs zu bauen. Der
Atmga644 agiert als SPI-Slave (Interrupt-gesteuert). Der andere UC ist
ein SPI-Master.
Nun so weit funktioniert die Kommunikation. Ein Hacken ist noch dran und
zwar, dass eine SPI-Master-Abfrage immer den vorletzten Wert liefert und
nicht gerade den aktuellsten.
Beispiel: Ich sende über den Master den Befehlt Get-ID = 0x0F. Der
Atmega644 empfängt die Zahl 0x0F und soll mir die ID beispielsweise 0x12
zurückgeben. Das macht er so weit.
Nun ändere ich die ID von 0x12 auf 0x15 und frage nochmals ab. Dann
bekomme ich zunächst immer noch die 0x12 und bei einer erneuten Abfrage
dann die 0x15.
Das sieht so aus, dass beim Empfangen der Get ID = 0x0F eine Kopie des
Dataregisters (SPDR) gemacht wird, die zunächst gesendet wird. Diese
Kopie ist dann nicht der aktuelle Wert, der gesendet werden soll.
Sondern Eins davor.
Anbei der Inhalt des ISRs:
ISR(SPI_STC_vect)
{
uint8_t spiByte = 0;
uint8_t id = 0;
SpiByte = SPDR; // Get Character
while(!(SPSR & (1<<SPIF))); // Wait until transmission complete
if (SpiByte == 0x0F)
{
id = id_get(); // Get device id
SPDR = id;
while(!(SPSR & (1<<SPIF))); // Wait until transmission complete
}
}
Ich freue mich auf eure Vorschläge
Gruß
Charly