mardi 19 janvier 2021

[Electro] Protocole de communication I2C


Le bus de communication I2C est un algorithme permettant la communication d’une multitude de périphériques sur une seule ligne.

Le protocole I2C

I2C, pour Inter Integrated Circuit , est un protocole de communication crée à la base par Philips en 1982 pour standardiser l’échange de données entre différents circuits intégrés d’un même système. Elle est aujourd’hui assurée par le fabricant NXP, spin-off de l’entreprise.

Ce protocole est basé sur un bus de communication sériel, ce qui signifie qu’un seul câble est utilisé pour le transfert de données.

En pratique, le bus I2C est constitué de deux câbles, un donc pour les données, nommé SDA (Serial Data) et l’autre faisant office d’horloge pour déterminer la fréquence de la communication, nommé SCL (Serial Clock).

Tout d’abord, il n’y a qu’un maître (le microcontrôleur de votre board Arduino), et une multitude d’esclaves (vos périphériques), chacun identifiés par une adresse unique. Seul le maître peut initier une communication.

Le maître envoie tout d’abord l’adresse du périphérique dont il désire recevoir les données. L’esclave envoie un premier signal de confirmation (acknowledgement) pour signifier qu’il a bien reçu la demande.

Puis le maître envoie l’adresse d’un registre interne du périphérique. Par exemple, pour un accéléromètre, on a trois registres stockant respectivement les données de l’accélération selon X, Y et Z. Un deuxième signal de confirmation est envoyé par le périphérique.

Enfin c’est le périphérique qui émet cette fois le message, en transférant la valeur du registre qui a été sollicité. Il termine avec une dernière confirmation, après quoi le maître envoie un signal spécifique pour mettre fin à la communication.

À noter que les deux lignes SDA et SCL sont liées à une résistance de pull-up. L’état 0 est donc l’état dominant.



Utilisation d’I2C avec Arduino

La première chose à faire est d’identifier l’adresse des périphériques liés à votre carte, et l’adresse de leur divers registres internes. Vous trouverez ces informations dans la fiche technique de votre board. Ensuite, dans le cas d’une connexion de périphériques externes, indépendants ou montés sur d’autres cartes Arduino, il faut identifier les ports attribués aux lignes SDA et SCL de chaque carte ou composants et les relier entre eux.

Il s’agira ensuite principalement de coder les échanges dans votre soft. Vous trouverez ci dessous les principales commandes:

Wire.begin();    Initialisation de la communication I2C, à effectuer au début de votre programme.

Wire.beginTransmission(Adresse de votre périphérique);    Cette commande est à appeller à chaque fois pour initialiser une transmission avec le périphérique dont l’adresse est donnée en argument.

Wire.write(Adresse du registre sollicité);    Cette commande permet d’accéder à un registre du périphérique, et est à appeler avec d’écrire ou de lire des données.

Wire.write(Byte à écrire);    Écriture des données désirées dans le registre sollicité au préalable.

Wire.requestFrom(Adresse de votre périphérique, n);    Lecture de n bits du périphérique adressé, dans le registre sollicité au préalable.

Wire.endTransmission();    Fin de la transmission. Cette commande doit être appelée à chaque fois, et avant l’envoi de toute nouvelle requête par I2C.

sourcehttps://www.arduino-france.com/tutoriels/quest-ce-que-le-bus-i2c-et-comment-fonctionne-t-il-sur-arduino/

Aucun commentaire:

Enregistrer un commentaire