I2C

Un article de Wikipédia, l'encyclopédie libre.
(Redirigé depuis I²C)
Aller à : navigation, rechercher
Logo I2C.

I2C est un bus de données 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’une télévision 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 à ces nombreux composants.

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

Historique[modifier | modifier le code]

La norme 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 et la version actuelle 4.0 en 2012.

Couche physique[modifier | modifier le code]

Topologie[modifier | modifier le code]

I2C est un bus série synchrone bidirectionnel half-duplex.

Plusieurs équipements, soit maîtres, soit esclaves, peuvent être connectés au bus.

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

La connexion est réalisée par l'intermédiaire de 2 lignes :

  • SDA (Serial Data Line) : ligne de données bidirectionnelle,
  • SCL (Serial Clock Line) : ligne d'horloge de synchronisation bidirectionnelle.

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

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

Le nombre maximal d'équipements est limité par le nombre d'adresses disponibles, 7 bits pour l''adresse et un bit pour définir si on écrit ou on lit, 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 10 bits existe également).

Architecture I²C avec plusieurs maîtres et plusieurs esclaves

Codage des bits[modifier | modifier le code]

Le codage utilisé est de type NRZ (non retour à 0) :

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[modifier | modifier le code]

Les équipements connectés au bus le sont par des sorties de type drain ouvert (ou collecteur ouvert) sur les 2 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 2 é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 (à 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,5V à 0,3xVDD
Récessif ou « 1 » ou « HIGH » de 0,7xVDD à 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 = 5V.

Temps et vitesses[modifier | modifier le code]

Il existe 5 vitesses de transmission :

  • « Standard mode » ≤ 100 kbit/s,
  • « Fast mode » ≤ 400 kbit/s,
  • « Fast plus mode » ≤ 1 Mbit/s,
  • « High-speed mode » ≤ 3,4 Mbit/s,
  • « Ultra-fast mode » ≤ 5 Mbit/s.

Le bus étant synchrone, le maître 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 2 vitesses supérieures, les temps dépendent de la capacité du bus (CB).

Calcul des résistances RP[modifier | modifier le code]

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 d'influer sur la valeur de la capacité du bus, mais on peut choisir la valeur des résistances pull-up.

RPmin[modifier | modifier le code]

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) :

R_{Pmin} = \frac{V_{DD} - V_{OLmax}}{I_{OL}}
Mode VOLmax IOL RPmin pour VDD=5V
Standard 0,4V 3mA 1534Ω
Fast 0,6V 6mA 733Ω
Fast plus 0,4V 20mA 230Ω

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

RPmax[modifier | modifier le code]

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 :

V(t) = V_{DD} \times (1 - e^{ - \frac t {(R_P \times C_B) }})

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

  • 0,3 \times V_{DD} = V_{DD} \times (1 - e^{ -t_1 / (R_P \times C_B) })t_1 \approx 0,3566749 \times R_P \times C_B
  • 0,7 \times V_{DD} = V_{DD} \times (1 - e^{ -t_2 / (R_P \times C_B) })t_2 \approx 1,2039729 \times R_P \times C_B
  • T = t_2 - t_1 \approx 0,8473 \times R_P \times C_B
R_{Pmax} = \frac{t_r}{0,8473 \times C_B}

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

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

Couche liaison de données[modifier | modifier le code]

Échange maître ↔ esclave[modifier | modifier le code]

Le message peut être décomposé en 2 parties[1] :

  • Le maître est l'émetteur, l'esclave est le récepteur :
    • émission d'une condition de START par le maître (« S »),
    • émission de l'octet ou des octets d'adresse par le maître pour désigner un esclave, avec le bit R/W à 0 (voir la partie sur l'adressage ci-après),
    • réponse de l'esclave par un bit d'acquittement ACK (ou de non-acquittement NACK),
    • après chaque acquittement, l'esclave peut demander une pause (« PA »).
    • émission d'un octet de commande par le maître pour l'esclave,
    • réponse de l'esclave par un bit d'acquittement ACK (ou de non-acquittement NACK),
    • émission d'une condition de RESTART par le maître (« RS »),
    • émission de l'octet ou des octets d'adresse par le maître pour désigner le même esclave, avec le bit R/W à 1.
  • Le maître devient récepteur, l'esclave devient émetteur :
    • émission d'un octet de données par l'esclave pour le maître,
    • réponse du maître par un bit d'acquittement ACK (ou de non-acquittement NACK),
    • (émission d'autres octets de données par l'esclave avec acquittement du maître),
    • pour le dernier octet de données attendu par le maître, il répond par un NACK pour mettre fin au dialogue,
    • émission d'une condition de STOP par le maître (« P »).
Exemple d'échange I²C entre un maître et un esclave

Condition de START[modifier | modifier le code]

La condition de START est une transgression de la règle de codage des bits qui est utilisée par le maître 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 ».

Condition de START I²C

Octet d'adressage[modifier | modifier le code]

Chaque esclave doit avoir une adresse unique.

Adressage sur 7 bits[modifier | modifier le code]

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

  • les 7 premiers bits correspondent à l'adresse proprement dite,
  • le dernier bit est nommé R/W :
    • s'il est à 0, le maître signale qu'il va envoyer des octets, et donc que l'esclave doit les lire,
    • s'il est à 1, le maître indique qu'il veut recevoir des octets, et donc que l'esclave doit les fournir.

On peut également considérer que l'adresse est codée sur les 8 bits, chaque esclave a alors 2 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 esclaves (« 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[modifier | modifier le code]

Dans le cas d'un adressage sur 10 bits, il faut utiliser 2 octets.

Le premier est l'octet « 11110yz0 » (comme précisé ci-dessus), les bits « yz » sont les 2 bits 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.

Adressage d'un esclave I²C sur 10 bits en écriture

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

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

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

Acquittement[modifier | modifier le code]

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.
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 maître est le récepteur, il positionne également le bit d'acquittement à NACK pour interrompre le dialogue, avant d'envoyer la condition de STOP.

Pause[modifier | modifier le code]

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

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

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

Pause I²C

Condition de RESTART[modifier | modifier le code]

La condition de RESTART est une transgression de la règle de codage des bits qui est utilisée par le maître 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 ».

Condition de RESTART I²C

Condition de STOP[modifier | modifier le code]

La condition de STOP est une transgression de la règle de codage des bits qui est utilisée par le maître 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 ».

Condition de STOP I²C

Multi-maîtres[modifier | modifier le code]

Synchronisation des horloges[modifier | modifier le code]

La synchronisation est réalisée grâce au principe du « ET câblé » sur la ligne SCL :

  • elle est maintenue à l'état « LOW » tant qu'un des maîtres la maintient à l'état « LOW »,
  • elle est maintenue à l'état « HIGH » tant que tous les maîtres la maintiennent à l'état « HIGH ».

Les maîtres peuvent avoir des durées de maintien de « HIGH » et de « LOW » différentes des autres maîtres, cependant ils ne doivent commencer à compter cette durée que lorsque la ligne SCL est au niveau voulu.

Cela signifie que si un maître passe de « LOW » à « HIGH » et qu'il veut imposer le niveau « HIGH » pendant 5 ms, il ne pourra commencer ce maintien durant 5 ms que lorsque la ligne SCL sera à « HIGH », soit lorsque tous les maîtres seront à « HIGH », donc la durée du maintien peut être plus longue.

Ce mécanisme implique que, la durée de maintien de la ligne SCL :

  • à l'état « LOW » est imposée par le maître ayant la durée correspondante la plus longue,
  • à l'état « HIGH » est imposée par le maître ayant la durée correspondante la plus courte.

Arbitrage des maîtres[modifier | modifier le code]

Plusieurs règles doivent être respectées par les maîtres :

  • lorsqu'un maître envoie une condition de START, les autres maîtres le détectent, et se taisent jusqu'à l'émission d'une condition de STOP,
  • suite à l'émission de la condition de STOP, le maître l'ayant émis dispose d'un délai pour écrire une nouvelle trame, s'il ne l'a pas fait à l'issue de ce délai, le bus est considéré comme libre :
Mode Durée avant « bus libre »
Standard 4,7 μs
Fast 1,3 μs
Fast plus 0,5 μs
High-speed (aucune)
Ultra-fast (aucune)
  • Le bus étant libre, les autres maîtres peuvent accéder au bus.
  • Dans le cas particulier où plusieurs maîtres accéderaient au bus simultanément (en envoyant simultanément une condition de START), les maîtres doivent monitorer ce qu'ils écrivent sur le bus, si un niveau « HIGH » écrit est lu « LOW », c'est qu'un autre maître émet, il doit alors immédiatement interrompre sa propre transmission et attendre la condition de STOP.

Trois conclusions :

  • Les messages adressés aux esclaves ayant les adresses les plus petites (avec les bits de poids forts à 0) sont prioritaires,
  • En cas d'adresses identiques, l'écriture est prioritaire sur la lecture,
  • En cas de collision, le message prioritaire arrive à l'esclave sans avoir été altéré.

Exemples de trames[modifier | modifier le code]

Trame I2C observée à l'oscilloscope.
Trame I2C observée à l'oscilloscope.

Support par les systèmes d'exploitations[modifier | modifier le code]

  • Microsoft Windows : I²C est implémenté par des pilotes spécifiques, fournis par les fabricants pour la plupart des contrôleurs et capteurs disponibles sur le marché actuellement.
  • Mac OS X : Il y a plus de 20 extensions pour le noyau qui communiquent avec les capteurs pour mesurer la tension, le courant, la température, l'accélération linéaire, la position angulaire et d'autres mesures physiques.
  • Linux : I²C est utilisable grâce aux modules spécifiques à chaque matériel fonctionnant au-dessus de la pile I2C implémentée dans le noyau. Il y a des centaines de matériels supportés dans la version courante du noyau Linux.
  • FreeBSD, NetBSD et OpenBSD : Une implémentation de la pile I²C est fournie et ils disposent d'un nombre important de pilotes pour des contrôleurs maîtres et des capteurs.
  • AmigaOS : le support peut être obtenu avec le composant i2c.resource pour AmigaOS 4.x ou la bibliothèque partagée i2c.library écrite par Wilhelm Noeker pour les systèmes plus anciens.
  • eCos : supporte I²C pour plusieurs architectures matérielles.
  • Arduino : I²C est utilisable avec la bibliothèque Wire.
  • Android : le système d'exploitation Android étant basé sur le noyau Linux, Android bénéficie du support I²C de Linux.

Technologies dérivées[modifier | modifier le code]

I2C est à la base :

  • de l’ACCESS.bus,
  • de l’interface VESA Display Data Channel (DDC),
  • du System Management Bus (SMBus),
  • de l’Intelligent Platform Management Bus (IPMB, l’un des protocoles de l’IPMI).

Ces implantations présentent des différences dans les tensions et les fréquences d’horloge, et peuvent avoir des interrupt lines (IRQ).

Voir aussi[modifier | modifier le code]

Sur les autres projets Wikimedia :

Articles connexes[modifier | modifier le code]

Liens externes[modifier | modifier le code]

Références[modifier | modifier le code]

  1. [PDF](en) page 7, spécification du bus I2C, version 1995, Philips Semiconductors I2c-bus.org, consulté en octobre 2012