IC (signifie : , en anglais) est un bus informatique qui a émergé de la « guerre des standards » lancée par les acteurs du monde électronique. Conçu par Philips pour les applications de domotique et d’électronique domestique, il permet de relier facilement un microprocesseur et différents circuits, notamment ceux d’un téléviseur moderne : récepteur de la télécommande, réglages des amplificateurs basses fréquences, tuner, horloge, gestion de la prise péritel, etc.

Il existe d’innombrables périphériques exploitant ce bus, il est même implémentable par logiciel dans n’importe quel microcontrôleur. Le poids de l’industrie de l’électronique grand public a permis des prix très bas grâce à la production de masse.

Ce bus porte parfois le nom de TWI (Two Wire Interface) ou TWSI (Two Wire Serial Interface) chez certains constructeurs.

Historique

Le standard I2C (Inter-Integrated Circuit) a été développée par Philips en 1982. Depuis elle est maintenue par NXP (ex-division semiconducteurs de Philips).

La version 1.0 a été publiée en 1992, la version 2.0 en 1998, la version 2.1 en 2000, la version 3.0 en 2007, la version 4 en , la version 5 en , la en , et la version actuelle 7 en .

Couche physique

Topologie

I2C est un bus série synchrone bidirectionnel half-duplex, où plusieurs équipements, principaux ou secondaires, peuvent être connectés au bus.

Les échanges ont toujours lieu entre un seul équipement principal et un (ou tous les) équipement(s) secondaire(s), toujours à l'initiative du principal (jamais de principal à principal ou de secondaire à secondaire). Cependant, rien n'empêche un composant de passer du statut de principal à secondaire et réciproquement.

La connexion est réalisée par l'intermédiaire de deux lignes : SDA (Serial Data Line) : ligne bidirectionnelle de données, SCL (Serial Clock Line) : ligne bidirectionnelle d'horloge de synchronisation.

Il ne faut également pas oublier la masse qui doit être commune aux équipements.

Les deux lignes SDA et SCL sont tirées au niveau de tension VDD à travers des résistances de pull-up (RP).

Le nombre maximum d'équipements est limité par le nombre d'adresses disponibles, d'adressage et un bit R/W (lecture ou écriture), soit 128 périphériques, mais il dépend également de la capacité (CB) du bus (dont dépend la vitesse maximale du bus). Il faut savoir que des adresses sont réservées pour diffuser des messages en broadcast et que de nombreuses adresses sont déjà attribuées par les fabricants ce qui limite grandement le nombre d'équipements (une variante d'adressage sur existe également). centre|Architecture I²C avec plusieurs maîtres et plusieurs esclaves

En mode "Ultra-fast mode" (UFm), le bus est unidirectionnel, il ne peut donc y avoir qu'un seul équipement principal. Les 2 lignes sont renommées USCL (ligne d'horloge) et USDA (ligne de données), et côté équipement principal, elles sont toujours en sortie et de type push-pull. Ce mode a un usage limité : seules les écritures sont possibles car dans ce mode le fil de donnée (SDA) n'est pas bidirectionnel.

Codage des bits

center|Codage d'un bit I²C

Le niveau (« HIGH » ou « LOW ») de la ligne SDA doit être maintenu stable pendant le niveau « HIGH » sur la ligne SCL pour la lecture du bit.

Niveaux électriques Les équipements connectés au bus le sont par des sorties de type drain ouvert (ou collecteur ouvert) sur les deux lignes SDA et SCL.

Les équipements sont donc câblés sur le bus par le principe du « ET câblé », ce qui veut dire qu'en cas d'émission simultanée de deux équipements, la valeur 0 écrase la valeur 1.

On dit donc : que l'état logique « 0 » ou « LOW » est l'état « dominant », que l'état logique « 1 » ou « HIGH » est l'état « récessif ».

Lorsque le bus n'est pas utilisé, il est au niveau haut (VDD à travers les résistances de pull-up RP).

Les niveaux utilisés entre les lignes de bus sont proportionnels à VDD :

État Niveau Dominant ou « 0 » ou « LOW » de -0,5 V à 0,3x VDD Récessif ou « 1 » ou « HIGH » de 0,7x VDD à VDD

Sur certains anciens circuits, les niveaux utilisés peuvent être fixes et donnés par les formules suscitées pour une valeur de VDD = 5 V.

Temps et vitesses Il existe cinq vitesses de transmission : « Standard mode (Sm) » ≤ 100 kbit/s, « Fast mode (Fm) » ≤ 400 kbit/s, « Fast plus mode (Fm+) » ≤ 1 Mbit/s, « High-speed mode (Hs-mode) » ≤ 3,4 Mbit/s, « Ultra-fast mode (UFm) » ≤ 5 Mbit/s, unidirectionnel uniquement.

Le bus étant synchrone, l'équipement principal impose l'horloge via la ligne SCL, il existe des temps minimum à respecter pour les paliers des niveaux « LOW » et « HIGH » sur cette ligne :

Mode tLOWmin tHIGHmin Standard 4,7 μs 4 μs Fast 1,3 μs 0,6 μs Fast plus 0,5 μs 0,26 μs

Pour les deux vitesses supérieures, les temps dépendent de la capacité du bus (CB).

Calcul des résistances RP

Les temps et les niveaux de tension dépendent de la capacité du bus (CB) et de la valeur des résistances de pull-up (RP).

Il est difficile de modifier la valeur de la capacité du bus, mais on peut choisir la valeur des résistances pull-up.

RPmin La valeur minimale des résistances de pull-up est limitée par le courant des sorties SDA et SCL (IOL) lorsqu'elles sont à l'état LOW (VOL) :

Mode VOLmax IOL RPmin pour VDD=5V Standard 0,4 V 3 mA 1 534 Ω Fast 0,6 V 6 mA 733 Ω Fast plus 0,4 V 20 mA 230 Ω

Pour les deux vitesses supérieures, les valeurs de IOL ne sont pas fournies.

RPmax

La valeur maximale de RP est limitée par les temps de montée et de descente.

La variation du signal est donnée par la formule :

Soit pour une variation de LOW = 0,3x VDD à HIGH = 0,7x VDD (choisie comme référence) : → →

avec tr, le temps de montée des signaux SDA et SCL.

Mode tr CB RPmax Standard 1 μs 400 pF 2 950 Ω Fast 300 ns 400 pF 885 Ω Fast plus 120 ns 550 pF 257 Ω

Couche liaison de données

Échange principal ↔ secondaire

Le message peut être décomposé en deux parties The IC-bus and how to use it (including specifications) : 1995 update - Philips Semiconductors, I2c-bus.org, avril 1995 :

L'équipement principal est l'émetteur, l'équipement secondaire est le récepteur : émission d'une condition de START par le principal (« S »), émission de l'octet ou des octets d'adresse par le principal pour désigner un secondaire, avec le bit R/W à 0 (voir la partie sur l'adressage ci-après), réponse du secondaire par un bit d'acquittement ACK (ou de non-acquittement NACK), après chaque acquittement, le secondaire peut demander une pause (« PA »). émission d'un octet de commande par le principal pour le secondaire, réponse du secondaire par un bit d'acquittement ACK (ou de non-acquittement NACK), émission d'une condition de RESTART par le principal (« RS »), émission de l'octet ou des octets d'adresse par le principal pour désigner le même secondaire, avec le bit R/W à 1. réponse du secondaire par un bit d'acquittement ACK (ou de non-acquittement NACK).

Le principal devient récepteur, le secondaire devient émetteur : émission d'un octet de données par le secondaire pour le principal, réponse du principal par un bit d'acquittement ACK (ou de non-acquittement NACK), (émission d'autres octets de données par le secondaire avec acquittement du principal), pour le dernier octet de données attendu par le principal, il répond par un NACK pour mettre fin au dialogue, émission d'une condition de STOP par le principal (« P »).

center|Exemple d'échange I²C entre un maître et un esclave

Condition de START

La condition de START est une transgression de la règle de codage des bits qui est utilisée par l'équipement principal pour signifier le début d'une trame.

Cette condition est caractérisée par le passage de la ligne SDA du niveau « HIGH » au niveau « LOW » pendant que la ligne « SCL » est maintenue au niveau « HIGH ».

center|Condition de START I²C

Octet d'adressage

Chaque équipement secondaire doit avoir une adresse unique.

Adressage sur 7 bits

L'octet d'adressage peut être scindé en deux parties :

les sept premiers bits correspondent à l'adresse proprement dite,

le dernier bit est nommé R/W : s'il est à 0, le principal signale qu'il va envoyer des octets, et donc que le secondaire doit les lire, s'il est à 1, le principal indique qu'il veut recevoir des octets, et donc que le secondaire doit les fournir.

On peut également considérer que l'adresse est codée sur les , chaque secondaire a alors deux adresses, l'adresse paire qui sert à lui envoyer des données, l'adresse impaire pour lui demander d'en envoyer.

Plusieurs adresses sont réservées :

« 00000000 » : utilisée pour adresser tous les secondaires (« broadcast »), « 0000001X » : utilisée pour accéder aux composants CBUS (ancêtre de l’I²C), « 0000010X » : réservée pour d’autres systèmes de bus, « 0000011X » : réservée pour des utilisations futures, « 00001XXX » : pour les composants haute-vitesse, « 11111XXX » : réservée pour des utilisations futures, « 11110yzX » : permet de préciser une adresse sur 10 bits.

Adressage sur 10 bits

Dans le cas d'un adressage sur , il faut utiliser deux octets.

Le premier est l'octet « 11110yz0 » (comme précisé ci-dessus), les bits « yz » sont les de poids forts de l'adresse, le bit R/W est toujours placé à 0.

Le deuxième octet est utilisé pour les 8 bits de poids faibles de l'adresse, il n'y a pas de bit R/W.

center|Adressage d'un esclave I²C sur en écriture

À la suite de l'émission du premier octet, plusieurs secondaires parmi ceux ayant une adresse sur peuvent répondre par un ACK (ceux qui ont les mêmes de poids fort). Peu importe, à l'issue du , seul le secondaire auquel on s'est adressé répondra.

Le bit R/W étant toujours placé à 0, pour demander à un secondaire d'écrire, à la suite de l'émission des précédents, il faut renvoyer une condition de RESTART suivie de l'octet « 11110yz1 » (avec le bit R/W à 1), pour que le secondaire sache qu'il s'agit d'une commande de lecture.

center|Adressage d'un esclave I²C sur 10 bits en lecture

Acquittement

Le récepteur positionne le bit d'acquittement à :

« ACK », en forçant la ligne SDA au niveau « LOW », pour signaler la bonne réception de l'octet, équivalent à un bit à 0,

« NACK », en laissant la ligne SDA au niveau « HIGH », pour signaler un défaut dans la réception de l'octet, équivalent à un bit à 1.

center|Acquittement I²C

Si le récepteur est dans l'incapacité de recevoir l'octet, il ne positionnera pas le bit d'acquittement, et celui-ci sera de facto un NACK.

Quand le principal est le récepteur, il positionne également le bit d'acquittement à NACK pour interrompre le dialogue, avant d'envoyer la condition de STOP.

Pause (clock stretching)

À tout moment, le secondaire peut « bloquer » la ligne SCL au niveau « LOW » pour signaler qu'il est occupé.

Lorsque le principal fournit un niveau « HIGH » sur la ligne SCL, il détecte l'écrasement. Le principal doit continuer à fournir le niveau « HIGH » sur la ligne.

Lorsque le secondaire est à nouveau prêt, il libère la ligne SCL et celle-ci prend alors immédiatement le niveau « HIGH », le cycle reprend.

center|Pause I²C

Condition de RESTART

La condition de RESTART est une transgression de la règle de codage des bits qui est utilisée par le principal pour signifier le début d'une nouvelle trame dès la fin de la trame précédente sans passer par une condition de STOP.

La condition de RESTART est similaire à la condition de START, à cela près que la ligne SCL doit d'abord passer du niveau « LOW » au niveau « HIGH ».

center|Condition de RESTART I²C

Condition de STOP

La condition de STOP est une transgression de la règle de codage des bits qui est utilisée par le principal pour signifier la fin d'une trame.

Cette condition est caractérisée par le passage de la ligne SDA du niveau « LOW » au niveau « HIGH » pendant que la ligne SCL est maintenue au niveau « HIGH ».

center|Condition de STOP I²C

Multi-principaux

Synchronisation des horloges