Ich möchte mehrere I2C-Slave-Geräte an einen Mikrocontroller anschließen, alle auf demselben Satz von Pins, aber die I2C-Geräte teilen sich 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-Adressübersetzungsmodul mit jedem Gerät mit einer konfigurierbaren Adresse, damit ich jedem meine eigenen Adressen zuweisen kann.
In I2C ist nichts eingebaut, um dies zu tun, normalerweise haben Slave-Geräte einige externe Pins, die auf 0 oder 1 gesetzt werden können, um ein paar 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 spezielle Hardware, die die I2C-Kommunikation handhabt, das heißt, das Slave-ACK ist in der Hardware, sodass Sie es wirklich nicht umgehen können.
Was das Übersetzungsmodul betrifft, könnten Sie einige PICs für 0,50 $ mit 2 I2C-Bussen kaufen und einen schnellen Code schreiben, damit sie als Adressübersetzer fungieren, denke ich.
Ich bin gerade auf dieses Problem mit mehreren I2C-Geräten mit einer festen Adresse gestoßen. Unsere Lösung bestand darin, E/A-Leitungen auf dem Mikrocontroller zu verwenden, um die SDA-Leitungen auf den Geräten, die wir nicht ansprechen möchten, hoch zu zwingen, während die E/A-Leitung für das Gerät, auf das wir abzielen, als Eingang eingestellt 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 fungieren schließlich als Pull-Ups für den Bus, sodass der genaue Wert davon abhängt, wie viele Geräte Sie haben und welchen Pull-Up Sie für Ihren Bus benötigen. Wenn Sie also 10K-Widerstände wählen, ergeben 3 inaktive Geräte einen 3K3-Pullup.
Die Schottky-Dioden stellen sicher, dass das Gerät die SDA-Leitung immer noch niedrig genug ziehen kann, wenn es Daten zurück zum Host überträgt.
Es gibt jetzt eine Antwort – Linear Tech hat die LTC4316/17/18-Serie von Adressumsetzern im Angebot. Sie sind relativ neu und die Verfügbarkeit ist ungewiss.
Wenn keines der I2C-Geräte Clock-Stretching (Handshaking) verwendet und Sie den I2C-Master bit-bangen, besteht ein einfacher Hack darin, einige der Geräte die Uhr- und Daten-Pins tauschen zu lassen. Während der Übertragung eines Bytes sieht das Gerät, bei dem die Takt- und Datenpins vertauscht sind, jedes "0"-Bit als Nichtereignis (Daten steigen und fallen ohne Takt) und sieht jedes "1"-Bit als I2C-Stopp und Start (Takt steigt, während Daten niedrig sind, wird von steigenden und fallenden Daten aufgegeben, gefolgt von fallendem Takt). Absichtliche Stopp- und Startbedingungen für ein Gerät können von dem anderen als Datenbits angesehen werden, aber wenn ein Gerät nicht eine übermäßige Anzahl von Start- und Stoppbedingungen zwischen "1"-Bits hat, wäre es unwahrscheinlich, dass ein Gerät "versehentlich"
Mehrere Hersteller bieten I2C-Bus-Multiplex- und Schalter-ICs an.
Ein Mux kann jeweils einen Kanal aktivieren; Ein Schalter kann mehrere parallel aktivieren.
Prüfen Sie zum Beispiel die Angebote von NXP , TI und Maxim .
Zum Experimentieren hat Adafruit ein TCA9548a-Board .
Wenn Sie 8 Zielchips mit identischen Adressen haben, wählen Sie einen 8-zu-eins-MUX. Bevor Sie auf einen der Zielchips zugreifen, konfigurieren Sie den MUX, um den richtigen I2C-Bus zu aktivieren.
Vorteile
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 wir uns angesehen hatten, wie I2C in Bezug auf die SCL- (Takt-) und SDA- (Daten-) Leitungen funktioniert, schien es, dass das Ausschalten der SDA-Leitung verhindern würde, dass der Chip ein Start- oder Stoppbit erhält, und ihn daher inaktiv lassen würde. Verwenden Sie also einen CMOS-Analogschalter (4066B), um die SDA-Leitung zu jedem Gerät ein- oder auszuschalten. Dies funktionierte gut für das Umschalten zwischen den beiden Geräten. Ich weiß, es ist ein Hack, und der PCA9548 wäre viel besser, aber ich hatte keinen zur Hand.
Ich würde erwägen, Busschalter zu verwenden, um den I2C-Bus zwischen den Geräten mit widersprüchlichen Adressen zu multiplexen. Busschalter haben eine sehr niedrige Kapazität und einen sehr geringen Widerstand, und im Gegensatz zu Puffern/Treibern sind sie echte Schalter, die zwei Schaltungsknoten verbinden oder trennen.
Busschalter haben normalerweise eine seltsame Eigenschaft, die für I2C keine Rolle spielt, da Open-Drain-Bausteine verwendet werden: Ein Busschalter hat einen niedrigen Einschaltwiderstand, wenn Spannungen nahe 0 (Vss) zusammengebunden werden, aber der Widerstand steigt dramatisch an, wenn sich die Spannungen nähern die Stromversorgung 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 Vdd nähern, ist die verfügbare Vgs viel niedriger.)
Verwenden Sie einen einfachen Demux-Chip (z. B. 74HC139 afaik) und verbinden Sie den I2C CLK-Pin mit dem Eingang (da der I2C CLK-Pin nur als Ausgang dient). Verwenden Sie GPIO-Pins, um die gewünschte Ausgabe zu steuern. Dann kann der I2C-Daten-Pin zwischen allen Slaves geteilt werden.
Simon P. Stevens
Markieren
Simon P. Stevens
Ziegel