Ich möchte mehrere I2C-Slave-Geräte an einen Mikrocontroller anschließen, die sich alle auf demselben Pin befinden, aber die I2C-Geräte haben alle dieselbe Adresse. Die Adressen sind in der Hardware festgelegt.
Gibt es eine Möglichkeit, mehrere Geräte mit derselben Adresse zu verbinden?
Vielleicht eine Art I2C-Adressumsetzungsmodul, mit dem ich jedem Gerät eine konfigurierbare Adresse zuweisen kann.
Ich bin gerade auf dieses Problem mit mehreren I2C-Geräten mit einer festen Adresse gestoßen. Unsere Lösung bestand darin, die E / A-Leitungen des Mikrocontrollers zu verwenden, um die SDA-Leitungen der Geräte, die nicht adressiert werden sollen, auf einen hohen Pegel zu setzen, während die E / A-Leitung des Geräts, auf das wir abzielen, als Eingang festgelegt ist (hohe Impedanz) ). Dies bedeutet, dass nur das Zielgerät mit seiner I2C-Adresse übereinstimmt und die anderen alle nachfolgenden Daten ignorieren.
Die Widerstände auf der SDA-Leitung für die inaktiven Geräte dienen als Pull-Ups für den Bus. Der genaue Wert hängt also davon ab, wie viele Geräte Sie haben und welchen Pull-Up Sie für Ihren Bus benötigen. Wenn Sie sich also für 10K-Widerstände entscheiden, erhalten 3 inaktive Geräte einen 3K3-Pullup.
Die Schottky-Dioden stellen sicher, dass das Gerät die SDA-Leitung beim Zurücksenden von Daten an den Host immer noch tief genug ziehen kann.
quelle
Wenn keines der I2C-Geräte Clock-Stretching (Handshaking) verwendet und wenn Sie den I2C-Master mit einem Bit bangen, besteht ein einfacher Hack darin, einige der Geräte die Clock- und Datenpins tauschen zu lassen. Während der Übertragung eines Bytes sieht das Gerät, bei dem der Takt und die Datenstifte vertauscht sind, jedes "0" -Bit als Nichtereignis (Daten steigen und fallen ohne Takt) und jedes "1" -Bit als I2C-Stopp und starten (Takt steigt, während die Daten niedrig sind, Daten fallen und steigen, gefolgt von Takt fällt). Absichtliche Stopp- und Startbedingungen für ein Gerät können vom anderen als Datenbits angesehen werden, aber es sei denn, ein Gerät verfügt über eine übermäßige Anzahl von Start- und Stoppbedingungen zwischen "1" -Bits, ist es unwahrscheinlich, dass ein Gerät "versehentlich" startet.
quelle
Ich würde in Betracht ziehen, Bus-Switches zu verwenden, um den I2C-Bus zwischen den Geräten mit widersprüchlichen Adressen zu multiplexen. Bus-Switches haben eine sehr geringe Kapazität und einen sehr geringen Widerstand und sind im Gegensatz zu Puffern / Treibern echte Switches, die zwei Schaltungsknoten verbinden oder trennen.
Bus-Switches haben normalerweise eine ungerade Eigenschaft, die für I2C keine Rolle spielt, da sie Open-Drain-Geräte verwenden: Ein Bus-Switch hat einen niedrigen Einschaltwiderstand, wenn Spannungen nahe 0 (Vss) zusammengeschaltet werden, aber der Widerstand steigt dramatisch an, wenn sich die Spannungen nähern das Netzteil Vdd. (Dies liegt daran, dass es sich im Grunde genommen um MOSFETs mit Gate-Spannungen an der Stromversorgung handelt, wenn sie eingeschaltet werden. Wenn sich die geschalteten Spannungen also Vdd nähern, ist die verfügbare Vgs viel niedriger.)
quelle
Ich hatte zwei TCS3414-Farblichtsensoren, die ich vergleichen wollte (Die FN- und CS-Pakete, die unterschiedliche Filter haben). Die I2C-Adresse ist fest verdrahtet. Nachdem man sich angesehen hat, wie I2C in Bezug auf die SCL- (Clock) und SDA- (Data) Leitungen funktioniert, schien es, als würde das Ausschalten der SDA-Leitung verhindern, dass der Chip ein Start- oder Stoppbit bekommt und somit inaktiv bleibt. Verwenden Sie also einen CMOS-Analogschalter (4066B), um die SDA-Leitung zu jedem Gerät ein- oder auszuschalten. Dies funktionierte gut für den Wechsel zwischen den beiden Geräten. Ich weiß, es ist ein Hack, und der PCA9548 wäre viel besser, aber ich hatte keinen zur Hand.
quelle
Es gibt jetzt eine Antwort: Linear Tech verfügt über die Adressübersetzer der Serie LTC4316 / 17/18. Sie sind relativ neu und die Verfügbarkeit ist ungewiss.
quelle
Mehrere Hersteller bieten I2C-Bus-Multiplex- und Switch-ICs an.
Ein Mux kann jeweils einen Kanal aktivieren. Ein Switch kann mehrere gleichzeitig aktivieren.
Prüfen Sie zum Beispiel die Angebote von NXP , TI und Maxim .
Zum Experimentieren hat Adafruit eine TCA9548a-Platine .
Wenn Sie 8 Zielchips mit identischen Adressen haben, wählen Sie einen 8-zu-1-MUX. Konfigurieren Sie den MUX, um den richtigen I2C-Bus zu aktivieren, bevor Sie auf einen der Zielchips zugreifen.
Vorteile
quelle
Verwenden Sie einen einfachen Demux-Chip (z. B. 74HC139 afaik) und verbinden Sie den I2C-CLK-Pin mit dem Eingang (da nur der I2C-CLK-Pin ausgegeben wird). Verwenden Sie GPIO-Pins, um die gewünschte Ausgabe zu steuern. Dann kann der I2C-Daten-Pin von allen Slaves gemeinsam genutzt werden.
quelle