Zwei MC miteinander über SPI verbinden

Gast #1370400
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);


}
Gast #1370499
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...
Gast #1370918
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren