Hallo Wolfram,

> Kannst Du mir das noch mal erklären bitte?

Du musst das SPI 2x mit Daten füttern um ein komplette Telegramm abzusetzen.
Um die Wartezeit beim Verarbeiten des Telegramms nicht unnötig zu vertrödeln sollst Du den SPI Interrupt verwenden.

z.B.

- Du prüfst ob der vorherige SPI-Transfer beendet ist. (SPIF Flag = 1)
- Du schiebst das erste Byte in den SPI und enablest den SPI Interrupt (SPIE Flag = 1)
- Im SPI Interrupt schiebst Du das 2 Byte hinterher und disablest den SPI Interrupt. (SPIE Flag = 0)

Sobald SPIF, für das Hauptprogramm sichtbar, 1 wird, ist ein Telegramm komplett übertragen worden. (Zwischen den 2 Bytes eines Telegramms wird das SPIF Flag ebenfalls einmal kurz 1, der Atmel springt dabei aber sofort in den SPI-Interupt.)

Durch das verlagern des 2. Bytes in den Interrupt kannst Du erreichen, das die Telegramme nicht zerstückelt werden können und gleichzeitug Dein Hauptprogramm weiterarbeitet. Der SPI Transfer läuft damit parallel zum Programm praktisch komplett in der Hardware.

Du brauchst dann noch einen Buffer, der bis zu 3 Telegramme aufnehmen kann. (3 Telegramme pro 400-Takte-Zyklus)

Anm. ggf. macht es sinn, auch das Buffer-Handling in den SPI Interrupt zu verlagern.

Kommen eigentlich immer 3 Telegramme, oder können auch nur 2 oder 1 Telegramm pro 400-Takte-Zyklus kommen?


Ich denke, dass wars was Georg-Johann gemeint hat.

Ciao,
Werner