Mehrere I2C Slaves mit identischer Adresse betreiben.

  • Noch eine kleine Ergänzung. Man kann den I2C-Switch auch gleich als Level-Converter benutzen. In folgendem Schaltplan wird das SCL0/SDA0 Paar mit 5V betrieben (wie der Master auch) und das SCL1/SDA1 Paar wird auf 3.3V für einen 3.3V Slave gebracht.


    I2C-Switch-LevelShift.png

    Das Reh springt hoch. Das Reh springt weit. Warum auch nicht? Es hat ja Zeit. 8o

  • Hallo Hans64,


    in diesem Beispiel wurde ein Arduino Nano und die zwei OLEDS verwendet. Richtig. Man sollte aber auch beliebige andere I2C Geräte verwenden können. Ausprobiert habe ich es aber nur mit den Displays.

    Das Reh springt hoch. Das Reh springt weit. Warum auch nicht? Es hat ja Zeit. 8o

  • Hallo Kai,


    danke für Deinen Beitrag. Sehr interessant für mich. Wenn ich es richtig verstanden habe, gibt es nur einen z.b. Arduino Uno und zwei Displays?


    Gruß

    Hans

  • Der Adressbereich von I2C Geräten ist begrenzt. Immer wieder kommt es vor, dass z.B an Sensoren oder anderen Geräten die I2C-Adresse nicht änderbar ist. Wie kann man zwei davon "gleichzeitig" an einem I2C-Bus betreiben?


    Die Lösung dafür ist ein I2C-Switch. Man kann solche Teile kaufen. Wenn man z.B. nach dem Begriff TCA9548 sucht, wird man schnell fündig. Die angebotenen Breakouts basieren auf dem PCA9548 IC. Der PCA9546, PCA9540 sind Alternativen mit weniger Ports (4 bzw. 2 Ports statt 8).


    Man kann sich einen I2C-Switch aber auch selber mit ein paar N-Kanal MOSFets, wie dem z.B. BS170, selber zusammenstecken. Das sieht dann so aus:

    I2C-Switch.png

    U1 und U2 im Schaltplan entsprechen einem Pin am Mikrocontroller. SCL und SDA (links) entsprechen dem Signal welches vom I2C Master kommt. I.d.R. ist das der gleiche Mikrocontroller, der auch zum Ansteuern der Mosfets verwendet wird. An den IO_SCLX und IO_SDAX Ausgängen wird jeweils ein I2C Slave angeschlossen. Die 4k7 Widerstände sind Pullups für die I2C Leitungen.


    Auf dem Breadboard zusammengesteckt sieht es wie folgt aus:


    Bild-I2C-Switch.jpg


    Ich habe zum ausprobieren zwei OLED-Displays mit dem selbst zusammengesteckten Switch betrieben. Es werden immer zwei MOSFETs paarweise durch einen Pin vom Mikrocontroller geschaltet. Ein Paar entspricht immer einer SCL und einer SDA Leitung. Wird der PIN auf HIGH gesetzt, ist das entsprechende SCL und SDA Leitungspaar aktiv. Ist der Pin auf LOW gesetzt, ist auch das entsprechende Leitungspaar deaktiviert. Durch die Schaltung können beide Displays an einem Controller getrennt betrieben werden, obwohl sie eine identische Adresse haben.

    Werden beide Kanalpaare gleichzeitig aktiviert, erfolgt auf beiden Displays eine identische Ausgabe. Die eingestellte Taktfrequenz betrug 400kHz.



    Solch einen Switch kann man natürlich auch für Sensoren verwenden. Bei den verwendeten MOSFETS muss unbedingt darauf geachtet werden, was sie für eine Input-Kapazität haben. Diese muss so gering wie möglich sein. Auf einem I2C-Strang darf die Gesamtkapazität 400pF nicht überschreiten. Die BS170 sind mit einer Kapazität von typisch 24 pF und max. 40pF bei 10V angegeben.

    Das Reh springt hoch. Das Reh springt weit. Warum auch nicht? Es hat ja Zeit. 8o