IIC Multiplexing mit TCA9548A

HAllo,

ich versucher verschiedene Displays mit mehreren TCA9548A parallel laufen zu lassen.

wenn ich nur einen nutze funktioniert das gut, beim 2. klappt es nicht mehr…

IIC Scanner findet die TCA auf der Adresse 0x70 und 0x71, also alles richtig eingestellt

 //Verwendete Bibliotheken
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "Adafruit_MCP23017.h"
Adafruit_SSD1306 display(4);

//Variablen

int i;
#define TCA 0x70
#define TCB 0x71




void setup() {
// start serial port at 9600 bps:
  Serial.begin(9600);
  //Serial.setTimeout(1000);
  delay(10000);
display.setTextColor(WHITE);
display.setTextSize(5);
  
 
}

void loop() {


    tcaselect(2);
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);           
    display.clearDisplay();
    display.setCursor(10,0);
    display.println("JMP");
    Serial.print("Print: ");
    Serial.println("JMP");
    display.display();
    tcbselect(7);
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);           
    display.clearDisplay();
    display.setCursor(10,0);
    display.println("RUN");
    Serial.print("Print: ");
    Serial.println("RUN");
    display.display();
  
  
    delay(10000);
 }
void tcaselect(uint8_t i) {
      if (i > 7) return;
     
      Wire.beginTransmission(TCA);
      Wire.write(1 << i);
      Wire.endTransmission();  
    }
void tcbselect(uint8_t i) {
      if (i > 7) return;
     
      Wire.beginTransmission(TCB);
      Wire.write(1 << i);
      Wire.endTransmission();  
    }

der erreichte Effekt ist aber nur RUN auf beiden Displays…

Wie muss das also richtig geschrieben werden?

Danke schonmal

Hast Du pullupwiderstände überall drin?
Grüße Uwe

Hmm...
TCA9548A, noch nicht mit gearbeitet....

Aber, meine Kristallkugel sagt:
Wenn du tcb einstellst, solltest du tca abschalten.
Und umgekehrt.

Pull up sind überall schon auf den Boards. das klappt ja, wenn ich nur eins nutze...

an das TCA abschalten habe ich auch gedacht... ich habe aber nirgendwo gefunden, wie ich das mache...

bei Adafruit gibt es dazu keine Info:

Den Baustein habe ich auch...

wenn ich also 1 mal tcaselect(2); ausführe wird der TCA so eingstellt, dass er ales vom I2C Bus zum Port 2 Durchleitet... wie ich ihm aber sage, dass er aufhören soll ist nirgendwo beschrieben... ich habe gedacht, evtl reicht es wenn ich tcaselect(8); mache, dann geht es an ein Port, den es nicht gibt... aber wenn ich etwas höheres als 7 übergebe springt er sofort zurück und ändert nichts... So ist es im beispielcode, evtl muss ich das ja raus nehmen und dann probieren...

Den Baustein habe ich auch…

Fein!

Dann schaust du ins Datenblatt.
Zumindest würde ich es tun, damit ich mal erfahre wie das Ding überhaupt funktioniert!

Und siehe da, es steht da drin!!

The TCA9548A features I2C control using a single 8-bit control register in which each bit controls the enabling and disabling of one of the corresponding 8 switch channels for I2C data flow.

Also:

void tcaselect(uint8_t i) {
      Wire.beginTransmission(TCB);
      Wire.write(0); // alle Ausgänge aus
      Wire.endTransmission();  

      if (i > 7) return;
     
      Wire.beginTransmission(TCA);
      Wire.write(1 << i);
      Wire.endTransmission();  
    }
void tcbselect(uint8_t i) {
      Wire.beginTransmission(TCA);
      Wire.write(0);  // alle Ausgänge aus
      Wire.endTransmission();  

      if (i > 7) return;
     
      Wire.beginTransmission(TCB);
      Wire.write(1 << i);
      Wire.endTransmission();  
    }

ungetestet

Danke, Wollte grade schreiben, dass es mit der Übertragung von 8 klappt... Ich denke, dass ist aber die elegantere Wahl :wink:

Wie auch immer...
Schön, dass es erstmal funktioniert.
Kann man aber bestimmt noch optimieren. :wink: