TCA9548A - Connecter plusieurs périphériques I2C à Arduino
Introduction
Comment connecter plusieurs périphériques I2C (SDA/SCL) à un Arduino, alors que la plupart des cartes ne disposent que d'une seule interface I2C ? Si tu veux ajouter une pile RTC, plusieurs écrans LCD/OLED, ou des capteurs de luminosité, tu vas vite être limité.
Pour répondre à ce besoin, il existe des multiplexeurs comme le TCA9548A, qui permettent d'étendre le nombre de modules I2C connectés à un seul microcontrôleur.
Rappel sur le multiplexeur
Un multiplexeur est un circuit logique qui permet de sélectionner, via des entrées de commande, une sortie parmi plusieurs. Le TCA9548A possède 3 entrées de commande (A0, A1, A2) et 8 sorties I2C. En connectant A0, A1, A2 à la masse, l'adresse du module sera 0x70.

Fonctionnement du TCA9548A
Ce module permet de sélectionner l'une des 8 sorties I2C pour communiquer avec un périphérique spécifique. Chaque sortie peut être activée indépendamment en envoyant la commande appropriée à l'adresse du TCA9548A.
Exemple de broches :
| A0 | A1 | A2 | RST | SCL | SDA | GND | VIN |
|---|---|---|---|---|---|---|---|
| S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 |
Si tu connectes plusieurs modules TCA9548A en série, tu peux adresser jusqu'à 64 périphériques I2C (8 modules x 8 sorties).
Table de vérité des adresses
| A2 | A1 | A0 | Adresse | TCA N° | Périphériques max |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0x70 | 1 | 8 |
| 0 | 0 | 1 | 0x71 | 2 | 8 |
| 0 | 1 | 0 | 0x72 | 3 | 8 |
| 0 | 1 | 1 | 0x73 | 4 | 8 |
| 1 | 0 | 0 | 0x74 | 5 | 8 |
| 1 | 0 | 1 | 0x75 | 6 | 8 |
| 1 | 1 | 0 | 0x76 | 7 | 8 |
| 1 | 1 | 1 | 0x77 | 8 | 8 |
Exemple d'utilisation
Supposons que tu utilises deux modules TCA9548A :
- A0, A1, A2 à la masse : adresse 0x70
- A0, A1 à la masse, A2 au 5V : adresse 0x74
Chaque module peut connecter 8 périphériques I2C. Pour contrôler un périphérique, il suffit de sélectionner le canal correspondant.
Code Arduino
Les méthodes principales pour utiliser le TCA9548A :
// Sélectionner un canal
byte Element::selectChannel() const {
Wire.beginTransmission(this->address); // 0x70 ou 0x74
Wire.write(1 << this->channel); // canal 0 à 7
Wire.endTransmission();
return this->channel;
}
// Désactiver le TCA
void Element::disableTCA() const {
Wire.beginTransmission(this->address);
Wire.write(0);
Wire.endTransmission();
}
// Initialiser un écran OLED sur un canal
void Element::setupOled() {
this->selectChannel();
this->oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
this->oled.display();
this->disableTCA();
}
Bonus
Retrouvez tout le code sur le repo GitHub pabios/many-mux :
https://github.com/pabios/many-mux