I- Introduction
Le bus I2C (Inter-Integrated Circuit) est un bus qui a émergé de la « guerre des standards » lancée par tous les acteurs du monde électronique.
Conçu par Philips pour les applications de domotique et d’électronique domestique, il permet de relier facilement, à un microprocesseur, différents circuits notamment ceux d’une télévision moderne (récepteur de la télécommande, réglages des amplificateurs basses fréquences, tuner, horloge, gestion de la prise péritel…).
II- Couche physique
1- Topologie
Le bus I2C est un bus de données série synchrone half-duplex.
La connexion est réalisée par l'intermédiaire de 2 lignes et un fil de masse :
• SDA (Serial Data Line) : ligne de données bidirectionnelle,
• SCL (Serial Clock Line) : ligne d'horloge de synchronisation bidirectionnelle.
Les échanges ont toujours lieu entre un seul maître et un (ou tous les) esclave(s), toujours à l'initiative du maître (jamais de maître à maître ou d'esclave à esclave). Cependant, rien n'empêche à un composant de passer du statut de maître à esclave et réciproquement.
2- Encodage des bits
L'encodage utilisé est de type NRZ (non-retour à 0) :
Pour le bus I2C « Arduino », le niveau BAS (LOW) correspond à 0V et le niveau HAUT (HIGH) correspond à 5V.
Le niveau BAS (LOW) est prioritaire sur le niveau HAUT (HIGH).
III- Le protocole I2C
1-Prise de contrôle du bus
Au repos les signaux SDA et SCL sont au niveau logique haut.
Le maître désirant prendre la main sur le bus, met la ligne SDA à zéro.
La prise de contrôle a lieu si SDA passe du niveau HAUT (HIGH) au niveau BAS (LOW),
alors que SCL est au niveau HAUT (HIGH).
2- Transmission d'une adresse
Le nombre de composants qu'il est possible de connecter sur un bus I2C étant largement supérieur à deux, le maître doit pouvoir choisir quel esclave est censé recevoir les données.
Dans ce but, le premier octet que transmet le maître n'est pas une donnée mais une adresse.
Chaque circuit connecté au bus I2C possède une adresse (A0 à A6 ci-dessous), qui doit être unique.
Si R/W=0, la donnée suivante sera écrite.
Si R/W=1, la donnée suivante sera lue.
3- Ecriture de données
Si le bit R/W précédemment envoyé était à 0, cela signifie que le maître doit transmettre un ou plusieurs octets de données. Après chaque bit ACK valide (ACK=0)*, le maître peut continuer d'envoyer des octets à l'esclave ou bien il peut décider de terminer le dialogue par une condition d'arrêt.
*Si la valeur lue pour le bit ACK est 0, c'est que l'esclave s'est bien acquitté de l'octet reçu, sinon c'est
qu'il y a une erreur et le maître doit générer la condition arrêt.
4- Lecture de données
Si le bit R/W transmis en même temps que l'adresse est à 1, cela signifie que le maître veut lire des données issues de l'esclave.
C'est toujours le maître qui va générer le signal d'horloge SCL.
En revanche, après le bit ACK de l'adresse, c'est l'esclave qui va garder le contrôle de la ligne SDA.
Après que l'esclave a transmis les 8 bits de données, c'est le maître, cette fois-ci, qui va générer un bit d'acquittement.
Si le maître désire lire des octets supplémentaires, il placera le bit d'acquittement à 0.
En revanche, si le maître décide que la lecture est terminée, il placera le bit ACK au niveau 1. L'esclave comprendra alors que le transfert est terminé.
Cette fois-ci, bien que le bit ACK soit au niveau 1, cela ne correspond pas à une condition d'erreur mais à une fin de transfert.
5- Condition de l'arrêt
Tant que la ligne SCL est au niveau haut, la ligne SDA ne doit pas changer d'état, sinon cette condition sera interprétée comme la
condition d'arrêt.
La condition arrêt peut survenir même au milieu de la transmission d'un octet, pour abandonner la transmission et libérer le bus pour les autres circuits.
6- Condition d'un restart
La condition de RESTART est une transgression de la règle de codage des bits qui est utilisée par le maître pour signifier le début
d'une nouvelle trame dès la fin de la trame précédente sans passer par une condition de STOP.
La condition de RESTART est similaire à la condition de START, à cela près que la ligne SCL doit d'abord passer du niveau « LOW » au niveau « HIGH ».