Le bus I2C

 

Présentation

 

Le bus I2C (Inter Integrated Circuit) a été développé au début des années 80 par Philips Semiconductors pour permettre de relier facilement à un microprocesseur les différents circuits d'un téléviseur moderne.

 

  • Caractéristiques

Le bus I2C permet de faire communiquer entre eux des composants électroniques très divers grâce à seulement trois fils : un signal de données (SDA), un signal d'horloge (SCL) et un signal de référence électrique (masse).

Ceci permet de réaliser des équipements ayant des fonctionnalités très puissantes (en apportant toute la puissance des systèmes micro-programmés) tout en conservant un circuit imprimé très simple par rapport un schéma classique (8 bits de données, 16 bits d'adresse + les bits de contrôle).

Les données sont transmises en série à 100 Kbits/s en mode standard et jusqu'à 400 Kbits/s en mode rapide. Ce qui ouvre la porte de cette technologie à toutes les applications où la vitesse n'est pas primordiale.

De nombreux fabricants ayant adopté le système, la variété des circuits disponibles disposant d'un port I2C est énorme : ports d'E/S bidirectionnels, convertisseurs A/N et N/A, mémoires (RAM, EPROM, EEPROM,...), circuits audio (égaliseur, contrôle de volume,...) et autre drivers (LED, LCD,...).

Le nombre de composants qu'il est ainsi possible de relier est essentiellement limité par la charge capacitive des lignes SDA et SCL : 400 pF.

 

  • Principes

Afin de d'éviter les conflits électriques, les Entrées/Sorties SDA et SCL sont de type "collecteur ouvert".

Voici un schéma de principe :

 

 

 

 

 

  

 

 

Structure d'E/S d'un module I2C

 

  • D'autres bus trifilaires

Le CBus de Phillips est l'ancètre du bus I2C. Par d'autres constructeurs, il y a également SPI de Motorola et µWire de National SemiConductor.

 

 

 Le protocole I2C

 

Plusieurs circuits pouvant être branchés en même temps sur le même bus, il a été nécessaire d'instaurer un protocole entre eux, afin d'éviter les problèmes dus à une prise de parole simultanée de différents modules. C'est le protocole I2C. Celui-ci définit la succession des états logiques possibles sur SDA et SCL, et la façon dont doivent réagir les circuits en cas de conflits.

 

  • Prise de contrôle du bus

Pour prendre le contrôle du bus, il faut que celui-ci soit au repos (SDA et SCL à '1'). Pour transmettre des données sur le bus, il faut donc surveiller deux conditions particulières : la condition de départ (SDA passe à '0' alors que SCL reste à '1') et la condition d'arrêt (SDA passe à '1' alors que SCL reste à '1').

Lorsqu'un circuit prend le contrôle du bus après avoir vérifié qu'il était pris, il en devient le maître. C'est lui qui génère alors le signal d'horloge.

Exemple de condition de départ et d'arrêt

  

  • Transmission d'un octet

Après avoir imposé la condition de départ, le maître applique sur SDA le bit de poids fort D7. Il valide ensuite la donnée en appliquant pendant un instant un niveau '1' sur la ligne SCL. Lorsque SCL revient à '0', il recommence l'opération jusqu'à ce que l'octet complet soit transmis. Il envoie alors un bit ACK à '1' tout en scrutant l'état réel de SDA. L'esclave doit alors imposer un niveau '0' pour signaler au maître que la transmission s'est effectuée correctement. Les sorties de chacun étant à "collecteur ouvert", le maître voit le '0' et peut alors passer à la suite.


Exemple de transmission réussie

Dans cet exemple : SCL (horloge imposée par le maître), SDAM (niveaux de SDA imposés par le maître), SDAE (niveaux de SDA imposés par l'esclave), SDAR (niveaux de SDA réels résultants).

 

  • Transmission d'une adresse

Le nombre de composants qu'il est possible de connecter sur un bus I2C étant largement supérieur à deux, il est nécessaire de définir pour chacun une adresse unique. L'adresse d'un circuit, codée sur sept bits, est défini d'une part par son type et d'autre part par l'état appliqué à un certain nombre de ses broches ( Voir §9 ). Cette adresse est transmise sous la forme d'un octet au format particulier. 

Exemple d'octet d'adresse

On remarque ici que les bits D7 à D1 représentent les adresses A6 à A0, et que le bit D0 est remplacé par le bit de R/W qui permet au maître de signaler s'il veut lire ou écrire une donnée. Le bit d'acquittement ACK fonctionne comme pour une donnée, ceci permet au maître de vérifier si l'esclave est disponible.

Cas particulier des mémoires

L'espace adressable d'un circuit de mémoire étant sensiblement plus grand que la plupart des autres types decircuits, l'adresse d'une information y est codée sur deux octets ou plus. Le premier représente toujours l'adresse du circuit, et les suivants l'adresse interne de la mémoire.

Les adresses réservées

Les adresses 00000XXX et 111111XX sont réservés à des modes de fonctionnement particuliers.

 

  • Ecriture d'une donnée

L'écriture d'une donnée par le maître ne pose pas de problème particulier : 

 
Exemple d'écriture d'une donnée

 

Cas particulier d'utilisation d'ACK

L'écriture d'un octet dans certains composants (mémoires, micro-contrôleur,...) peut prendre un certain temps. Il est donc possible que le maître soit obligé d'attendre l'acquittement ACK avant de passer à la suite.

 

  • Lecture d'une donnée

La lecture d'une donnée par le maître se caractérise par l'utilisation spéciale qui est faite du bit ACK. Après la lecture d'un octet, le maître positionne ACK à '0' s'il veut lire la donnée suivante ( cas d'une mémoire par exemple ) ou à '1' la cas échéant. Il envoie alors la condition d'arrêt.

 
Exemple de lecture d'une donnée

 

 

 Gestion des conflits

 

  • Mise en situation

La structure même du bus I2C a été conçue pour pouvoir y accueillir plusieurs maîtres. Se pose alors le problème commun à tous les réseaux utilisant un canal de communication unique : la prise de parole. En effet, chaque maître pouvant prendre possession du bus dès que celui-ci est libre, il existe la possibilité que deux maîtres prennent la parole en même temps. Si cela ne pose pas de problème sur le plan électrique grâce à l'utilisation de collecteurs ouverts, il faut pouvoir détecter cet état de fait pour éviter la corruption des données transmises.

 

  • Principe

Comme nous l'avons vu précédemment, pour prendre le contrôle du bus, un maître potentiel doit d'abord vérifier que celui-ci soit libre, et qu'une condition d'arrêt ait bien été envoyée depuis au moins 4,7µs. Mais il reste la possibilité que plusieurs maîtres prennent le contrôle du bus simultanément.

Chaque circuit vérifie en permanence l'état des lignes SDA et SCL, y compris lorsqu'ils sont eux même en train d'envoyer des données. On distingue alors plusieurs cas :

  • les différents maîtres envoient les mêmes données au même moment ; les données ne sont pas corrompues, la transmission s'effectue normalement, comme si un seul maître avait parlé ; ce cas est rare.
  • un maître impose un '0' sur le bus ; il relira forcément '0' et continuera à transmettre. Il ne peut pas alors détecter un éventuel conflit.
  • un maître cherche à appliquer un '1' sur le bus ; s'il ne relit pas un niveau '1', c'est qu'un autre maître a pris la parole en même temps ; le premier perd alors immédiatement le contrôle du bus, pour ne pas perturber la transmission du second ; il continue néanmoins à lire les données au cas où celles-ci lui auraient été destinées.

 

  • Exemple

 Soit le chronogramme suivant :


Dans cet exemple :

SCLR : Horloge résultante.
SDA1 : Niveaux de SDA imposés par le maître n°1.
SDA2 : Niveaux de SDA imposés par le maître n°2.
SDAR : Niveaux de SDA réels résultants lus par les deux maîtres.

Analyse

Lors du deuxième octet, le maître n°2 cherche à imposer un '1' (SDA2) , mais relit un '0' (SDAR), il perd alors le contrôle du bus et devient esclave (Cas n°3) . Il reprendra le contrôle du bus, lorsque celui-ci sera de nouveau libre. Le maître n°1 ne voit pas le conflit et continue à transmettre normalement (Cas n°2). Au total, l'esclave a reçu les données du maître n°1 sans erreurs et le conflit est passé inaperçu.

 

 

Nouvelles caractéristiques

 

Afin de compenser quelques lacunes des premières spécifications du bus I2C (qui datent de 1982), quelques nouvelles améliorations ont été apportées à partir de 1993 : 

  • le mode rapide : le bus a désormais la capacité de transmettre des données jusqu'à une vitesse de 400 Kbit/s.
  • des entrées à triggers de Schmitt afin de limiter la sensibilité au bruit.
  • la mise en haute impédance d'un circuit non alimenté : ceci évite de bloquer le bus si un périphérique n'est pas alimenté.
  • extension à 10 bits de l'adressage des circuits : l'adressage d'un circuit se fait maintenant sur 10 bits répartis dans deux octets d'adresse de la façon ci-dessous.

  

 

Adresses réservées

 

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

  • 0000 0000 : adresse d'appel général

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

Le deuxième octet permet 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 permettent rechargent leur adresse d'esclave.

  • 0000 0010

Les circuits qui le permettent rechargent leur adresse d'esclave.

  • 0000 0100

Les circuits définissant leur adresse de façon matériel réinitialisent leur adresse d'esclave.

  • XXXX XXX1

Cette commande joue le rôle d'interruption. XXXX XXX1 peut être l'adresse du circuit qui a généré l'interruption.

  • 0000 0001: octet de start

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

  • 0000 001X : début d'adressage CBus

L'émission de cet octet permet de rendre sourd tous les circuits I2C présents sur le bus. A 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.

  •  0000 0110 à 0000 1111

Ces octets ne sont pas définis et sont ignorés par les circuits I2C. Ils peuvent être utilisés pour débugger un réseau multi-maître.