Kommunikation zwischen 2 µC mit I²C oder SPI?

#931546
Alles eine Frage der Anforderungen und der Umgebung. Hast du noch genug 
Pins frei und musst die Daten schnell übertragen? Dann ist SPI meist die 
bessere Wahl.

Hast du sonst schon I²C Slaves und musst Pins sparen? Dann nimm I²C.

Ganz so pauschal kann man das meist nicht sagen, ich persönlich nehme 
aber lieber SPI solange es die Umgebung zulässt.
#931717
Naja, das Problem ist ganz einfach das der Slave warten muss bis das 
aktuelle Byte komplett beim Master ist, bevor er das nächste byte 
einstellen kann.

Bei 8MHz Systemtakt und 1MHz SPI-Takt würde das im schlimmsten Fall 
bedeuten das man maximal 8 Takte zur Verfügung hat um das nächste Byte 
zur Verfügung zu stellen. Im Normalfall eher weniger. Das ganze führt 
dazu das der Master zwischen den Bytes kleinere Pausen einlegen muss in 
denen kein weiterer Takt gegeben wird um dem Slave ein wenig Zeit zu 
geben. Damit das ganze dann aber wiederum sicher klappt darf der Slave 
sich in dem moment nicht in einem anderen Interrupt befinden etc. Eine 
andere Möglichkeit wäre wenn der Slave dem Master signalisiert wann die 
Daten bereitstehen.

Ein Sendepuffer auf Seiten des Slaves würde das ganze vereinfachen. Die 
eleganteste Lösung wäre aber wohl wenn man dem SPI einen Speicherbereich 
angeben könnte den es dann ausliest.

Bei I²C hat der Slave die Möglichkeit des Clockstretchings um dem Master 
in solchen Fällen zu signalisieren das er noch ein wenig Zeit braucht.
Persönliche Seite #931749
Nico Erfurth wrote:
> Naja, das Problem ist ganz einfach das der Slave warten muss bis das
> aktuelle Byte komplett beim Master ist, bevor er das nächste byte
> einstellen kann.
>
> Bei 8MHz Systemtakt und 1MHz SPI-Takt würde das im schlimmsten Fall
> bedeuten das man maximal 8 Takte zur Verfügung hat um das nächste Byte
> zur Verfügung zu stellen.

Ne, das stimmt nicht. Man hat 8x8 = 64 Takte zur Verfügung.
#931757
Simon K. wrote:

> Ne, das stimmt nicht. Man hat 8x8 = 64 Takte zur Verfügung.

Um das nächste Byte vorzubereiten, ja, aber nicht um es der SPI 
bereitzustellen. Wie Andreas schrieb, die SPI ist fürs senden nur single 
buffered. Dadurch bleibt dir nur zeit zwischen zwei takten. (Ausser ich 
hab da jetzt einen massiven Denkfehler.)
#931815
Exakt so ist es. Ohne zusätzliche Leitung für einen "busy/ready" Status 
oder einen Interrupt zwischen Master und Slave ist es für den Slave 
schwierig, einen wasserdicht sicheren Zeitpunkt zu finden um ins 
Schieberegister zu schreiben ohne in einen grad laufenden Transfer zu 
laufen und sich damit nur WCOL einzuhandeln.

Bei niedriger Bitrate ist das kein Problem, wohl aber bei hoher.

Manch andere einfache Implementierung von SPI besitzt einen separaten 
Sendepuffer. Dadurch wird zwar der Masterbetrieb eine Spur komplizierter 
als bei den AVRs, aber der Slavebetrieb wird so wesentlich vereinfacht.

Bei I2C oder UART entsteht dieses Problem nicht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 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.