mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI-Synchronisations-Problem


Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es sein, dass noch niemand so etwas probiert hat?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Kann es sein, dass noch niemand so etwas probiert hat?

Jede Menge Leute habe das schon gemacht. Dein Programm
ist einfach falsch.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter

Besten Dank für die Lösungsansätze

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Variante 3 ist die sauberste Lösung
==> 5 Wire SPI

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.