3.23. Bases de l’I2C¶
L’I2C (Inter-Integrated Circuit, prononcé « I-carré-C » ou « I-deux-C ») est un bus série à deux fils conçu pour les liaisons courte distance entre puces d’une même carte. Il se situe entre SPI et UART en matière de priorités : plus lent que SPI mais plus économe en broches, et adressé (plusieurs périphériques sur les deux mêmes fils) là où SPI requiert une ligne CS dédiée par périphérique.
L’I2C est le bus de prédilection des capteurs à faible débit – accéléromètres, capteurs de température, capteurs d’humidité, magnétomètres, horloges temps réel, EEPROM – où économiser des broches et de la complexité de bus importe plus que le débit brut.
3.23.1. Deux fils, tous deux à drain ouvert¶
Un bus I2C ne comporte que deux signaux :
SCL (horloge série). Pilotée par le contrôleur (la plupart du temps).
SDA (données série). Pilotée par le périphérique qui parle à l’instant – le contrôleur pendant l’adresse et les données sortantes, le périphérique pendant les lectures et les bits ACK.
Les deux lignes sont à drain ouvert : chaque périphérique du bus peut tirer la ligne à la masse mais ne la met jamais à l’état haut. Deux résistances de tirage sur le bus (typiquement de 2.2 kΩ à 10 kΩ vers le rail d’alimentation) tirent les lignes à l’état haut lorsque personne ne les tire à l’état bas. Le comportement « OU câblé » découle de cela – tout périphérique qui tire la ligne à l’état bas l’emporte, et l’état haut signifie simplement « personne ne parle ».
Les résistances de tirage internes du MCU sur ses broches SCL et SDA ne sont généralement pas assez fortes pour servir de résistances de tirage du bus à elles seules ; des résistances externes sur le bus sont normalement nécessaires. De nombreuses cartes d’extension de capteurs en intègrent déjà ; consultez la fiche technique avant d’en ajouter.
3.23.2. La transaction¶
Chaque transaction I2C suit la même structure :
Une transaction I2C : START, adresse 7 bits + R/W, ACK, registre, ACK, données, NACK, STOP.¶
L’échange se déroule bit par bit :
START. Le contrôleur tire SDA à l’état bas pendant que SCL est encore à l’état haut. Ce front inhabituel indique à tous les périphériques du bus qu’une transaction est sur le point de commencer.
Adresse + R/W. Le contrôleur émet une adresse de périphérique sur 7 bits suivie d’un bit lecture/écriture (
0pour écrire,1pour lire).ACK / NACK. Après chaque octet, le récepteur pilote SDA pendant une horloge pour acquitter (ACK, bas) ou ne pas acquitter (NACK, haut). Sur l’octet d’adresse, le périphérique acquitte s’il reconnaît sa propre adresse ; si aucun périphérique n’acquitte, le contrôleur voit un NACK et sait que l’adresse n’est pas présente sur le bus.
Octets de données. Chacun est suivi d’un ACK du récepteur. En écriture, le périphérique acquitte chaque octet ; en lecture, le contrôleur acquitte chaque octet dont il veut la suite et envoie un NACK sur le dernier octet pour signaler au périphérique de s’arrêter.
STOP. Le contrôleur relâche SDA à l’état haut pendant que SCL est à l’état haut, terminant la transaction.
Un redémarrage répété (repeated start) est un second START émis sans STOP intermédiaire – le contrôleur change de direction (adresse d’écriture, puis adresse de lecture) sur le même périphérique sans relâcher le bus.
3.23.3. Adressage¶
L’espace d’adressage sur 7 bits couvre 0x08 – 0x77 ; les valeurs aux extrémités sont réservées à des usages particuliers. L’adresse de chaque périphérique est fixée par le concepteur de la puce ; de nombreux composants permettent de modifier quelques bits de poids faible au niveau de la carte (en reliant une broche à l’état haut ou bas) afin que deux capteurs identiques puissent cohabiter sur le même bus.
Si deux périphériques partagent une adresse, il n’y a aucun moyen de communiquer avec l’un sans que l’autre n’interfère ; vérifiez donc la fiche technique avant d’associer des composants. i2c.scan() (présenté dans L’I2C en code) parcourt l’espace d’adressage et signale quelles adresses répondent, ce qui est la manière standard de découvrir ce qui se trouve sur le bus.
3.23.4. Points forts et points faibles¶
Les points forts et points faibles du bus définissent sa niche :
Deux broches pour de nombreux périphériques. Une seule paire SCL/SDA peut desservir une douzaine de capteurs. SPI nécessiterait une broche CS supplémentaire par périphérique.
Vitesses standard.
100 kHz(« mode standard ») et400 kHz(« mode rapide ») couvrent presque tous les capteurs.1 MHzest atteignable mais commence à exiger davantage de la capacité du bus et du dimensionnement des résistances de tirage.Lent par rapport à SPI. Tout ce qui transfère plus de quelques centaines de kilobits par seconde réclame plutôt SPI.
Conflits d’adresses. Deux périphériques avec la même adresse sur un même bus constituent une erreur matérielle que le protocole ne peut pas contourner.