I2C

Le bus I2C

Le bus I2C, dont le sigle signifie Inter Integrated Circuit ce qui donne IIC et par contraction I2C, a été proposé initialement par Philips mais est adopté de nos jours par de très nombreux fabricants. C'est un bus de communication de type série.

 

Présentation

Le bus I2C qui n'utilise que deux lignes de signal (et les masses correspondantes bien sûr) permet à un certain nombre d'appareils d'échanger des informations sous forme série avec un débit pouvant atteindre 100 K bits par seconde ou 400 K bits par seconde pour les versions les plus récentes. Même si ces débits peuvent sembler relativement faibles, les premières applications du bus I2C sont des applications audio ou vidéo pour lesquelles la simplicité de mise en œuvre est nettement plus importante qu’un débit élevé.

Ceci étant précisé, voici quels sont les points forts du bus I2C :

  • C'est un bus série bifilaire utilisant une ligne de données appelée SDA (Serial DAta) et une ligne d'horloge appelée SCL (Serial CLock).
  • Les données peuvent être échangées dans les deux sens sans restriction.
  • Le bus est multi-maîtres.;
  • Chaque abonné dispose d'une adresse codée sur 7 bits. On peut donc connecter simultanément 128 abonnés d'adresses différentes sur le même bus, sous réserve de ne pas le surcharger électriquement bien sûr.
  • Un acquittement est généré pour chaque octet de donnée transféré.
  • Le bus peut travailler à une vitesse maximum de 100 K bits par seconde (ou 400 K bits par seconde) étant entendu que son protocole permet de ralentir automatiquement l'équipement le plus rapide pour s'adapter à la vitesse de l'élément le plus lent, lors d'un transfert.
  • Le nombre maximum d'abonnés n'est limité que par la charge capacitive maximale du bus qui peut être de 400 pF. Ce nombre ne dépend donc que de la technologie des circuits et du mode câblage employés.
  • Les niveaux électriques permettent l'utilisation de circuits en technologies CMOS, NMOS ou TTL.

Tout ceci étant précisé, voyons maintenant comment fonctionne réellement ce bus car, à la lecture de ce qui précède vous devez commencer à vous poser bien des questions.

 

Principe d'un échange de données

 

Bus I2C

 

Cette figure montre le principe adopté au niveau des étages d'entrée/sortie des circuits d'interface au bus I2C. Si la partie entrée n'appelle aucune remarque particulière, on constate que la partie sortie fait appel à une configuration à drain ouvert (l'équivalent en MOS du classique collecteur ouvert) ce qui permet de réaliser des ET câblés par simple connexion, sur la ligne SDA ou SCL, des sorties de tous les circuits.

Aucune charge n'étant prévue dans ces derniers, une résistance de rappel à une tension positive doit être mise en place. Le niveau électrique n'est pas précisé pour l'instant car il dépend de cette tension. Nous parlerons donc de niveaux logiques hauts ou « 1 » ou bien encore de niveaux logiques bas ou « 0 » étant entendu que l'on travaille en logique positive c'est à dire qu'un niveau haut correspond à une tension plus élevée qu'un niveau bas.

Compte tenu de ce mode de connexion en ET câblé, lorsqu'aucun abonné n'émet sur le bus, les lignes SDA et SCL sont au niveau haut qui est leur état de repos.

 

I2C Transfert
 

Cette figure résume le principe fondamental d'un transfert à savoir : une donnée n'est considérée comme valide sur le bus que lorsque le signal SCL est à l'état haut. L'émetteur doit donc positionner la donnée à émettre lorsque SCL est à l'état bas et la maintenir tant que SCL reste à l'état haut (nous verrons des chronogrammes plus précis dans un instant).

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 s'appelle ici condition de départ et l'information de fin condition d'arrêt.

Une condition de départ est réalisée lorsque la ligne SDA passe du niveau haut au niveau bas alors que SCL est au niveau haut. Réciproquement, une condition d'arrêt est réalisée lorsque SDA passe du niveau bas au niveau haut alors que SCL est au niveau haut.

 

I2C Bus Protocol
 

Bien que nous soyons en présence d'un bus série, les données sont envoyées par paquets de huit, même si un octet regroupe en fait huit bits indépendants. Le bit de poids fort est envoyé le premier.

Chaque octet est suivi par un bit d'acquittement de la part du destinataire et l'ensemble du processus fonctionne comme indiqué sur la figure.

Tout d'abord, sachez que lors d'un échange de ce type, la ligne SCL est pilotée par l'initiateur de l'échange ou maître, quitte à ce que l'esclave agisse également dessus dans certains cas particuliers.

La figure ci-dessus montre tout d'abord une condition de départ, générée par le maître du bus à cet instant. Elle est suivie par le premier octet de données, poids forts en tête. Après le huitième bit, l'émetteur qui est aussi le maître dans ce cas, met sa ligne SDA au niveau haut c'est à dire au repos mais continue à générer l'horloge sur SCL. Pour acquitter l'octet, le récepteur doit alors forcer la ligne SDA au niveau bas pendant l'état haut de SCL qui correspond à cet acquittement, prenant en quelque sorte la place d'un neuvième bit.

Le processus peut alors continuer avec l'octet suivant et se répéter autant de fois que nécessaire pour réaliser un échange d'informations complet. Lorsque cet échange est terminé, le maître génère une condition d'arrêt.

 

Formats de transmission

Nous savons maintenant comment se déroulent les échanges ; il nous reste à examiner le format des données transmises afin de comprendre comment fonctionne l'adressage, mais aussi la définition du sens de transferts des données.

send format
 

Cette figure montre le contenu du premier octet qui est toujours présent en début d'échange. Ses sept bits de poids forts contiennent l'adresse du destinataire du message ce qui autorise 128 combinaisons différentes.

Le bit de poids faible indique si le maître va réaliser une lecture ou une écriture. Si ce bit est à zéro le maître va écrire dans l'esclave ou lui envoyer des données. S'il est à un, le maître va lire dans l'esclave c'est à dire que le maître va recevoir des données de l'esclave.

Lorsqu'un maître désire effectuer plusieurs échanges à destination d'esclaves d'adresses différentes, il n'est pas obligé de terminer le premier échange par une condition d'arrêt mais peut les enchaîner en générant une condition de départ dès la fin d'un échange.

Enfin, il existe une procédure dite d'appel général où l'adresse envoyée par le maître, c'est à dire rappelons-le, les sept bits de poids forts du premier octet, est nulle. Tous les circuits connectés sur le bus capables de répondre à un tel appel général doivent alors le faire et prendre en compte les données qui suivent. Leur attitude dépend du bit de lecture/écriture de ce premier octet. En effet, si ce bit est à zéro, le deuxième octet revêt une signification particulière, que je ne détaillerais pas ici, mais qui permet, au niveau de chaque esclave, la programmation de son adresse par logiciel ou matériel.

Lorsque ce bit est à un, on est en présence d'un appel général matériel qui est transmis par un maître du bus matériel, tel qu'un circuit d'interface de clavier par exemple. Un tel circuit est incapable de générer l'adresse du destinataire de l'information qu'il a à envoyer. Dans ces conditions, l'octet suivant contient l'adresse de ce maître matériel afin qu'un esclave « intelligent », généralement un microcontrôleur, le reconnaisse et prenne en compte l'information qu'il émet ensuite.

 

La gestion des conflits

La structure même du bus I²C a été conçue pour pouvoir y accueillir plusieurs maîtres. Se pose alors le problème commun à tout les réseaux utilisant un canal de communication unique : la gestion des conflits. En effet, chaque maître pouvant prendre possession du bus dès que celui çi est libre, c'est à dire tant que les lignes SDA et SCL sont au niveau haut depuis suffisamment de temps, (4,7 µs), il existe le possibilité que deux maîtres prennent le contrôle du bus en même temps. Si cela ne pose pas de problème sur le plan électrique grâce à l'iutilisation de collecteurs ouvert, il faut pouvoir détecter cet état de fait pour éviter la corruption des données transmises. Comment cela se passe-t-il ?

Une fois qu'il est établi que le bus est libre, le circuit qui souhaite prendre le contrôle du bus place la ligne SDA à 0 puis il relit l'état réel de la ligne SDA pour le comparer avec l'état qu'il souhaite imposer. Si dans un laps de temps très proche un autre maître décide aussi de prendre le contrôle du bus, il placera lui aussi la ligne SDA à 0. Du fait de la configuration à collecteur ouvert, le niveau de la ligne SDA sera à un niveau résultant d'une fonction "ET" entre les niveaux demandés par chaque maître. Pour l'instant, le résultat sera bien un niveau 0, de sorte qu'aucun maître ne peut savoir qu'il y a un conflit.

Chaque circuit maître va donc commencer normalement à générer le signal d'horloge, de sorte que l'état de la ligne SCL sera aussi le résultat d'une fonction « ET » des différents états imposés par chaque maître.

Pendant l'état bas de la ligne SCL, chaque maître va modifier sa propre sortie SDA. Si tous les maîtres qui ont pris le contrôle du bus placent le même état sur la ligne SDA, le conflit n'étant pas visible, la transmission se poursuit normalement, comme si chacun était seul. En revanche, dès qu'un maître place un niveau différent des autres sur la ligne SDA, il y aura forcément un état bas sur la ligne SDA, tandis qu'un ou plusieurs maîtres souhaitaient imposer un niveau haut. Tous les maîtres qui ont demandé un niveau haut, tandis que la ligne SDA reste à 0, vont perdre immédiatement le contrôle du bus. A partir de cet instant, le ou les maîtres qui viennent de perdre le contrôle du bus vont continuer à lire les états successifs de la ligne SDA. Ils vont continuer la lecture comme ils l'auraient fait en tant qu'esclaves, pour le cas où le maître qui reste encore en course souhaite justement adresser l'un d'eux.

 

Multi Master mode
 

Si les différents maîtres en compétitions tentent d'adresser le même composant, la ligne SDA sera toujours au bon niveau. La procédure d'arbitration va alors continuer avec les données à transmettre. Si les différents maîtres qui adressaient le même composant écrivent la même donnée, le conflit n'a pas lieu d'exister puisque tout le monde veut faire la même chose. La procédure d'arbitration va alors se poursuivre jusqu'à ce que l'un des maîtres demande un niveau différent des autres. En poussant le raisonnement à l'extrême, on peut imaginer le cas où tous les maîtres vont demander les mêmes niveaux jusqu'à la condition d'arrêt. Mais la probabilité d'un tel cas est bien faible. Quoi qu'il en soit, si le cas se produit, la procédure d'arbitration garantit que le résultat final est correct, chaque maître ayant réalisé la même opération exactement en même temps.

 

Ralentissement de la vitesse

Il est possible de ralentir la vitesse de transmission du bus I²C. Si un circuit esclave a besoin de ralentir les échanges sur le bus, il lui suffit de maintenir la ligne SCL à état bas. Le circuit maître scrute en permanence la ligne SCL pour la comparer avec l'état qu'il souhaite lui-même imposer. Quand le circuit maître détecte un niveau bas tandis qu'il vient de placer sa sortie SCL à l'état haut, il passe dans une boucle d'attente. L'attente se poursuivra jusqu'à ce que la ligne SCL asse au niveau haut.

 

I2C speed
 

Les adresses réservées

Les adresses 0000 0xxx ne sont pas utilisées pour l'adressage de composants. Elles ont été réservés par Philips pour effectuer certaines fonctions spéciales.

Adresse d'appel général : 0000 0000

Après l'émission d'un appel général, les circuits ayant la capacité de traiter ce genre de demande d'appel émettent un acquitement.

Le deuxième octet permet de définir le contenu de l'appel :

0000 0110

  • => RESET. Remet tous les registres de circuits connectés dans leur état initial (mise sous tension). Les circuits qui le peuvent rechargent leur adresse esclave.

0000 0100

  • => Les circuits définissant leur adresse de façon matérielle réinitialisent leur adresse esclave. Cela ne réinitialise pas les circuits.

0000 0000

  • => Interdit

xxxx xxx1

  • => Cette commande joue le rôle d'interruption. xxxx xxx peut être l'adresse du circuit qui a généré l'interruption.

Les autres valeurs du second octets ne sont pas définies et sont tout simplement ignorées.

Octet de start : 0000 0001

Cet octet est utilisé pour synchroniser les périphériques lents avec les périphériques rapides.

Début d'adressage CBUS : 0000 001x

L'émission de cet octet permet de rendre sourd tous les circuits I²C présents sur le le bus. À partir de ce moment, on peut transmettre ce que l'on désire sur le bus, en utilisant par exemple un autre protocole. Le bus repasse en mode normal lors de la réception d'une condition d'arrêt.

Autre : 0000 0110 à 0000 1111

Ces adresses ne sont pas définis et sont ignorés par les circuits I²C. Elles peuvent être utilisés pour débugger un réseau multimaster.