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


von Boxer (Gast)


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

von Johann L. (gjlayde) Benutzerseite


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.

von Nico E. (masta79)


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.

von Andreas K. (a-k)


Lesenswert?

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

von Boxer (Gast)


Lesenswert?

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

von Nico E. (masta79)


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.

von Simon K. (simon) Benutzerseite


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.

von Nico E. (masta79)


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.)

von Andreas K. (a-k)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.