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.
Antworten:
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.
quelle
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.
quelle
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:
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.
quelle
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.
quelle
Das Sparkfun I2C Breakout Board ist eine schöne Lösung mit folgenden Funktionen:
quelle
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.
quelle