Kann ich I2C über 2 m Kabel verwenden?

24

In meinem aktuellen Projekt muss ich über I2C zwischen einem Mikrocontroller und einigen Sensoren kommunizieren. Einer von ihnen ist ein Temperatursensor, der ungefähr 2 Meter vom Mikrocontroller entfernt angebracht werden muss. Ich kann kein anderes Protokoll auswählen (der Sensor befindet sich auf einem Modul mit angegebenem Anschluss / Stiften / Protokoll).

Glauben Sie, dass es möglich ist, in dieser Konfiguration zu kommunizieren? Welche Informationen sollte ich nachschlagen, um sicherzustellen, dass dies möglich ist oder nicht möglich ist? Hast du einen Rat?

Es ist mein erstes Mal, dass ich außerhalb der Leiterplatte mit dem IC kommuniziere.

JackOfHearts
quelle
5
Bitte fügen Sie weitere Informationen hinzu. Was wäre i2c Geschwindigkeit? Pull-up Widerstände? Benutztes Kabel und dessen Kapazität? Was ist die Host-MCU und was ist der Sensor? Im Allgemeinen funktioniert I2C jedoch mehrere Meter über Kabel wie HDMI, sodass es funktionieren sollte, wenn die Dinge richtig gemacht werden.
Justme
6
"Ich kann kein anderes Protokoll auswählen" Sie können einen zweiten Mikrocontroller in der Nähe des Sensors platzieren, die Daten lesen und mit einem beliebigen Protokoll senden.
FooBar
1
Hast du eine Mindestgeschwindigkeit in kbit / s?
Mast
2
Wenn Sie die Uhr verlangsamen, können Sie ziemlich lange Strecken zurücklegen.
Kupfer.hat

Antworten:

36

I2C ist nicht für den Einsatz über große Entfernungen ausgelegt, aber ich kenne einige Anwendungen, bei denen es tatsächlich über eine Entfernung von etwa 2 Metern eingesetzt wird. Ich kenne auch einen Fall, in dem sie Probleme damit hatten, und es wurde schließlich behoben, indem ich glaube, Erdschleifen reparierte.

Um sicherzustellen, dass es funktioniert, sollten Sie einen I2C-Bus-Extender wie den P82B715 verwenden.

Das Datenblatt des PB2B715 besagt jedoch Folgendes in Abschnitt 8.2:

Bei typischen Twisted Pair- oder Flachkabeln, wie sie für Telefonie- oder Ethernet-Verkabelungen (Cat5e) verwendet werden, beträgt diese Kapazität etwa 50 pF bis 70 pF / Meter, sodass das Kabel theoretisch bis zu 50 m lang sein kann . Aus praktischer Erfahrung hat sich 30 m als sichere Kabellänge erwiesen, um auf diese einfache Weise bis zu 100 kHz mit den angegebenen Werten gefahren zu werden . Größere Entfernungen und höhere Geschwindigkeiten sind möglich, erfordern jedoch eine sorgfältigere Auslegung.

So sagen die Experten (NXP ist der frühere Philips, der Erfinder von I2C), dass sich 30 Meter als machbare Distanz erwiesen haben. Meiner Erfahrung nach sind 2 Meter eine machbare Strecke, und die mir gemeldeten Erfahrungen zeigen, dass auch stärker belastete I2C-Busse ohne Extender möglich sind.

Die wichtigsten Punkte für den Einsatz von I2C-Bussen auf langen Strecken sind:

  • Verwenden eines Kabels mit niedriger Kapazität (Twisted Pair / Ethernet);
  • Begrenzung der Busgeschwindigkeit;
  • Klimmzüge haben, die die richtige Größe haben.

Pullup-Berechnung

Texas Instruments verfügt über einen guten Anwendungshinweis (SLVA689) zur Pull-up-Berechnung .

  • Die Untergrenze des Pullups (Minimalwert) wird durch den Strom bestimmt, den das schwächste Peripheriegerät auf dem Bus ziehen kann, und durch die maximale Spannung, die 0 für ein Peripheriegerät darstellt. Wenn also 1V immer noch 0 ist, ist Ihr VCC maximal 3V6 und Ihr schwächstes Gerät kann nur 20mA ziehen, Ihr Widerstand wird durch den Spannungsverlust über dem Widerstand und den von diesem Gerät gezogenen Strom bestimmt: .(3.6 V-1 V) / 20 mEIN=130 Ω
  • Die Obergrenze wird durch die maximale Anstiegszeit bestimmt: Ihre maximale I2C-Frequenz hängt direkt damit zusammen, es gibt jedoch auch eine vom Protokoll festgelegte Obergrenze. Die Obergrenze ist . Dabei ist die maximale Anstiegszeit und die . Wenn also 400pF ist und der Bus im Standardmodus arbeitet ( = 1ms), dann finden Sie . Der Anwendungshinweis von TI enthält Diagramme, mit denen Sie schnell geeignete Werte finden können.Rmax=tr/(0.8473Cb)trCbCbtrRmax=2950 Ω
  • Natürlich ist der Wert für den Pullup der äquivalente Wert aller parallel kombinierten Pullups. Sie können einen Pullup auf der Master-Seite, der Slave-Seite und jedem anderen Slave / Master auf dem Bus haben.
  • Je mehr Sie "am Limit" sind, desto mehr müssen Sie auch "Parasiten" wie den Spannungsabfall im Kabel berücksichtigen.
le_top
quelle
Klimmzüge in der richtigen Größe haben? Wie bestimme ich den Wert und die Nennleistung?
Quantum0xE7
Wie Nick B eine andere Antwort kommentierte , seien Sie vorsichtig, wenn der Bus-Extender-Chip oder was auch immer den Temperatursensor um ein paar Grad aufheizt.
Peter Cordes
14

Sie sind in der Regel auf eine maximale Buskapazität von 400 pF begrenzt.

Dies sollte funktionieren, wenn Sie die Frequenz auf 1 kHz senken und die Stromversorgung neben dem Sensor entkoppeln.

Wenn Sie etwas Robusteres benötigen, können Sie an beiden Enden differentielle I2C-Wandler wie PCA9615 verwenden .

filo
quelle
Ich erinnere mich schwach an einige Sensoren mit einer minimalen I2C-Frequenz (nicht sicher warum).
Michael
14

Sie können, aber es wird nicht empfohlen.

Unterschiedliche Busse für unterschiedliche Zwecke

I2C ist wie SPI für die Kommunikation innerhalb eines Boards oder einer Gruppe von Boards konzipiert (denken Sie an Raspberry Pi und seine Hüte oder Arduino und seine Schilde). Es kann über größere Entfernungen funktionieren (siehe andere Antworten), sollte aber in diesen Fällen nicht verwendet werden, einfach weil es nicht dafür entworfen, optimiert und qualifiziert wurde.

Das Risiko, das Sie eingehen, besteht darin, dass Sie möglicherweise in Zukunft nicht mehr Sensoren hinzufügen können oder dass Ihr System nicht überall funktioniert oder unter bestimmten Umständen ausfällt.

Was Sie suchen sollten, ist ein Feldbus, so etwas wie 1-Draht, CAN, RS-485, Ethernet usw.

Drahtlose Systeme wie Bluetooth oder ZigBee könnten ebenfalls eine Option sein.

Sclrx
quelle
9

Wie von @filo bemerkt, ist I2C im Allgemeinen durch die Buskapazität begrenzt. Es gibt jedoch Möglichkeiten, dies zu umgehen:

  1. Verwenden Sie einen Bus Extender. Das P82B96 oder das PCA9600 wären in Ihrem Fall beide gute Optionen.
  2. Wenn Sie höhere Geschwindigkeiten oder extrem lange Kabel benötigen, können Sie einen differentiellen I2C-Transceiver wie den PCA9600 verwenden . Dies macht Ihre Schaltung jedoch erheblich komplizierter und Sie benötigen einen IC an beiden Enden des Kabels.

Weitere Informationen finden Sie unter AN10658 und AN11084 von NXP.

Caleb Reister
quelle
1
Dies wird mit einem Bus-Extender funktionieren, wie mehrere andere gesagt haben. Unmittelbar darauf zu achten ist, dass der Bus-Extender am Sensorende genügend Wärme abgeben kann, um den Temperatursensorwert um einige Grad anzuheben, wenn Sensor und Bus-Extender nahe beieinander liegen.
Nick B
4

Ich mag die Antworten von Filo und Caleb.

Eine weitere Möglichkeit besteht darin, eine oder mehrere DS28E17 1-Wire-to-I2C-Master-Bridges an den einzelnen Sensoren zu verwenden und den Bus als Onewire zu verdrahten. Dies ist gut für Busse mit mehr als 100 m Länge geeignet und eignet sich gut für Sensorarray-Anwendungen mit niedrigem Durchsatz wie verteiltes Temperatur- und Batteriemanagement.

Janka
quelle
Interessanter Gedanke, obwohl es zusätzlichen Software-Overhead verursachen kann, wenn der Master keine 1-Wire-Schnittstelle hat.
Caleb Reister
Es ist meistens eine Option, wenn Sie einen Linux-Host haben, da dieser über den vollständigen Treiberstapel für diesen Stunt verfügt. Auf einem Raspberry Pi müssen Sie nur GPIO4 über diese 100 m Kabel (plus GND natürlich) mit dem 1-W-Eingang des DS28E17 verbinden, die Datei config.txt bearbeiten und fertig. Es ist vollständig transparent und sieht aus wie eine lokale I²C. Einfach langsamer.
Janka
Vielen Dank. Ich war wirklich überrascht, dass 1-Wire diese Distanz schaffen kann. Ich denke, es macht Sinn, da die Widerstände kleiner sind.
Domen
Onewire basiert nicht auf dem Timing der ansteigenden Flanke, sondern das gesamte Bit-Timing erfolgt in Bezug auf die abfallende Flanke, die aktiv angesteuert wird. Deshalb ist es weniger anfällig für hohe kapazitive Belastungen. Ein paar nF sind ok
Janka