Forum: Mikrocontroller und Digitale Elektronik Zwei MC miteinander über SPI verbinden


von Tobi (Gast)


Lesenswert?

Ich habe zwei MC über SPI (Haupttakt/4) miteinander verbunden. Mein 
Master gibt den Takt (SCK), CS und die Daten (Mosi) an den Slave.


Der Slave soll diese Daten mit einem Interrupt verstehen und 
abspeichern. Er erkennt diese Daten aber leider nicht. Weiß nicht mehr 
weiter....
Habe folgende Einstellungen im Slave getroffen:

SPI initialisierung:

void SPI_Slave_INIT(void)
{
SPCR |= (1<<SPE) | (0<<MSTR) | (1<<SPIE);
}

Interrupt Funktion (Daten sollen per Interrupt erkannt und in der 
globalen Variable RECEIVE_u8[1] gespeichert werden- ich denke hier 
stimmt etwas nicht!!

SIGNAL (SIG_SPI)
{
RECEIVE_u8[1] = SPDR;
while(!(SPSR & (1<<SPIF)));
}


In der Main soll die Variable (mit Pulse an PD1) ausgegeben werden

int main (void)
{
init_ports();        //Portinitialisierung
sei();          //Globale Interrupts aktiviert

//INIT SPI
SPI_Slave_INIT();


  while(1)
  {


  for (int16_t n = 0; n < RECEIVE_u8[1] ; n++)
  {
         PORTC &= ~ (1<<PC1);
  _delay_us(10);
          PORTC |= (1<<PC1);
  _delay_us(10);
  }
         _delay_ms(10);


}

von Tobi (Gast)


Lesenswert?

Durch Testen habe ich heruasgefunden. Wenn Daten empfangen werden 
springt er wohl in den Interrupt- aber speichert diesen Wert nicht ab

von Ralf (Gast)


Lesenswert?

Globale Variable + Verwendung in normalem Programm + Verwendung in 
Interrupt = Variable als volatile deklariert?

Ralf

von Tobi (Gast)


Lesenswert?

Ich habe die Variable als Volatile deklariert:

volatile unsigned char Receive_u8[10];

stimmt doch alles?


Hate es vielleicht mit dem Interrupt zu tun? Schlägt der Interrupt 
vielleicht nur zu wenn Daten eingelesen sind  und nicht schon beim 
Empfangen? Dann müßte ich ohne Interrupt arbeiten mit einer Schleife die 
immer wieder den SPI-Eingang abfragt...

von Christian (Gast)


Lesenswert?

Also bei einer While-Schleife in der ISR bei der auf ein externes 
Ereignis gewartet wird klingeln bei mir schonmal die Alarmglocken.


Ich würde den Empfang so machen:

ISR(SPI_STC_vect)
{
 rxbuffer = SPDR;
}

Der Interrupt löst nach empfang der Nachricht aus. Da braucht man auf 
nix anderes zu warten.

Mfg

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.