Protocol du bus I2C

Le protocole de ce bus va être décrit dans sa version 2.1, même s'il n’a pas subi de changement significatif depuis sa version initiale (mode high-speed uniquement).
Ce protocole est défini par la succession des états que peuvent prendre les signaux SDA et SCL. Ce protocole est relativement simple et puissant à la fois.
Il peut être décomposé en plusieurs parties distinctes :

schéme du protocol

Exemple d’une trame sur le bus I²C

En fait, il est possible de décomposer cette trame en deux parties, les bits de A6 à ACK peuvent être vus comme la première partie et ceux de D7 à ACK comme la seconde.
Ces deux parties n’étant que la mise en place de l’adresse destinataire et de la donnée transmise ou reçue.

La prise de parole

Avant d’initier un dialogue sur le bus, chaque composant doit s’assurer que le bus est libre.
Pour ce faire, le composant maître vérifie que les lignes SDA et SCL sont au repos (état haut) et ce pendant une durée de 4,7µs, temps constructeur désigné par THD ;STA

Condition de départ

Toujours présente, la condition de "Start" est définit par un changement de la ligne de donnée alors même qu’elle n’a pas été validée par l’horloge.
La condition pour initier ce départ étant l’état ‘1’ sur les lignes SDA et SCL.
La condition de "Start" a lieu lors du passage de la ligne de donnée à ‘0’ alors même que l’horloge reste à ‘1’.

Exemple au start

Condition de Start

Adresse du destinataire

Il s’agit ici du morceau de trame qui comporte les plus grandes traces de l’histoire du bus I²C.
Dans sa forme primitive, le CBUS, ancêtre de ce bus, imposait une adresse sur 7 bits.
Afin de garantir cette compatibilité CBUS, il a fallu adapter l’adresse 10 bits des nouvelles versions du Bus I²C avec son histoire.

Exemple de l'adressage

Adressage sur 7 bits

On peut voir sur le schéma ci-dessus que l’adressage se fait du bit le plus fort vers le bit le plus faible, le huitième bit sera décrit dans la section suivante.
L'établissement d'une adresse sur 10 bits s’effectue en deux temps :
Dans un premier temps, on envoie un octet comprenant les 2 bits de poids fort de l’adresse.
Le quartet premier ne doit comporter que des 1 et le second quartet commence par un 0 les deux bits représentant les deux bits de poids fort de l’adressage sur 10 bits, le dernier étant celui de Lecture/Ecriture.
Le maître doit maintenant attendre le bit de validation (Acknowledgement), il peut être donné par plusieurs composants à la fois, tous ceux commençant par cette adresse.
La seconde partie de l’adresse sera donc transmise une fois l’accusé reçu.

Exemple en adressage 10bits

Adressage sur 10 bits

Il existe plusieurs variantes de cette méthode d’adressage car, notamment sur les mémoires, il faut effectuer un adressage interne du composant, cette seconde adresse étant transmise après l’accusé de la première adresse.
Afin de répondre à certaines fonctions du bus, il est nécessaire d’avoir des adresses spécifiques permettant des opérations particulières.
Si l’adresse est à 0 et le bit de Lecture/Ecriture à 0, il s’agit d’un appel général ou plus communément appelé BroadCast.
Si l’adresse est à 0 et le bit de lecture écriture à 1, il s’agit d’un "octet de départ", il peut être envoyé avant le transfert réel afin de palier aux problèmes des composants les plus lents, notamment ceux simulant le protocole de manière logiciel.

Liste de différents modules :

ADRESSE ESCLAVEBit R/WDescriptionDonnéeDescription
0000 000 0 Appel Général
0000 0110 RESET, remet tout les registres dans leurs états initiaux (mise sous tension), les circuits qui le permettent rechargent leur adresse esclave
0000 0010 Les composants qui le permettent rechargent leur adresse esclave
0000 0100 Les composants, définissant leur adresse esclave de manière matériel, réinitialisent leur adresse.
0000 0000 Interdit
xxxx xxx1 Cette commande joue le rôle d’interruption, x peut être l’adresse du composant qui a généré l’interruption.
0000 000 1 Octet de départ
0000 001 X Adresse CBUS
0000 010 X Format de bus différents
0000 011 X Réservé pour utilisation future
0000 1XX X Réservé pour utilisation future
1111 1XX X Réservé pour utilisation future
1111 0XX 1 Adresses d’esclave à dix bits

Mode Lecture/Ecriture

Plus communément appelé R/W, il s’agit du huitième bit du premier octet.
Il sera toujours mis en bit de poids le plus faible de l’octet de l’adresse.
Son utilité réside dans le faite d’indiquer à l’esclave appelé, s'il s’agit d’une lecture ou d’une écriture qui sera effectuée.

Acquittement

Effectué par l’esclave, ce bit permet de signaler au maître qu’il existe bien un composant à l’adresse indiquée.
Son utilisation est un peu spéciale et est possible que par la technologie électronique mise en œuvre dans le concept du bus I²C.
Le maître doit maintenir la ligne SDA à l’état haut, l’esclave mettra à bas la ligne SDA, il ne reste donc plus qu’au maître de lire l’état de la ligne SDA.
Il n’existe pas de normalisation du délai après lequel l’esclave sera considéré comme inexistant.

Exemple d'acquittement

Exemple d'acquittement

Légende
SCL Horloge du bus
SDAM Niveauximposés par le maître
SDAE Niveaux imposés par l’esclave
SDAR Niveaux résultant sur le bus

Donnée en Lecture/Ecriture

Il s’agit de la deuxième partie de la trame ; elle contient les données circulant sur le bus.
S’il s’agit d’une lecture, le maître met à ‘1’ le niveau du SDA et l’esclave se charge de descendre à ‘0’ ce niveau pour former l’octet résultant d’une lecture, chaque bits étant bien entendu délimité par l’horloge SCL.

Exemple d'une lecture simple

Exemple d’une lecture

Légende
SCL Horloge du bus
SDAM Niveauximposés par le maître
SDAE Niveaux imposés par l’esclave
SDAR Niveaux résultant sur le bus

S’il s’agit d’une écriture, le niveau du SDA va être contrôlé par le maître, l’esclave écoutant en appliquant un niveau haut sur le bus.

Exemple d'écriture simple

Exemple d’une écriture

Légende
SCL Horloge du bus
SDAM Niveauximposés par le maître
SDAE Niveaux imposés par l’esclave
SDAR Niveaux résultant sur le bus

Dans le cas où les données seraient plus importantes en lecture ou en écriture, la seconde partie de la trame (Donnée + Ack) est répétée autant de fois que nécessaire.

Exemple d'écriture complexe

Exemple d’écriture de plusieurs octets

Acquittement

Il s’agit de nouveau d’un accusé de réception, mais de la donnée cette fois-ci.
Cependant, selon s’il s’agit d’une écriture ou d’une lecture, le niveau de ce bit varie.
En effet, lors d’une lecture, ce bit est à ‘1’ car l’esclave n’a pas à accuser le fait qu’il ait fini d’envoyer ces données.
Lors d’une écriture, l’esclave met à ‘0’ le niveau du bus, donnant ainsi un accusé de réception de la donnée.
Ceci est une notion importante faisant la spécificité de cet acquittement par rapport à celui de l’adresse.

Condition d’arrêt

La condition de "Stop" est à l’inverse de la condition de "Start".
La réalisation de cette condition sous-entend au préalable que les lignes SDA et SCL soient au niveau ‘0’.
Cette condition remplie, la ligne SDA passe au niveau ‘1’, puis c’est au tour de la ligne SCL de passer au niveau ‘1’.
Un fois ce signal donné, tous les composants sont dans un état de veille et ne réagiront qu’à la prochaine condition de "Start".

Exemple stop

Condition de Stop

Retourner en haut de la page