Ignorer la navigation

III. Communications informatiques: 3. Exemple N°2 : le bus I2C

Le bus I2C (I2C signifie : Inter-Integrated Circuit) a été créé au début des années 80 par RTC Philips afin d’apporter une solution simple et peu coûteuse à la communication entre les circuits intégrés numériques à l’intérieur des appareils grand public (téléviseurs, magnétoscopes, jouets, ...). Le principal avantage du bus I2C est de limiter le nombre de liaisons entre circuits intégrés.

Le bus I2C est un bus de type série synchrone ne nécessitant que deux signaux.

  • SDA (Serial Data Line), le signal de données bidirectionnelle.
  • SCL (Serial Clock Line), le signal d’horloge bidirectionnel.


Ce bus permet la communication entre un circuit maître et un circuit esclave. Le montage peut comporter plusieurs maîtres et plusieurs esclaves. Le maître est le circuit qui émet le signal d’horloge de synchronisation, un seul maître peut envoyer ce signal. Les données peuvent circuler dans les deux sens sur le fil des données, de sorte que chaque circuit, qu’il soit maître ou esclave peut servir d’émetteur ou de récepteur (de données).

Les différents circuits sont placés en parallèle sur les lignes SDA et SCL comme sur le schéma suivant :


Remarques :

  • Les 2 lignes SDA et SCL sont tirées au niveau de tension du Vcc (niveau haut) à travers des résistances de pull-up (ici 1KΩ).
  • Cartes Arduino : I2C est disponible sur une carte Arduino Uno sur la broche analogique 5 pour SCL qui fournit un signal d’horloge, et la broche analogique 4 pour SDA, qui s’occupe du transfert des données (sur la Mega, il faut utiliser la broche 20 pour SDA et la broche 21 pour SCL). La bibliothèque utilisée est WIRE.
  • Raspberry Pi : pour type B, il faut utiliser les broches GPIO2 et GPIO3 pour SDA et SCL.
  • En général il n’y a qu’un seul « maître » mais il est toutefois possible d’en avoir plusieurs.



Nombre d’éléments connectables :
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 caractéristique physique (capacité) du bus. Il faut savoir que des adresses sont réservées par les fabricants ce qui limite grandement le nombre d'équipements.



Protocole :

Au repos, c’est à dire lorsque aucun circuit n’émet, les signaux SDA et SCL sont au niveau logique haut. Pour éviter les conflits, un maître qui veut émettre doit attendre que le bus soit au repos.

Principe :

  • Quand une ligne (SDA ou SCL) est au repos (niveau 1), on peut la forcer à 0.
  • Quand une ligne (SDA ou SCL) est au niveau 0, on ne peut pas la forcer à 1.


Comme la transmission s’effectue sous forme série, une information de début et de fin doit être prévue. L’information de début se nomme START et l’information de fin STOP.

Un maître prend le contrôle du bus en effectuant un START : il met SDA à 0, SCL restant à 1. Au cours de la communication, l’horloge SCL est envoyée par le maître et SDA ne peut changer d’état que lorsque SCL est à 0 :




Les données sont envoyées par paquets de huit bits (ou octets). Le bit de poids fort est envoyé le premier, chaque octet est suivi par un bit d’acquittement (ACK) de la part du destinataire.

Le message peut être décomposé en deux 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 à 0
  • 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.

2. 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 »).





Des exemples de trame I2C :

Cela donne dans le cas où le maître ne fait que lire ce que l’esclave envoi:


avec :


en signal électrique :




Cela donne dans le cas où le maître écrit à l’esclave envoi:


et en signal électrique :



Cela donne dans où le maître écrit (envoie une commande) puis lit ce que l’esclave envoi:


On remarque que pour que le maître envoie une commande il faut mettre le bit R/W à 0 et pour que le maître lise les données envoyées par un esclave il faut mettre le bit R/W à 1

et en signal électrique :


On remarque que SDA est "préparé" avant que SCL soit à l'état haut. Ainsi s'explique le décalage entre le changement d'état de SCL et celle de SDA pendant la transmission.


Exemple d’un relevé réel (oscilloscope) :





Calcul des résistances de Pull-up : 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.

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,4V

3mA

1534Ω

Fast

0,6V

6mA

733Ω

Fast plus

0,4V

20mA

230Ω


Les valeurs max (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Ω



Des exemples avec Arduino :

Arduino et un afficheur LCD I2C:



Arduino et un capteur de courant I2C:






Deux Arduino (un maître, un esclave) :