Le protocole de communication I2C (ou IIC) est un protocole de communication simple qui permet l'échange de données entre un ou plusieurs masters et un ou plusieurs slaves. Il est encore utilisé de nos jours. |
-
Le protocole I2C peu connu a été développé dans les années 1980 pour relier les différents composants d'un appareil électronique (téléviseur, magnétoscope). Ce protocole ne permet qu'une communication à courte distance et la version standard n'est pas très rapide.
Ce protocole qui a beaucoup d'avantages car il est simple à réaliser est encore utilisé pour certaines applications, comme les horloges pour arduino (real time clock), les puces de mémoire EEPROM, certains capteurs intelligents. Les écrans d'ordinateur (VGA, DVI et HDMI) utilisent ce protocole pour signaler à l'ordinateur les modes d'affichage possibles,... Dans un magnétoscope, il y avait plusieurs masters (processeur principal, processeur d'écran (reçoit également le signal de télécommande) et le processeur mécanique) et plusieurs slaves (tuner, horloge, mémoire des programmes,...). Philips qui est à la base de ce protocole n'existe plus (c'est un nom collé sur certains appareils made in China), la norme est maintenue par NXP, un fabricant de semiconducteurs qui a repris le catalogue de Philips.
Le protocole utilise un ou plusieurs masters et un ou plusieurs slaves (un seul master pouvant être actif à un moment donné). Il y a deux lignes de communication: une horloge SCL et une ligne de données SDA. Une donnée est lue quand la ligne clock est haute. Le bus I2C est bidirectionnel et les appareils tirent la ligne à la masse (au repos les lignes sont hautes via des résistance pull up). C'est un protocole très simple qui est bien standardisé. Il est tellement simple en fait qu'il est possible de programmer directement un arduino sans passer par une librairie. C'est normalement le master qui génère le signal d'horloge, mais un périphérique peut bloquer l'horloge (en position basse) s'il n'est pas encore prêt. Plusieurs vitesses d'horloge sont possibles, mais une vitesse arbitraire est également autorisée (c'est le master actuel qui donne la vitesse d'horloge).
Un message se compose d'un ou de plusieurs blocs de données. Une donnée, c'est un octet. Quand un master veut envoyer un message, il met sur le bus une condition start puis envoie directement l'adresse sur 7 (parfois sur 10 bits). Il y a ensuite un bit qui indique si le master va envoyer des données ou en demander.
Le slave qui reconnait son adresse envoie un ACK. S'il n'y a pas de ack, c'est qu'il n'y a pas de slave avec cette adresse. La transmission de données se fait par blocs de 8 bits et le récepteur envoie un ack s'il a bien reçu l'octet. Quand toutes les données ont été transmises, le master envoie une condition stop pour signaler que le bus est libre (un autre master peut ainsi prendre le commandement). Le master envoie également une condition stop s'il n'a pas eu de réponse du périphérique. Un code nack est envoyé par le slave s'il ne peut pas effectuer l'opération (en cas de write). Un code nack est envoyé par le master si le slave ne doit plus transmettre de données. Le master peut alors envoyer un autre ordre (condition restart) ou libérer la ligne (condition stop). Chaque esclave doit avoir une adresse unique (il y a 127 adresses, mais certaines sont déjà réservées). Certaines puces esclave ont des broches qui servent à déterminer l'adresse à laquelle la puce doit répondre, pour éviter qu'il n'y ait plusieurs circuits intégrés avec la même adresse. C'est par exemple le cas s'il y a plusieurs puces identiques dans l'appareil. La mémoire EEPROM 24C512 (64kb) est accédée par le protocole I2C qui permet de lire un ou plusieurs octets consécutifs avec une seule instruction. Pour la communication avec un arduino, deux lignes numériques suffisent. La librairie à utiliser est Wire. Il n'est pas possible d'utiliser la ligne 13 car elle est connectée sur la plaquette à une led et une résistance. Un niveau haut ne peut pas être obtenu. Une broche sert à la fois d'entrée et de sortie. Avec un arduino, il faut définir les broches comme INPUT_PULLUP. Forcer une broche à un niveau haut n'est pas autorisé, puisqu'un périphérique peut forcer une ligne à un niveau bas. Pour éviter une telle condition qui pourrait détruire soit le master soit le slave, les petits modules I2C sont équipés de résistances de protection. |
Publicités - Reklame