Gast
#4443923
Hallo, ich möchte einen STM32F4 mit einem ATtiny87 via SPI kommunizieren lassen. Der STM32F4 ist dabei der SPI-Master und sendet sporadisch mehrere Bytes. Die Funktionsfähigkeit des STM32F4 habe ich per PicoScope geprüft. Dieser sendet wie er soll alle x Millisekunden mit 1MHz SPI-Daten raus. (siehe Bild) Der ATtiny87 soll diese Daten aufnehmen und anschließend als LIN-Master in Form einer LIN-Botschaft auf den LIN-Bus senden. Die Funktionen zum Senden und Lesen von LIN-Botschaften habe ich bereits implementiert und getestet - diese funktionieren. Mein Problem ist, dass der ATtiny87 als SPI-Slave die gesendeten SPI-Bytes nicht richtig aufnimmt bzw. sich regelmäßig aufhängt. Ich habe schon mehrere Varianten zum Einlesen der jeweiligen SPI-Bytes ausprobiert - jedoch mit mehr oder weniger großem Erfolg. Zum einen habe ich probiert mit einer Folge von while-Schleifen welche des SPIF-Flag abfragen zu arbeiten oder zum anderen mit dem SPI-Interrupt. Eine Kombination von beiden habe ich ebenfalls ausprobiert. Zeitweise haben diese Funktionen auch die SPI-Daten korrekt eingelesen und richtig auf LIN-Bus gesendet. Jedoch funktionierte dies immer unterschiedlich lange. Nach einer unbestimmten Zeit hat sich der ATtiny aufgehangen und keine LIN-Botschaften mehr gesendet. Der SPI wird wie folgt initialisiert´: //ATtiny als SPI Slave initialisieren void SPI_SlaveInit(void){ //Ein-/Ausgaenge setzen DDRA |= (1<<PINA2); // MISO als Ausgang setzen DDRA &= ~(1 <<PINA4); //MOSI als Eingang setzen DDRA &= ~(1 <<PINA5); //SCK als Eingang setzen DDRA &= ~(1 <<PINA6); //SS als Eingang setzen //SPI Control Register SPCR SPCR &= ~(1<<MSTR); //Slave Modus wird aktiviert SPCR &= ~( (1<<CPOL) | (1<<CPHA) ); //SPI Mode 0 SPCR &= ~(1<<DORD); //MSB wird als erstes uebertragen //SPI aktivieren SPCR |= (1<<SPIE); //SPI interrupt aktivieren SPCR |= (1<<SPE); //SPI aktivieren; Ein-und Ausgaenge fuer MOSI, MISO, CLK und SS werden zudem automatisch gesetzt } Mein endgültiges Ziel ist in dem Programmablaufplan mal kurz dargestellt. Vielleicht kann mir ja jemand mit einer Routine zum Einlesen mehrerer Bytes über SPI weiterhelfen. Vielen Dank! Gruß Steffen

