Pour faire suite à mon précédent article sur l’analyse des signaux numériques, je vous propose d’explorer aujourd’hui un incontournable qui manquait encore à l’appel : le protocole I2C.
L’I2C (Inter-Integrated Circuit) est devenu un standard incontournable pour la communication série, principalement parce qu’il permet de faire discuter plusieurs composants entre eux avec seulement deux fils. C’est cette simplicité de câblage qui le rend aussi populaire dans les projets électroniques.
Comment ça marche physiquement ?

Le bus repose sur trois lignes : SDA pour les données, SCL pour l’horloge (qui synchronise tout le monde) et, bien sûr, une masse commune (GND).
Ce qui est intéressant avec l’I2C, c’est qu’il ne fonctionne pas comme une liaison série classique. Les broches sont en drain ouvert. En gros, les composants peuvent tirer la ligne vers la masse (0V), mais ils ne peuvent pas « pousser » du 5V ou du 3.3V. On a donc besoin de résistances de pull-up pour ramener le signal en haut. L’avantage ? On peut mettre plusieurs maîtres sur le même bus sans risquer de griller un composant si deux appareils parlent en même temps.
Le rythme de la communication
Tout est une question de synchronisation. Une communication commence par un START et finit par un STOP. Entre les deux, on envoie des octets (8 bits), en commençant toujours par le plus gros bit (MSB).
Un point crucial à retenir : pour que la donnée soit considérée comme valide, SDA ne doit surtout pas bouger quand l’horloge (SCL) est au niveau haut. Si SDA bouge à ce moment-là, c’est interprété comme un signal de contrôle (START ou STOP).
Et n’oubliez pas le 9ème bit : l’ACK. C’est le « reçu, 5 sur 5 » du récepteur. Si vous voyez un NACK (la ligne reste en haut), c’est souvent que l’esclave n’a pas compris ou que la lecture est finie.
L’adressage
Chaque puce a son « nom » (une adresse de 7 bits). Par exemple, les EEPROM tournent souvent autour de 0x50, tandis que les modules RTC (comme le DS3231) ou les écrans OLED ont leurs propres plages réservées.
Le truc vraiment utile à connaître, c’est le Repeated Start. C’est une façon de relancer une transaction sans envoyer de STOP. C’est indispensable quand on veut d’abord dire à un capteur « je veux lire tel registre » (écriture) puis récupérer la valeur (lecture) sans laisser personne d’autre prendre le contrôle du bus entre les deux.
On retrouve l’I2C partout :
- Mémoires EEPROM (souvent aux adresses 0x50 à 0x57).
- Capteurs (température, pression).
- Horloges temps réel (RTC) comme le DS3231.
- Petits écrans OLED ou extensions de ports GPIO.
Exemple concret
Si vous voulez lire une donnée à l’adresse 0x50, voici ce qu’il se passe sur les fils :
- START
- Le maître envoie l’adresse (0x50) avec le bit d’écriture (0). L’EEPROM répond ACK.
- On envoie l’adresse mémoire exacte que l’on veut lire.
- REPEATED START (on ne s’arrête pas).
- Le maître renvoie l’adresse (0x50) mais avec le bit de lecture (1).
- L’EEPROM balance les données, et le maître finit par un NACK pour dire qu’il a terminé.
- STOP
[…] un prochain article, je vais continuer cette exploration en me penchant sur le protocole I2C (Inter-Integrated Circuit), une autre interface série essentielle en […]