Wie löse ich Konflikte mit I2C-Adressen?

39

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.

Simon P Stevens
quelle

Antworten:

24

In I2C ist hierfür nichts eingebaut. Normalerweise verfügen Slave-Geräte über einige externe Pins, die auf 0 oder 1 gesetzt werden können, um einige der Adressbits umzuschalten, um dieses Problem zu vermeiden. Alternativ habe ich mich mit einigen Herstellern befasst, die 4 oder 5 Teilenummern für ein Teil haben, der einzige Unterschied ist die I2C-Adresse.

Die meisten Geräte haben eine spezielle Hardware, die die I2C-Kommunikation abwickelt. Das heißt, die Slave-ACK befindet sich in Hardware, sodass Sie wirklich nicht herumhacken können.

Was das Übersetzungsmodul angeht, könnten Sie ein paar 0,50-Dollar-PICs mit zwei I2C-Bussen kaufen und einen kurzen Code schreiben, damit sie vermutlich als Adressübersetzer fungieren.

Kennzeichen
quelle
Vielen Dank. Ja, diese Geräte haben eine Adressauswahl, aber nur zwischen zwei Adressen, und ich möchte mehr als 5 Geräte verbinden, sodass es immer noch zu Konflikten kommt. Ich hatte nicht daran gedacht, ein PIC zu verwenden. Das sollte funktionieren. Gibt es nichts von der Stange, das so etwas macht?
Simon P Stevens
11
NXP stellt eine Reihe von Multiplexern / Switches für I2C her. Möglicherweise können Sie daraus etwas aufbauen: ics.nxp.com/products/i2cmuxes Sie könnten beispielsweise 3 Unterzweige mit jeweils 2 Geräten erstellen Verwenden Sie einen der NXP-Switches, um Ihr Ziel zu erreichen.
Mark
Toll, genau das habe ich gesucht. Ich kannte den Namen einfach nicht. Vielen Dank.
Simon P Stevens
Diese Antwort ist 7 Jahre alt, daher glaube ich, dass es zu dem Zeitpunkt, als sie angeboten wurde, die beste gewesen sein könnte. Für andere, die jetzt durchkommen, bieten jedoch einige der viel neueren Antworten (die derzeit auf der Liste niedriger eingestuft sind) möglicherweise bessere Ansätze auf der Grundlage neuerer Komponenten, die jetzt auf dem Markt sind.
Brick
6

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.

Mehrere I2C-Geräte mit derselben Adresse

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.

Peter Gibson
quelle
Ich freue mich, dass Sie dies nachverfolgt und gepostet haben. Dies ist eine ziemlich geniale Lösung, ich bin sicher, dass sie für andere hilfreich sein wird.
Simon P Stevens
Eine schöne Nische, die für einige Anwendungen verwendet werden kann. Ich mag es sehr.
Harry Svensson
5

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.

Superkatze
quelle
6
Ich stimme nicht ab, aber das scheint mir ein bisschen riskant zu sein. Meine Erfahrung mit I2C ist, dass es mit nur der üblichen Verbindung störanfällig genug ist. Sie verwenden jedoch das Wort "Hack" und erwähnen die Einschränkung "wenn keines der i2c-Geräte Clock-Stretching verwendet". Wenn es also für jemanden funktioniert, haben sie mehr Power.
Jason S
5

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.)

Jason S
quelle
1
Die Verbindung ist unterbrochen. fairchildsemi.com/product-technology/bus-switches funktioniert besser.
Florisla
4

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.

David Hill
quelle
Eigentlich ist das überhaupt kein Hack, und ich würde sagen, das sollte die akzeptierte Antwort sein. Ich habe gesehen, dass dies in mehreren kommerziellen Produkten verwendet wird, und ich kann mir keine bessere Lösung vorstellen (es sei denn, Sie haben kein GPIO zur Verfügung und benötigen daher eine reine I2C-Lösung wie die I2C-spezifischen Multiplexer). Gute alte analoge Muxes haben viel Bandbreite und sind verrückt billig.
Jay Carlson
4

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.

user3608541
quelle
Sehr interessante Komponente. Die meisten I2C-Geräte haben 2 feste Adressen, und dies kann zu einem angemessenen Preis zu einer möglicherweise doppelten Adressierung führen.
Mehrad
4

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

  • Benötigt keine Programmierung (im Gegensatz zu Mikrocontroller-basiertem Ansatz)
  • Unterstützt die I2C-Funktionen und Geschwindigkeiten, die Sie benötigen (im Vergleich zu normalen analogen / digitalen Bus-Muxen). Beispielsweise leitet ein regulärer (Nicht-I2C) MUX keine allgemeinen Rufadressen an alle Kanäle weiter.
florisla
quelle
-1

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.

Sokrates
quelle
6
SCL wird nicht nur ausgegeben. Ein Sklave kann die Uhr verlängern, wenn er sie verlangsamen muss.
Stevenvh
Sie können einen analogen Multiplexer (der bidirektional ist) verwenden, aber ein Decoder funktioniert möglicherweise aus dem von stevenh angegebenen Grund nicht. Wenn Sie einen Multiplexer verwenden, benötigen Sie einen schwachen Zellstoff auf der Slave-Seite, um sicherzustellen, dass dieser inaktiv bleibt. Ändern Sie die Multiplexer-Auswahl auch nur, wenn der Bus frei ist.
Kevin White