I2C-Bus-Multiplexing-Problem

Ich sehe einen unerwarteten Nebeneffekt und könnte einige Hinweise gebrauchen. Ich arbeite an einem Projekt, das fünf TCS34725- Farbsensoren verwendet. Diese Sensoren werden über I2C an ein TI F28069M DSP Launchpad angeschlossen . Das erste Problem, mit dem ich konfrontiert war, war, dass die Farbsensoren alle dieselbe Adresse haben (und sie nicht umgeschrieben werden können). Ich erhielt einen DG407 Dual 8-Kanal-Analog-Mux, um eine Lösung zu versuchen. Zuerst dachte ich, diese Lösung sei ziemlich einfach – ich würde den Mux für SDA und SCL verwenden. Was ich jedoch sehe, ist, dass die erste von mir eingestellte Mux-Adresse einwandfrei funktioniert, ich kann die Farbsensor-ID lesen und Konfigurationsregister lesen / schreiben usw TI-DSP.

Meine Theorie ist, dass der Mux zwischen Adressänderungen vorübergehend auf hohe Impedanz übergeht und dieser Zustand mit hoher Impedanz vom DSP irgendwie als Startbedingung angesehen wird und daher den Bus bis zu einem Reset für immer beschäftigt.

Gemäß dem technischen Referenzhandbuch des DSP kann ich das I2CMDR.IRS-Bit auf 1 setzen, wodurch das Peripheriegerät effektiv deaktiviert, seine Statusbits zurückgesetzt und seine Konfiguration beibehalten werden. Ich habe versucht, dieses Bit zu setzen, 10 uS zu verzögern, den Mux umzuschalten, 10 uS zu warten und dann das Bit zu löschen, aber ich sehe das Problem immer noch.

Irgendwelche Ideen, wie ich diesem Problem auf den Grund gehen kann?

Schaltplan unten.

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Haben Sie einen Oszilloskop- oder Logikanalysator?
Ein schematischer Ausschnitt würde auch nicht schaden.
@uint128_t, ich habe einen Bereich. Als ich die SDA- und SCL-Leitungen auf der DSP-Seite betrachtete, sah ich nichts Beunruhigendes. Der Buspegel schien während des gesamten Übergangs hoch zu bleiben.
@NickAlexeev, Schema zur Verdeutlichung hinzugefügt.
Haben Sie Pull-up-Widerstände auf allen Seiten des Mux?
@ Tom Carpenter, nein, aber ich hätte erwähnen sollen, dass die internen Pull-Ups auf der DSP-Seite aktiviert sind. Ich habe mit mehreren externen Klimmzügen (von 180 bis 2,7k) auf der Sensorseite getestet, um die Wellenformen zu bereinigen, aber das Oszilloskop zeigte, dass der Sensor die Leitung nicht weit genug nach unten ziehen konnte, wenn auf der Sensorseite externe Klimmzüge verwendet wurden Bestätigung des I2C-Kontrollflusses.

Antworten (2)

Versuchen Sie, sowohl auf der Eingangs- als auch auf der Ausgangsseite des Mux Pull-up-Widerstände auf den I2C-Bus zu setzen. Wenn Sie bereits kleinere Widerstände (1 bis 2k) auf der Ausgangsseite haben, wäre es sinnvoll, größere (10k) auf der Eingangsseite hinzuzufügen, da sie nur dazu dienen würden, den hohen Pegel zu halten, während der Mux geschaltet wird, und nicht den Bus von niedrig nach hoch.

Das Problem ist höchstwahrscheinlich das Fehlen von Widerständen. Wenn Sie den Multiplexer von einem Kanal zum nächsten umschalten, ist der Ausgang des Kanals, den Sie gerade getrennt haben, jetzt schwebend. Aller Wahrscheinlichkeit nach wird es wahrscheinlich auf den Boden schweben, was zu seltsamen Start- / Stoppbedingungen auf den Slave-Geräten führen kann, je nachdem, welcher Mux zuerst auf Null abfällt.

Als Ergebnis der Umschaltung befindet sich der Slave jetzt wahrscheinlich in einem seltsamen Zustand, und wenn Sie den Mux wieder anschließen, ist er immer noch verwirrt und reagiert wahrscheinlich nicht mehr. Ich habe den leisen Verdacht, dass, wenn Sie versuchen, darauf zuzugreifen, nachdem es ein zweites Mal fehlgeschlagen ist, ohne den Mux zu ändern, der zweite Zugriff möglicherweise erfolgreich ist, da die Slave-Logik durch die Stoppbedingung des ersten fehlgeschlagenen Zugriffs zurückgesetzt wurde.


Die Lösung besteht darin, Pull-up-Widerstände an allen Zweigen des Mux hinzuzufügen , um sicherzustellen, dass die Kanäle im getrennten Zustand hoch schweben, wodurch falsche Start-/Stoppbedingungen verhindert werden.

Sie sagen, Ihre DSP-Seite hat interne Widerstände, was in Ordnung ist und den Master-Zweig des Busses hoch hält. Aber Sie brauchen immer noch Widerstände an den anderen Zweigen. Dies müssen nur Klimmzüge mit geringer Stärke sein, da sie nicht versuchen, die SDA/SCL-Kanten zu treiben, sie sind nur dazu da, das Niveau zu halten, wenn sie getrennt sind.

Der 180R, den Sie ausprobiert haben, ist viel, viel zu stark für I²C, und selbst 2,7k sind zu stark, wenn die Master-Seite bereits einigermaßen starke Klimmzüge hat. Wie @alex.forencich vorschlägt, ist 10k wahrscheinlich ein viel vernünftigerer Wert. Dieser sollte eine ausreichend geringe Antriebsstärke haben, um Ihren Sklaven keinen Ärger zu bereiten. Sie könnten mit dem Widerstand wahrscheinlich sogar noch höher gehen, wenn Ihre Sklaven Probleme haben – versuchen Sie es vielleicht mit 22k oder 47k.