AVR als SPI Slave

OP #3159984
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:
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
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.