Cours Systèmes Embarqués: BUS I2C   

1. Historique

Le bus I2C ( Inter Integrated Circuit Bus ) est le bus historique, développé par Philips pour les applications de domotique et d'électronique domestique au début des années 80, notamment pour permettre de relier facilement à un microprocesseur les différents circuits d'un téléviseur moderne.

            C'est le bus qui a émergé de la guerre des standards lancée par tous les acteurs du monde électronique. Ainsi, dans votre téléviseur, tous les ensembles sont sur un bus I2C ( Récepteur télécommande, réglages ampli BF, tuner, horloge, gestion péritel…)

Il existe d'innombrables périphériques exploitant ce bus, il est même implantable par logiciel dans n'importe lequel des microcontrôleurs. Le poids de l'industrie de l'électronique grand public a imposé des prix très bas aux nombreux composants.

2. Caractéristiques

Le bus I2C permet de faire communiquer entre eux des composants électroniques très divers grâce à seulement trois fils :

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

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

  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, EPREM, EEPROM, etc... ), Circuits Audio ( Egaliseur, 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 .

3.  Principe

Afin de d'éviter les conflits électriques les Entrées/Sorties SDA et SCL sont de type "Collecteur Ouvert". Cela permet ainsi la présence de plusieurs maîtres sur le bus.

Structure d'E/S d'un module I2C :

Structure d'E/S d'un module I2C

4. Le protocole I2C

      Le protocole I2C 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.

4.1.  La 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 :

Lorsqu'un circuit, après avoir vérifié que le bus est libre, prend le contrôle de celui-ci, il en devient le maître. C'est lui qui génère le signal d'horloge.

La prise de contrôle du bus I2C 

4.2.  La transmission d'un octet

La transmission d'un octet

Dans cet exemple :

4.3.  La 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 ces broches. Cette adresse est transmise sous la forme d'un octet au format particulier.

La transmission d'une adresse      

On remarque ici que les bits D7 à D1 représentent les adresse A6 à A0, et que le bit D0 et 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.

Note 1: Cas particulier des mémoires :

      L'espace adressable d'un circuit de mémoire étant sensiblement plus grand que la plupart des autres types de circuits, 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.

Note 2: Les adresses réservées.

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

4.4.  Ecriture d'une donnée

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

Ecriture d’une donnée

Note : Cas particulier d'utilisation d'ACK :

L'écriture d'un octet dans certains composants ( Mémoires, microcontrô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.

4.5.  Lecture d'une donnée

      La lecture d'une donnée par le maître se caractérise par l'utilisation spéciale qui 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

Lecture d’une donnée sur bus I2C

5. La gestion des conflits

5.1.  Mise en situation

La structure même du bus I2C a été conçu 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 prise de parole.

 En effet, chaque maître pouvant prendre possession du bus dès que celui-ci est libre, il existe la possibilité de 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.

5.2.  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 :

(1) Les différents maîtres envoient les mêmes données au même moment :

(2) Un maître impose un '0' sur le bus :

(3) Un maître cherche à appliquer un '1' sur le bus :

5.3.  Exemple

 Soit le chronogramme suivant :

gestion des conflits

Dans cet exemple :

5.4 Analyse :

Le premier octet est transmis normalement car les deux maîtres imposent les même données. (Cas n°1). Le bit ACK est mis à '0' par l'esclave.

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 à reçu les données du maître n°1 sans erreurs et le conflit est passé inaperçu.

5.5 Les 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 :

Extension à 10 bits de l'adressage des circuits

Remarque :

            En 1998, le mode haut débit porte la vitesse maximum du bus I2C à 3.4 Mb/s. Les marges de bruit ont aussi été modifiées pour permettre de relier des circuits faible consommation ( alimentation 2V )

6. 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.

6.1.  Adresses d'appel général

Adresse : 0000 0000 .

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 de définir le contenu de l'appel :

6.2.  Octet de START

Adresse : 0000 0001 .

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

6.3.  Début d'adresse CBUS

Adresse : 0000 001x .

L'émission de cet octet permet de rendre sourd tout 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.

6.4.  Autres

Adresses : 0000 0110 à 0000 1111 .

Ces octets ne sont pas définit et sont ignoré par les circuits I2C. Il peuvent être utilisé pour débugger un réseau multimaster.

7.  Esemple :

exemple de montage du bus I2C

program Eeprom_Test;
var  EE_adr, EE_data, k : byte;
        jj : word;
begin
  I2C_Init(100000);    // Initialize full master mode
  TRISD := 0;          // PORTD is output
  PORTD := $FF;        // Initialize PORTD
  I2C_Start;           // Issue I2C start signal
  I2C_Wr($A2);         // Send byte via I2C(command to 24cO2)
  EE_adr := 2;
  I2C_Wr(EE_adr);      // Send byte(address for EEPROM)
  EE_data := $AA;
  I2C_Wr(EE_data);     // Send data(data that will be written)
  I2C_Stop;            // Issue I2C stop signal
  for jj := 0 to 65500 do nop;  // Pause while EEPROM writes data
  I2C_Start;           // Issue I2C start signal
  I2C_Wr($A2);         // Send byte via I2C
  EE_adr := 2;
  I2C_Wr(EE_adr);      // Send byte(address for EEPROM)
  I2C_Repeated_Start;  // Issue I2C signal repeated start
  I2C_Wr($A3);         // Send byte (request data from EEPROM)
  k := I2C_Rd(1);      // Read the data
  I2C_Stop;            // Issue I2C stop signal
  PORTD := k;          // Show data on PORTD

  while true do nop;  // Endless loop

end.

cours bus I2C microcontrôleur PIC SDA SCL programmation electronique architecture Caractéristiques formation

Révisé le :18-11-2017 www.technologuepro.com Facebook Twitter RSS