SPI oder I2C: für einen längeren Bus


36

Ich überlege mir ein Projekt, bei dem mehrere AVRs über einen Bus miteinander sprechen müssten. Sie würden durch so viel wie 6 Fuß getrennt sein.

Es scheint, dass sowohl I2C als auch SPI eine Reihe von Mikros über einen Bus kommunizieren lassen können, aber ich habe nichts darüber gesehen, wie lange das dauern würde. Hat jemand versucht, diese Protokolle über Entfernungen von mehreren Fuß zu verbinden?


Ich habe einmal einen I2C-Bus durch ein Kabel geführt. Im Nachhinein hätte ich stattdessen CAN oder RS-485 verwenden sollen (hatte Mikrocontroller an beiden Enden).
Nick Alexeev

Antworten:


19

Wie bereits erwähnt, können SPI und I2C über große Entfernungen verwendet werden, solange Pull-up-Widerstände, Taktfrequenzen usw. vorhanden sind.

Die Hauptalternativen (die eine bessere Störfestigkeit ergeben) sind RS485 und CAN . Beide verwenden differentielle Leitungen, um Rauschprobleme zu minimieren, und sind für diese Datenübertragungslänge besser geeignet als I2C oder SPI. Ich glaube jedoch nicht, dass viele (irgendwelche?) AVRs mit eingebauten CAN-Peripheriegeräten ausgestattet sind, die die Verwendung von CAN erheblich vereinfachen.

Ich würde sagen, das Wichtigste, was Sie bei der Auswahl eines Busses berücksichtigen müssen, ist, sicherzustellen, dass das Protokoll, das Sie für die Kommunikation zwischen Geräten verwenden, eine CRC oder ein Äquivalent enthält, damit Sie feststellen können, ob eine Nachricht korrekt empfangen wurde (CAN hat dies als Teil von das Paket). In Anbetracht dessen ist es auch nützlich, eine Antwort vom Typ ACK / NACK als Teil des Protokolls zu haben, damit eine beschädigte Nachricht erneut übertragen werden kann.


Es hört sich so an, als würde beides funktionieren. Ich denke hauptsächlich an diese beiden speziellen Protokolle, da die meisten AVRs sie von Haus aus unterstützen, ohne zusätzliche Komponenten hinzuzufügen. Andernfalls wäre RS485 oder CAN eine gute Wahl.
Edebill

Wenn Sie sich nicht auf Through-Hole-Pakete beschränken, bietet ST kostengünstige und leistungsstarke STM32- und STM8-Mikrocontroller mit CAN, NXP bietet eine Reihe von LPC17xx-Mikrocontrollern und es gibt auch einige andere. CAN wird auf vielen Mikrocontrollern immer häufiger (und erschwinglicher).
DrAl

1
Es gibt in der Tat einige AVRs mit eingebauten CAN-Empfängern, aber genau wie die anderen Anbieter ist es nur eine begrenzte Teilmenge ihrer Chips.
Davr

1
Microchip hat einige PICs mit CAN. microchip.com/wwwproducts/Devices.aspx?dDocName=de010302 . Ich gebe jedoch zu, dass sie etwas "funky" zu programmieren sind, insbesondere in den C18 / C30-Bibliotheken von Microchip. Bei der Codeüberprüfung haben wir einige Bibliothekscodes beobachtet, die aufgrund von Implementierungsdetails sehr schwierig zu lesen waren - einen Sendepuffer, der als Empfangspuffer verwendet wird, und Markierungsnamen, die das Gegenteil von dem darstellen, was sie darstellen. Auf keinen Fall würde ich jemanden empfehlen, der noch keine Erfahrung mit der Entwicklung von Mikrocontrollern hat.
J. Polfer

2
CAN und RS-485 sind wirklich Äpfel und Orangen. CAN definiert das Bit-Level-Protokoll sowie die physikalische elektrische Schicht (PHY). RS-485 ist nur eine physikalische Schichtspezifikation, es gibt nichts über das Protokoll an. Es liegt ganz bei Ihnen, ein aktuelles Protokoll auf dem RS-485-PHY zu finden oder zu implementieren. CAN wurde für Umgebungen mit hohem Geräuschpegel entwickelt und wird hauptsächlich in der Automobil- und Fertigungsindustrie eingesetzt. Das Protokoll ist ein ziemlich komplexes Nachrichtenübermittlungssystem und hat einen sehr hohen Overhead (niedrige tatsächliche Datenrate), aber eine hohe Datenintegrität.
Mark

10

Mehrere Füße sollten nicht problematisch sein, verwenden Sie nur verdrillte Drähte, wenn Sie können. SPI ist viel einfacher zu puffern (wenn nötig) als I2C, da alle SPI-Signale unidirektional sind, während sich die I2C-Signale auf gemeinsam genutzten Leitungen befinden.

Können die AVR-Mikrocontroller sowohl I2C- und SPI-Slave-Modi als auch Master-Modi verarbeiten? (du würdest beides brauchen)


2
verdrillte Drähte? Verdrehen Sie NIEMALS die I2C-Daten- und Taktleitungen! Mit SPI ist dies wahrscheinlich weniger problematisch, aber ich würde niemals Signalleitungen verdrillen, es sei denn, es handelt sich um ein symmetrisches Paar. In diesem Fall ist das Verdrillen eine sehr gute Idee.
Wouter van Ooijen

Sag niemals nie; Ich würde jeden Tag eine geringfügige kapazitive Kopplung (wegen Verdrehung) zwischen Daten und Uhr nehmen, anstatt eine geringfügige induktive Kopplung mit einer verrauschten Leistungselektronik (wegen Nichtverdrehung)
Jason S

4
Entschuldigung, ich bin definitiv anderer Meinung. Im 1-Zustand haben die Leitungen eine ziemlich hohe Impedanz. Ich habe gesehen, wie es gescheitert ist. Die beste Option besteht darin, auf beiden Seiten der I2C-Leitungen Erdungsleitungen mit geringem Strom zwischen oder noch besser zu haben.
Wouter van Ooijen

10

Für I2C über große Entfernungen möchten Sie möglicherweise einige "I2C-Bus-Repeater" -Lösungen suchen. Beachten Sie, dass sich die maximale Entfernung, die Sie möglicherweise für die I2C- oder SPI-Kommunikation finden, hauptsächlich auf die Gesamtbusentfernung und nicht auf die Entfernung zwischen zwei Knoten in einem Bus bezieht.

Vielleicht möchten Sie nach RS485 suchen, um diese Probleme zu beheben. Es handelt sich um ein serielles Busprotokoll, das über differentielle Leitungen kommuniziert, sodass bei Verwendung von verdrillten Kabeln das Risiko von Rauschen minimiert wird. Auf diese Weise können sehr große Entfernungen erreicht werden. Der Nachteil wäre, dass Sie einen zusätzlichen RS485-Encoder-IC (wie einen MAX485, nicht sehr teuer) in Ihrer Schaltung benötigen würden.


RS485 ist definitiv ein guter Weg für so etwas.
Scott Murphy

Denken Sie daran, dass RS485 zwei Aspekte hat, die sich von RS232 unterscheiden und sich voneinander unterscheiden: die physischen differentiellen Logikpegel und den Multimaster-Aspekt. Sie können diese auswählen, wir haben sowohl LVDS- als auch RS485-Umsetzer mit UART (RS232) für Punkt-zu-Punkt-Verbindungen verwendet, ohne in die Multidrop-Bereiche von RS485 einzudringen.
Jason S

2
übrigens RS485 ist kein Protokoll! es definiert nur die physikalische Schicht. Allerdings können Sie SPI definitiv über RS485 nutzen !!! Es wäre eine gute Lösung, die Kommunikation bei Bedarf im SPI-Modus zu halten (ich gehe davon aus, dass dies der Fall ist und möglicherweise eine Verbindung zu einem Remote-ADC oder ähnlichem besteht). Wenn Sie SPI über RS485 verwenden, müssen Sie überprüfen, ob die Anstiegsraten des Transceivers mit den vorgeschlagenen SPI-Datenraten kompatibel sind
smashtastic

8

Ein noch nicht erwähnter Vorteil von SPI gegenüber I2C ist, dass alle SPI-Drähte unidirektional sind und immer hoch oder niedrig angesteuert werden. Dies ermöglicht eine viel schnellere Kommunikation als mit I2C, verringert die Störanfälligkeit und ermöglicht die Verwendung einfacher Gates als Repeater. Eine weitere nützliche Option ist die einfache asynchrone Kommunikation (ein Draht pro Richtung). Der einzige Nachteil, den ich bei der asynchronen Kommunikation feststellen kann, ist, dass im Allgemeinen beide Seiten mit einer stabilen Uhr "wach" sein müssen, um Daten austauschen zu können.

Für ein eigenes Projekt habe ich ein leicht modifiziertes 3-Draht-SPI-Protokoll verwendet und die Ergebnisse als zufriedenstellend befunden. Ich sende Anzeigebitmapdaten (bei denen gelegentliche Datenverfälschungen keine große Rolle spielen würden) problemlos mit 10 MBit / s und andere Daten mit 2,5 MBit / s.


Dies ist eine sehr alte Antwort, aber würden Sie sagen, über welche Entfernung Sie Ihr modifiziertes SPI-Protokoll gesendet haben? (Das ist der Punkt der Frage ...)
Daniel Griscom

@DanielGriscom: In der Regel über 3 Fuß, über eine nicht besonders beeindruckende Verkabelung, aber manchmal länger.
Supercat

6

Während sowohl I2C als auch SPI für kurze Strecken (einige Zoll) ausgelegt sind, können beide auf längeren Strecken mit geeignetem Kabel und unter Berücksichtigung der Gesamtbuskapazität verwendet werden.

Obwohl ich wenig Erfahrung mit SPI habe, ist I2C nicht besonders schwierig, da Sie immer die richtige Größe für Ihren Pull-up-Widerstand berechnen müssen. Darüber hinaus gibt es dedizierte und kostengünstige I2C-Puffer, die recht einfach zu verwenden sind. Sie müssen jedoch immer noch einen Pull-up-Widerstand mit der richtigen Größe für Ihr Netzwerk verwenden.

Ich habe I2C verwendet, um zwei AVRs in einem Abstand von 8 Fuß miteinander zu vernetzen, wobei ich nur Pull-up-Widerstände und ein hochwertiges, gut abgeschirmtes, verdrilltes Kabel verwendet habe.


Bei Mehrleiterkabeln muss auf I2C geachtet werden, da die Kapazität den Bus erheblich verlangsamen kann.
Jason S

6

Wie viele vorgeschlagen haben, eignen sich I2C und SPI am besten für kurze Entfernungen. Es ist zwar möglich, eine Lösung mit diesen Schnittstellen zu implementieren, ich würde jedoch dringend empfehlen, dass Sie nach einer anderen, "standardisierteren" Lösung suchen (z. B. Ethernet, RS485, CAN usw.). - Vor allem, wenn Sie Kabel verwenden möchten, um den 6-Fuß-Abstand zwischen den Mikrocontrollern zu erreichen.


6

Die Schnittstelle zwischen der kabellosen Nintendo Wii-Fernbedienung und ihrem Nunchuck-Begleiter verwendet I2C über ein Kabel, das etwa einen Meter lang ist. Es gibt auch 3-Fuß-Verlängerungskabel, die die Gesamtlänge auf ca. 6 Fuß verlängern. Nicht genau das gleiche wie Ihr Setup (nur zwei Geräte sind miteinander verbunden), aber es ist ein Beispiel für I2C über ein Kabel in einem weit verbreiteten Verbraucherprodukt.


4

Ich habe an einem Projekt mit etwa 80 AVR-basierten Knoten in einem Sternnetzwerk gearbeitet, das über I2C kommuniziert. Es war ein totales Durcheinander und hat am Ende nicht funktioniert. Das Abrufen von Updates für alle Knoten dauerte Sekunden, und eine fehlerhafte Verbindung löste das gesamte Netzwerk aus. Zuletzt habe ich mit dem Typ gesprochen, der die Knoten erstellt hat. Er sagte, er habe die Verwendung von I2C für Projekte wie dieses eingestellt. Leider weiß ich nicht, warum gerade I2C hier unzureichend war.


1
I2C ist viel langsamer als SPI ... es könnte auch daran liegen, wie Ihr Projekt die Arbitrierung im Falle von Kollisionen verwaltet hat ... oder die Kapazität war bei all diesen Knoten hoch genug, dass Sie nur eine langsame Taktrate verwenden mussten.
Jason S

2

Mit diesen kurzen Strecken sollte es einfach sein. Was Sie tun könnten, ist herauszufinden, was diese Abstände und Ihre Verkabelung in Bezug auf Kapazität und Leitungsimpedanz bedeuten, und zu sehen, welche Arten von Frequenzen (Anstiegs- / Abfallzeiten) Sie durch sie hindurch bekommen können. Über einen bestimmten Punkt hinaus ist es am besten, sie als Übertragungsleitungen zu behandeln. Wenn es schlecht aussieht, können Sie in der Tat auf eine andere serielle Leitung wie EIA-232 oder 422 umsteigen. Dies kann bedeuten, dass an beiden Enden ein zusätzlicher Chip vorhanden ist, der sich jedoch weit ausdehnt. Wenn Sie wirklich schnell und weit gehen müssen, brauchen Sie etwas mehr (Ethernet, ohne Radio oder Laser :).


2

Wenn Sie die Taktrate steuern können und keine Hochgeschwindigkeitsdatenübertragung benötigen, sollten Sie versuchen, die Taktrate zu verlangsamen. Dies macht es weniger anfällig für Rauschen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.