www.mikrocontroller.net

Forum: Compiler & IDEs Kommunikation zwischen 2 µC mit I²C oder SPI?


Autor: Boxer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich stehe vor der Frage ob ich zur Kommunikation zwischen zwei 
Mikrocontrollern den I²C oder SPI Bus verwenden soll...

Was spricht dafür und was spricht dagegen? Welchen Bus würdet ihr mir 
empfehlen dafür zu benutzen?

DANKE

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es nur 2µC sind, bietet sich SPI an, da es einfacher  zu 
implementieren ist. Zudem geht es (etwa auf AVR) schneller. Allerdings 
brauchst Du ne Strippe mehr.

Autor: Nico Erfurth (masta79)
Datum:

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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du AVRs meinst, dann I2C. Deren SPI ist im Slave-Mode mangels 
Sendepuffer ziemlich hirnverbrannt.

Autor: Boxer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas, kannst du bitte genauer erklären, was du mit dem Sendepuffer 
meinst, und warum I²C zu bevorziehen ist?

Autor: Nico Erfurth (masta79)
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Nico Erfurth (masta79)
Datum:

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

Autor: Andreas K. (a-k)
Datum:

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

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.