Forum: Mikrocontroller und Digitale Elektronik AVR als SPI Slave


von Martin W. (wollis)


Angehängte Dateien:

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

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

also wenn du für eine Übertragung ein ACK vom Slave willst, dann musst 
du vom Master noch ein weiteres (Dummy)Byte senden. Denn das was du am 
Slave ins SPDR schreibst, wird ja erst mit dem nächsten Byte was vom 
Master kommt übertragen.

Sascha

von Martin W. (wollis)


Lesenswert?

Hi,

beim SPI-Bus ist es ja (meist) immer so, dass die Antwort des Slave um 
ein Byte verschoben erfolgt. Also kein Dummybyte benutzt wird. Das ist 
in diesem Fall so gewollt und stellt nicht das Problem dar.

Gruß,
Martin

von Thomas E. (thomase)


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.

von Martin W. (wollis)


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

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.