Forum: Mikrocontroller und Digitale Elektronik ATtiny87 als SPI Slave und LIN-Master


von Steffen (Gast)


Angehängte Dateien:

Lesenswert?

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

von Steffen (Gast)


Lesenswert?

Problem wurde gelöst!

von Der liebe Adblock-Nutzer (Gast)


Lesenswert?

Steffen schrieb:
> Problem wurde gelöst!

Prima! ...und wie?

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
Noch kein Account? Hier anmelden.