AVR als SPI Slave

OP #3159984
Lesenswert?

Hallo zusammen,

ich versuche momentan eine Verbindung zwischen zwei AVR's via SPI 
Interface aufzubauen. Der Slave soll bei jedem erfolgreich empfangenen 
Zeichen ein "0xAC" als Antwort senden. Im Screenshot sieht man 
allerdings, dass er regelmäßig nicht in den Interrupt springt und das 
empfangene Zeichen unverändert wieder rausschiebt.

Kann mir jemand sagen was ich falsch mache? Oo

Hier einmal der Code für den Slave:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
int main(void)
5
{
6
  /* MISO = output */
7
  DDRB |= (1<<PB6);
8
  
9
  /* SPI enable */
10
  SPCR0 |= (1<<SPE0) | (1<<SPIE0);
11
  
12
  /* global interrupt enable */
13
  sei();
14
  
15
  while(1);
16
}
17

18
ISR(SPI_STC_vect)
19
{
20
  SPDR0 = 0xAC; // send ACK;
21
}

Gruß,
Martin
Angehängte Dateien:
#3160026
Lesenswert?

Martin Wenske schrieb:
> Im Screenshot sieht man
> allerdings, dass er regelmäßig nicht in den Interrupt springt
Man sieht, dass er in den Interrupt springt. Oder wie kommt das 0xAC 
sonst auf die Leitung?

Martin Wenske schrieb:
> Kann mir jemand sagen was ich falsch mache?
Du hast die falsche Erwartung.
Der Master schiebt ein Byte rein und empfängt das, was zuletzt im SPDR 
des Slaves stand. Willst du das 0xAC empfangen, welches erst 
reingeschrieben wird, wenn das gesendete Byte angekommen ist, holt der 
Master es bei der nächsten Sendung ab. Genau das sieht man auch in 
deinem Screenshot.

mfg.
OP #3160042
Lesenswert?

Hi,

Thomas Eckmann schrieb:
> Man sieht, dass er in den Interrupt springt. Oder wie kommt das 0xAC
> sonst auf die Leitung?
Genau, also prinzipiell funktioniert die Übertragung. Allerdings springt 
er ab und zu nicht in den Interrupt und verliert das Zeichen (im 
Screenshot "0x15". Timingproblem? Hardwarefehler? Die gesendeten Daten 
des Masters sehen vom Timing her gut aus.

Nutze ich keinen Interrupt und Polle das SPIF-Flag übersieht er auch 
Daten.

Gruß,
Martin

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