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.
Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan
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.
uint128_t
Nick Alexejew
Jakob Kalvert
Jakob Kalvert
Tom Tischler
Jakob Kalvert