SPI-Synchronisations-Problem

Gast #689909
Lesenswert?
• ▲
▼
Hallo zusammen

Ich verwende untenstehende Routinen, welche das Ziel haben, Bytes vom 
SPI-Master an den SPI-Slave zu senden. Umgekehrt soll der Slave 
ebenfalls Bytes zurück an den Master senden, welche jeweils um 1 Byte 
verzögert auch ankommen. Das ganze habe ich auf 2 Atmega's (ATmega48 und 
128 getestet), wobei der 128er als SPI-Master eingesetzt wird und über 
UART angesteuert wird.

Nun zum Problem:

Testweise schiebe ich vom SPI-Slave die eingelesenen Bytes zurück an den 
Master, welche dann um 1 Byte verzögert ankommen sollten. Trotzdem 
funktioniert dies manchmal nicht (bei ca. jedem 15 byte, ziemlich 
willkürlich), d.h. es wird nicht ein Byte vom Slave zurückgeschickt, 
sondern das eingelesene Byte ist dann gerade dasjenige, welches ich 
geschickt habe.

Ich verstehe nun nicht, wieso diese Synchronisation nicht sauber 
funktioniert.

Vielen Dank für Lesen und ich hoffe auf einige Tips!

char SPI_MasterTransmit(char cData)
{
  uint8_t rc;

  PORTB &= ~(1<<0);  //SS low
  // Start transmission
  SPDR = cData;

  while(!(SPSR & (1 << SPIF)));
  rc = SPDR;

  // Wait for transmission complete
  PORTB |= (1<<0);  //SS high

  return (SPDR);
}

SPI_SlaveInit klar..

char SPI_SlaveReceive(char cData)
{
  SPDR=cData;

  /* Wait for reception complete */
  while (!(SPSR) & (1<<SPIF));

  return SPDR;
}
#690227
Lesenswert?
• ▲
▼
Jonas wrote:

> Testweise schiebe ich vom SPI-Slave die eingelesenen Bytes zurück an den
> Master, welche dann um 1 Byte verzögert ankommen sollten. Trotzdem
> funktioniert dies manchmal nicht (bei ca. jedem 15 byte, ziemlich
> willkürlich), d.h. es wird nicht ein Byte vom Slave zurückgeschickt,
> sondern das eingelesene Byte ist dann gerade dasjenige, welches ich
> geschickt habe.

Das Verhalten ist korrekt, weil das AVR-SPI als Slave einfach Mist ist.
Es hat nämlich keinen Sendepuffer. Deshalb schafft es der Slave nicht 
immer, genau zwischen 2 Bytes das Schieberegister zu füllen.


Es gibt 3 Lösungen:

1.
Man nimmt als Slave nen anderen MC mit SPI-Sendepuffer (z.B. 
AT89LP4052).

2.
Der Master wartet nach jedem Byte sehr sehr lange.

3.
Man nimmt ne extra Leitung für Handshake, womit der Slave sagen kann, 
daß er das nächste Byte in das Schieberegister gestellt hat.


Peter

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.