Ich erwäge ein Projekt, bei dem mehrere AVRs über einen Bus miteinander sprechen müssten. Sie würden bis zu 6 Fuß voneinander entfernt sein.
Es scheint, als könnten sowohl I2C als auch SPI eine Reihe von Mikros über einen Bus kommunizieren lassen, aber ich habe nichts darüber gesehen, wie lange das dauern würde. Hat jemand versucht, diese Protokolle über Entfernungen von mehreren Metern zu verbinden?
Wie andere gesagt haben, können SPI und I2C über große Entfernungen verwendet werden, solange die Pull-up-Widerstände, Taktfrequenzen usw.
Die Hauptalternativen (die eine bessere Störfestigkeit bieten) sind RS485 und CAN . Beide verwenden differentielle Leitungen, um Rauschprobleme zu minimieren, und sind für diese Länge der Datenübertragung besser geeignet als I2C oder SPI. Ich glaube jedoch nicht, dass viele (keine?) AVRs mit eingebauten CAN-Peripheriegeräten ausgestattet sind, die die CAN-Nutzung viel einfacher machen.
Ich würde sagen, dass das Wichtigste, was Sie bei der Auswahl eines Busses beachten sollten, darin besteht, sicherzustellen, dass das Protokoll, das Sie für die Kommunikation zwischen Geräten verwenden, einen CRC oder etwas Ähnliches 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.
Mehrere Meter sollten kein Problem sein, verwenden Sie einfach verdrillte Drähte, wenn Sie können. SPI ist viel einfacher zu puffern (falls erforderlich) als I2C, da SPI-Signale alle unidirektional sind, während die Signale von I2C auf gemeinsam genutzten Leitungen liegen.
Können die AVR-Mikrocontroller I2C- und SPI-Slave-Modi sowie Master-Modi verarbeiten? (Du brauchst beides)
Für I2C über große Entfernungen möchten Sie vielleicht nach einigen "I2C-Bus-Repeater" -Lösungen suchen. Denken Sie daran, 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 RS485 für diese Art von Problemen untersuchen. Es handelt sich um ein serielles Busprotokoll, das über differentielle Leitungen kommuniziert, sodass bei Verwendung von verdrillten Drähten die Wahrscheinlichkeit 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.
Nur zu Ihrer Information, die Schnittstelle zwischen der drahtlosen Nintendo Wii-Fernbedienung und ihrem Nunchuck-Begleiter verwendet I2C über ein etwa 3 Fuß langes Kabel. Es gibt auch 3-Fuß-Verlängerungskabel, die die Gesamtlänge auf etwa 6 Fuß verlängern. Nicht genau das gleiche wie Ihr Setup (nur zwei Geräte miteinander verbunden), aber es ist ein Beispiel für I2C über ein Kabel in einem weit verbreiteten Verbraucherprodukt.
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, reduziert die Störanfälligkeit und ermöglicht die Verwendung einfacher Gates als Repeater. Eine weitere nützliche Option ist eine einfache asynchrone Kommunikation (ein Draht in jede Richtung). Der einzige Nachteil, den ich bei der asynchronen Kommunikation sehen kann, ist, dass im Allgemeinen beide Seiten "wach" sein müssen, mit einer stabilen Uhr, um Daten auszutauschen.
Für ein eigenes Projekt habe ich ein leicht modifiziertes 3-Draht-SPI-Protokoll verwendet und fand die Ergebnisse zufriedenstellend. Ich sende Display-Bitmap-Daten (bei denen gelegentliche Datenbeschädigung keine große Sache wäre) mit 10 MBit/s und andere Daten problemlos mit 2,5 MBit/s.
Während sowohl I2C als auch SPI für Kurzstreckenstrecken (wenige Zoll) ausgelegt sind, können beide bei längeren Strecken mit geeigneten Kabeln 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 richtig dimensionierten Pull-up-Widerstand für Ihr Netzwerk verwenden.
Ich habe I2C verwendet, um zwei AVRs in einer Entfernung von 8 Fuß zu vernetzen, wobei ich nur Pull-up-Widerstände und hochwertige, gut abgeschirmte, verdrillte Kabel verwendet habe.
Wie viele vorgeschlagen haben, werden I2C und SPI am besten für kurze Entfernungen verwendet. Auch wenn es möglich ist, eine Lösung mit diesen Schnittstellen zu implementieren, würde ich Ihnen dringend empfehlen, sich nach einer anderen, "standardmäßigeren" Lösung umzusehen (z. B. Ethernet, RS485, CAN usw.). -- Vor allem, wenn Sie vorhaben, Kabel zu verwenden, um die Entfernung von 6 Fuß zwischen Mikrocontrollern zu erreichen.
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 würde das gesamte Netzwerk lahmlegen. Als ich zuletzt mit dem Typen gesprochen habe, der die Knoten erstellt hat, sagte er, er habe aufgehört, I2C für Projekte wie dieses zu verwenden. Leider weiß ich nicht, warum speziell I2C hier unzureichend war.
Bei so kurzen Distanzen sollte es einfach sein. Was Sie tun könnten, ist herauszufinden, was diese Entfernungen und Ihre Verkabelung in Bezug auf Kapazität und Leitungsimpedanz bedeuten, und zu sehen, welche Art von Frequenzen (Anstiegs- / Abfallzeiten) Sie durch sie erreichen können. Ab einem bestimmten Punkt ist es am besten, sie als Übertragungsleitungen zu behandeln. Wenn es schlecht aussieht, könnten Sie tatsächlich zu einer anderen seriellen Leitung wie EIA-232 oder 422 wechseln. Das könnte einen zusätzlichen Chip an beiden Enden bedeuten, wird aber weit reichen. Wenn Sie wirklich schnell und weit gehen müssen, brauchen Sie etwas mehr (Ethernet, zählen Sie nicht Radio oder Laser :).
Wenn Sie die Taktrate steuern können und keine Hochgeschwindigkeits-Datenübertragung benötigen, sollten Sie versuchen, die Taktrate zu verlangsamen. Dadurch wird es weniger anfällig für Geräusche.
Nick Alexejew