// Retour à l'accueil

Le protocole I2C

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 :

  1. START
  2. Le maître envoie l’adresse (0x50) avec le bit d’écriture (0). L’EEPROM répond ACK.
  3. On envoie l’adresse mémoire exacte que l’on veut lire.
  4. REPEATED START (on ne s’arrête pas).
  5. Le maître renvoie l’adresse (0x50) mais avec le bit de lecture (1).
  6. L’EEPROM balance les données, et le maître finit par un NACK pour dire qu’il a terminé.
  7. STOP
Catégories : Projets

Une réponse à “Le protocole I2C”

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *