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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.

