Übersprechen durch I2C

Ich verwende ein Arduino, um mit I2C-Magnetometersensoren zu kommunizieren. Die Teileliste und ein grundlegendes Blockdiagramm der Verdrahtung sind unten dargestellt:

Magnetometer HMC5883L:

https://learn.adafruit.com/adafruit-hmc5883l-breakout-triple-axis-magnetometer-compass-sensor/overview

TCA9548A I2C-Expander:

https://learn.adafruit.com/adafruit-tca9548a-1-to-8-i2c-multiplexer-breakout/overview

Standard-4-Pin-Flachbandkabel:

https://www.digikey.com/product-detail/en/3m/8125-04-100/ML04G-100-ND/1107830

Rechteckiger Standard-6-Pin-Header:

https://www.digikey.com/product-detail/en/sullins-connector-solutions/PPTC061LFBN-RC/S7004-ND/810145

Standard-4-Pin-Header:

https://www.digikey.com/products/en?keywords=3M9449-ND

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Ich entschuldige mich für das Schema, aber ich musste es vereinfachen, um es klarer zu machen. Im Wesentlichen verwenden wir einen Arduino Uno, um mit einem I2C-Multiplexer von sechs Magnetometersensoren zu lesen. Der Multiplexer ist an einer für den Arduino hergestellten Leiterplatte befestigt, also sehr nahe daran, und die Sensoren sind in einem Abstand von 1,5 Metern über ein Flachbandkabel entfernt, das über Stiftleisten mit der Leiterplatte verbunden ist. Das Schema zeigt nur einen Sensor, da alle sechs es unordentlich machen würden, aber die anderen Sensoren sind auch auf die gleiche Weise angeschlossen.

Nach dem, was ich über I2C gelesen habe, gibt es einige Probleme mit Übersprechen, und gemäß einer anderen gestellten Frage wird empfohlen, VDD und GND zwischen SDA und SCL zu platzieren, um das Auftreten von Übersprechen zu reduzieren und / oder zu verhindern. Der HMC5883L versagt in dieser Hinsicht, also habe ich mit meinem Flachbandkabel die Drähte gekreuzt, sodass VCC und GND zwischen SDA und SCL liegen. Es ist nicht die eleganteste Lösung, aber es ist die einfachste Lösung. Die Kreuzung tritt nur am Sensorende des Kabels auf (weniger als 1 Zoll), nicht in der Mitte, aber ich habe mich gefragt, ob dies ein Problem mit der I2C-Kommunikation sein würde. Um ehrlich zu sein, habe ich dies mit zwei Sensoren getestet, daher bin ich ziemlich zuversichtlich, dass diese Konfiguration mit allen 6 Sensoren funktionieren wird, aber ich wollte fragen, nur für den Fall, dass ein Problem auftreten könnte, das ich nie in Betracht gezogen habe.

Falls Sie sich fragen, musste ich die 10k-Pull-up-Widerstände auf den SDA- und SCL-Leitungen hinzufügen, damit die Sensoren aus 1,5 Metern Entfernung gelesen werden konnten. Als ich es zunächst auf einem Steckbrett aufgestellt hatte, reagierten sie nicht, und erst als ich die Widerstände hinzufügte, konnten sie aus großer Entfernung gelesen werden. Die Sensoren selbst haben 10k-Pull-up-Widerstände, aber ich nehme an, dass das Verringern des Widerstands eine größere Entfernung ermöglichte. Die Widerstände sind 10k SMD-Widerstände, die sich auf der Leiterplatte selbst befinden.

10k scheint für I2C-Pullups sehr schwach zu sein, es sei denn, Ihre SCL-Rate ist extrem langsam. Ich sehe auch nicht, wie viel Übersprechen auftreten kann, wenn man bedenkt, dass die SCL-Rate im Allgemeinen zwischen 100 und 400 kHz liegt. Meiner Erfahrung nach verursachen die Anstiegs-/Abfallzeiten von SCL und SDA die meisten Kommunikationsprobleme.
Beachten Sie, dass das Datenblatt des HMC5883 2,2-K-I2C-Pullup-Widerstände zeigt. Eine andere Sache: Da diese Chips während einer Messung einen großen, kurzen Impulsstrom anlegen, ist es möglich, dass ein marginaler Speicherkondensator (neben dem Chip) einige Impulsströme auf Ihrem langen Versorgungspfad verursacht. Impulsströme könnten I2C-Transaktionen beschädigen oder die Störfestigkeit verringern.
(a) Ich habe dies ein paar Mal gelesen, aber obwohl ich viele Hintergrundinformationen und ein oder zwei Missverständnisse sehe, kann ich eine bestimmte Frage nicht erkennen. Was ist die konkrete Frage? (b) Wenn ich raten müsste, was Ihre Frage ist, wäre die Antwort "Der beste Weg, um sicherzugehen, ist die Verwendung eines Oszilloskops", also frage ich Sie: Haben Sie Zugang zu einem Oszilloskop und haben Erfahrung darin verwenden (oder Zugang zu jemandem haben, der dies tut)?
Außerdem scheint es viele Überschneidungen zwischen dieser Frage und Ihrer früheren " Designüberlegungen für Arduino-Board mit TCA9548A-Multiplexer und HMC5883L-Sensoren " zu geben. Das war wieder zu weit gefasst, als dass ich versuchen wollte, darauf zu antworten, und wahrscheinlich alles falsch erraten, was Sie zu fragen versuchten. Wenn Sie auf eine Frage keine Antwort erhalten, verbessern Sie die Frage , anstatt eine andere sehr ähnliche Frage zu stellen oder ein Kopfgeld anzubieten .
Sam, danke für deinen Vorschlag. Ich habe nie daran gedacht, ein Oszilloskop zu verwenden, um das Signal zu betrachten, aber in diesem Fall werde ich es verwenden und es mir ansehen. Ich habe die internen Klimmzüge des Chips nicht berücksichtigt. Ich habe mir gerade die Breakout-Board-Schaltpläne angesehen.
Übersprechen sollte wirklich kein Problem in Situationen sein, in denen I2C eine geeignete Protokollwahl ist. Anders gesagt, wenn Ihr Kabel lang genug ist, damit Übersprechen eine Rolle spielt, gibt es andere Gründe, I2C nicht zu verwenden.
Wenn Sie selbst bei einem kurzen Kabel Übersprechen sehen, reduzieren Sie die Pull-up-Widerstandswerte und fügen Sie I2C-Treibern kleine (5-10 Ohm) Reihenwiderstände hinzu.
@ user101402 "Ich habe die internen Pull-ups des Chips nicht berücksichtigt." Zu Ihrer Information, der HMC5883L hat keine I2C "internen Pull-ups".
Entschuldigung, habe das Datenblatt noch einmal überprüft; Ich sah, dass es für ein Referenzdesign war. Interessant zu sehen, wie Adafruit das empfohlene Design nicht befolgt hat.

Antworten (2)

Was ist Ihre I2C-Geschwindigkeit? Je nach Geschwindigkeit und Entfernung kann I2C für einen Hochgeschwindigkeitsbus mit niedriger Impedanz bis auf 1k sinken. Siehe http://www.ti.com/lit/an/slva689/slva689.pdf

Was genau meinst du mit:

Die Kreuzung tritt nur am Sensorende des Kabels auf (weniger als 1 Zoll), nicht in der Mitte

Durch das „Kreuzen“ der Drähte besteht die gute Praxis darin, die beiden I2C-Leitungen nicht nebeneinander laufen zu lassen. Dies ist beispielsweise eine schlechte Vorgehensweise für ein langes Flachbandkabel:

  1. VCC
  2. Masse
  3. SDA
  4. SDL

Eine "bessere" Art, Dinge zu tun:

  1. VCC
  2. SDA
  3. Masse
  4. SDL

Auf diese Weise schirmt GND SDA von SDL ab. GND selbst kann jedoch Rauschen erzeugen, wenn die Umgehung auf beiden Seiten des Kabels nicht ausreichend ist.

Der beste Weg wäre, zusätzliche Drähte zu haben, um die Signale abzuschirmen:

  1. VCC
  2. Masse
  3. SDA
  4. Masse
  5. SDL
  6. Masse

Dies wird beispielsweise bei allen IDE-Flachbandkabeln verwendet.

Vielen Dank für Ihren Kommentar. Das meinte ich mit überkreuzen der Drähte. Ich habe versucht, der guten Praxis zu folgen, obwohl ich SDA und SCL an den Enden hatte, mit VCC und GND in der Mitte. Ich habe nie daran gedacht, SDA zwischen VCC und GND zu stecken, aber dafür ist es jetzt zu spät.

Zum Hauptthema Ihrer Frage, dem möglichen Übersprechen, habe ich keine Meinung, da ich keine Erfahrung damit habe.

Aber ich habe einen Kommentar zu den Pull-up-Widerständen.

Aus dem Datenblatt des Teils geht meines Erachtens hervor, dass Sie auf beiden Seiten des TCA9548A Pull-up-Widerstände benötigen. Es gibt auch eine relevante Frage auf dem offiziellen Support-Kanal von TI, wo TI sagt, dass Sie Widerstände auf beiden Seiten haben müssen, auf den Upstream- und den Downstream-Kanälen.

Trotzdem hast du recht, wenn du sagst

Ich nehme an, dass die Verringerung des Widerstands eine längere Entfernung ermöglichte

Es trifft hier nicht zu, aber es ist allgemein wahr. Wie Sie im Datenblatt des Teils, Abschnitt 9.2.2, sehen können, wird der maximal zulässige Pull-up-Widerstandswert definiert durch

R P ( M A X ) = T R 0,8473 C B

Je länger die Drähte, desto höher die Buskapazität C B und desto niedriger ist der maximale Widerstand, den Sie verwenden können.

Danke für deine Antwort. Ich habe versucht, Pull-up-Widerstände mit dem TCA9548A einzusetzen, aber das Gerät reagierte nicht mehr. Es funktionierte, als ich die Widerstände entfernte.