I2C-Signal und Leistung über große Reichweite (10 m Kabel)

9

Nach einigem Lesen / Testen gelang es mir, über I2C mit FTP CAT5 Kupfer-Twisted-Pair-Kabel eine stabile Kommunikation zwischen zwei Geräten herzustellen.

  • Grüner Draht - SCL
  • Weiß / grüner Draht - GND
  • Blauer Draht - SDA
  • Weiß / blauer Draht - GND

GND ist nur an einem Kabelende angeschlossen, der I2C-Bustakt ist bei 10 kHz und ich habe 10 kom Pullup-Widerstände für VCC verwendet

Es funktioniert gut und stabil. Als ich mich entschied, andere 2 Kabelpaare für die Stromversorgung (+12 V) zu verwenden, funktionierte es nicht mehr. Ich habe +12 V an einem Paar GND am anderen Paar getestet, auch +12 V / GND an demselben Paar: das gleiche Ergebnis, es hat aufgehört zu funktionieren. Der gesamte I2C-Bus funktioniert nicht mehr, andere Geräte sind ebenfalls angeschlossen.

Ich frage mich, ob ich dasselbe Kabel verwenden oder die sicherste Wahl treffen kann - ein anderes Kabel für die Stromversorgung.

user3503519
quelle
3
Haben Sie überprüft, ob die Stromversorgung auf der Empfangsseite ausreichend ist? Keine Störungen, keine Erschlaffungen ... CAT5-Kabel sind ziemlich dünn, deshalb verwendet PoE> 40 V für die Stromversorgung.
Vladimir Cravero
4
Hier benötigen Sie ein Oszilloskop. Alles andere wird (gebildete) Vermutung sein.
Pipe
1
Ich würde SDA oder SCL nicht mit GND verdrehen, weil Sie keine Kapazität zwischen ihnen wollen. Ich würde + 12V mit GND verdrehen, da Sie Kapazität zwischen ihnen wollen. Welchen (Rück-) Strom hat die + 12V? (Sie könnten Bodensprung haben)
Huisman
5
GND ist nur an einem Kabelende angeschlossen? Wenn ich nicht falsch verstehe, klingt das nicht richtig.
Mkeith
1
Meinten Sie UTP- Kabel? Ich bin sicher, es kann für mehr Protokolle als nur FTP verwendet werden;)
Andrew Morton

Antworten:

15

Möglicherweise übertrieben, wenn es zuvor funktioniert hat, aber eine Option ist die Verwendung eines I2C-zu-Differential-Wandlers wie PCA9615 , LTC4331 usw. Wenn die Widerstände kleiner werden, funktioniert dies nicht oder Sie müssen das Kabel verlängern, sollten Sie I2C nicht direkt verwenden.

Nicht nur die Reichweite wird erweitert, sondern Sie haben auch eine bessere Störfestigkeit.

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Wesley Lee
quelle
1
Gute Antwort, genau das sollte getan werden, aber es kann natürlich eine radikale Veränderung für das OP sein.
Jack Creasey
Ich meine, sie sind super einfach zu implementieren (im Vergleich zu RS-485, CAN usw.), aber ja, im Vergleich zum Ändern einiger Widerstände ist dies eine radikale Änderung.
Wesley Lee
1
Das Problem von @JackCreasey OP ist nicht nur die Kabelkapazität, sie scheinen auch unter Rauschen auf der von ihnen hinzugefügten 12-V-Leitung zu leiden. Das Absenken von Pull-up-Widerständen bietet eine zusätzliche Störfestigkeit, kann diesen Widerstand jedoch nicht unbegrenzt senken.
Dmitry Grigoryev
@DmitryGrigoryev Da das OP keine Details gab, bin ich mir nicht sicher, wie Sie vorschlagen könnten, dass Lärm injiziert wurde. Ich bin damit einverstanden, dass Sie die Terminierung / das Pullup nicht einfach weiter senken können. Aber der OP ist um 10: 1 zu groß.
Jack Creasey
9

Wie ich in einem Kommentar bemerkt habe, ist es schwierig, ohne Oszilloskopspur zu debuggen, aber das erste, was sich von Ihrer Frage abhebt, ist der 10-kOhm-Pull-up-Widerstand. Dies ist für I2C ungewöhnlich hoch, obwohl es in vielen Fällen leicht funktionieren könnte.

Ich würde versuchen, sie zuerst auf 1 kOhm zu senken, um zu sehen, ob es irgendetwas beeinflusst. Wenn es hilft, können Sie sie schrittweise erhöhen, obwohl dies Ihre Anstiegszeit beeinflusst.

Rohr
quelle
Ω
@ Huisman Zwei gute Punkte. 10 kOhm würde mich bei 10 kHz auf einer normalen Leiterplatte nicht beunruhigen, aber vielleicht reicht es nicht über das Kabel. Und 10 kHz ist ungewöhnlich, aber nicht verrückt, denke ich.
Pipe
7
10k Ohm sind für I2C über jede Entfernung enorm. Das ist das Hauptproblem des OP.
Jack Creasey
1
Ich denke, es ist besser, die Widerstände zu teilen und an jedem Ende einen zu verwenden. 2 Pullup-Widerstände bei 4,7 kΩ, einer an jedem Ende, sollten die bessere Wahl sein als ein einzelner 2,2 kΩ-Pullup-Widerstand.
12431234123412341234123
Ich werde versuchen, die Widerstände zu senken, das ist alles, was mir nach all diesen Kommentaren Sinn macht.
user3503519
5

Sie müssen Ihre Pullup-Widerstände unbedingt über große Entfernungen fallen lassen, und 10 m sind ein langer Weg und 10 kOhm sind sehr hoch.

Der Wert des Pullup-Widerstands hängt mit drei Dingen zusammen:

  1. Kabelkapazität
  2. Zielspannung und Rx-Pegel erfassen.
  3. Geschwindigkeit

Versuchen Sie es mit einem der verfügbaren Taschenrechner und beginnen Sie hier mit der TI-Anmerkung zu Pullup-Werten oder hier mit dem NXP I2C-Standard (7.1).

In Bezug auf das Problem, das Sie haben, sollte es offensichtlich sein, dass die Erdung zusätzlicher Paare (12 V, Gnd) im Kabel die Kapazität der I2C-Signaldrähte ändert.

Jack Creasey
quelle
2
Ich stimme zu, dass davon ausgegangen werden kann, dass das CAT5-Kabel etwa 50 pF pro Meter hat, sodass 10 Meter die Kapazitätsgrenze von 400 pF der I2C-Spezifikation überschreiten. Das Erreichen eines 400-kHz-I2C-Takts kann mit einer Kapazität von 400 pF nicht erreicht werden, wenn der angegebene 3-mA-Pull-up-Strom von Widerständen verwendet wird. Glücklicherweise hilft eine Verlangsamung der Geschwindigkeit - es sei denn, die Geräte haben eine minimale Taktgeschwindigkeitsbeschränkung. Wir wissen nicht, um welche Geräte es sich handelt und wie hoch die I2C-Busspannungen sind, aber in der Tat sollten Pullups so eingestellt werden, dass sie mindestens 3 mA liefern. Wenn Geräte die niedrige Spannung des Busses zulassen und sich darauf einigen, dann noch mehr.
Justme
Ja, ich werde damit testen, aber meine Frage ist, warum es funktioniert, wenn das Kabel nicht mit Strom versorgt wird.
user3503519
Ein schwebendes Kabelpaar hat nicht die gleiche Kapazität wie Ihr Signalpaar, wenn das Kabel geerdet ist. Für Ihre Konfiguration sind sowohl +12 als auch Gnd im Wesentlichen gleich. Sie haben eine Kapazität zum Signalkabel, die sich auf Ihre Anstiegszeit auswirkt. .
Jack Creasey
2

Ein paar Anmerkungen:

Insbesondere für SDA ist es wichtig, die richtigen Pull-up-Werte zu erhalten. Unterschiedliche Geräte können unterschiedliche Strommengen aufnehmen. Ich habe Setups gesehen, die aufgrund eines zu kleinen Pull-up-Widerstands zusätzliche 1s in den Daten erzeugen, nachdem auf einen kleineren Sensorchip umgeschaltet wurde. Die kleineren Geometrien bedeuteten, dass der Bus nicht auf eine saubere Null heruntergezogen werden konnte.

Geschwindigkeit tötet. Eine lange Kabelstrecke ist effektiv ein Tiefpass-LRC-Filter. Bei vielen I2C-Anwendungen können Sie die Uhr verlangsamen, ohne etwas zu verlieren. Ein langsamerer Takt kann einen schwachen Pull-up und eine große Kapazität ausgleichen (aber keinen zu starken Pull-up).

Lange Kabelstrecken sind eine Einladung an EMI. Ich habe eine I2C-Implementierung gesehen, die eine Ferritklemme benötigte, um die Immunitätsprüfung zu bestehen. Endanschluss, abgeschirmtes Kabel oder Filter können helfen.

Vorsicht vor parallelem Widerstand. Wenn Sie einen 1k-Pull-up am Master und dann einen 1k an jedem der vier Client-Geräte am Bus haben, dann haben Sie einen 200-Ohm-Netto-Pull-up. Ich werde nicht arbeiten.

Jason Treon
quelle
0

Das Sparkfun I2C Breakout Board ist eine schöne Lösung mit folgenden Funktionen:

PCA9615 buffer
I2C Supply voltage range 2.3-5.5V
Differential Supply voltage range 3-5.5V
draws 16µA of current
Extends I2C bus up to 100 feet
Data rate up to 400kHz
2x Qwiic Connectors

Geben Sie hier die Bildbeschreibung ein

Gatorback
quelle
-1

Erstens: Ich möchte mich bei der Community für die Veröffentlichung einer Antwort bedanken.
Zweitens: Ich habe eine Lösung gefunden, die auf diesen Antworten basiert. Folgendes habe ich getan:

Getestete Absenkwiderstände auf 4,7 K und 2 K getestet. Bei 2K erhalte ich von Zeit zu Zeit Antworten, daher reduziere ich mich auf 1K, dann erhalte ich Antworten, aber in jedem einzelnen fehlte ein Teil der Daten. Danach schaltete Pullup-Widerstand am SDA-Pin mit 10K und alles beginnt stabil zu arbeiten.
Die Lösung in meinem Fall ist also 1K Pullup auf SCL und 10K auf SDA.

Vielen Dank für Ihre Zeit.

user3503519
quelle
1
Das ist aber verrückt. Welche Art von Hardware verwenden Sie hier? Vielleicht ist etwas falsch konfiguriert.
Pipe
1
Auf der einen Seite ist es ESP32 mit Mikropython, auf der anderen Seite ist atmega8 mit Arduino IDE programmiert. Ich betrachte das schließlich nicht als sichere Kommunikation, also werde ich auf seriell (RS232)
umsteigen
1
Wenn ich Sie wäre, würde ich mir auch RS-485 ansehen, das noch robuster und noch einfacher wäre. Nachteil ist, dass mehr Signalkabel erforderlich sind, aber Sie haben bereits viele davon in Ihrem CAT5.
Pipe
1
Nun, ich sehe nicht ein, wie RS-485 ohne zusätzliche Konverter und Hardware direkt auf Atmega-Prozessor oder ESP 32 implementiert werden kann, daher ist RS-232 hier die beste Wahl. Es wird nur ein TTL-Level-Shifter verwendet.
user3503519