Protocoles communication
RS-232, I2C et SPI
TechTalk
Root » Serveurs » Electro-ménager » Electronique » Communication

Trois petits protocoles de communication et leurs différences. Ces protocoles peuvent être utilisés pour la communication avec un arduino.
-

-

RS-232

C'est le protocole de communication le plus simple, il ne nécessite qu'un seul fil de données (communication dans un sens) ou deux (duplex). Il permet la communication entre deux appareils, il n'y a pas vraiment de "master" ou de "slave": un appareil envoie et l'autre reçoit.

Les données peuvent être transmises sur plusieurs dixaines de mètres, c'est le protocole de choix pour établir une communication numérique à distance, par exemple un capteur dans la cave et un afficheur au rez de chaussée (pour une communication analogique on utilisera si possible une boucle 4 - 20mA).

L'exemple le plus classique, c'est l'arduino qui envoie des données à un écran LCD ou une imprimante série. Il existe deux versions du protocole série, qui ne diffèrent que par les tensions: il y a le protocole RS-232 classique qui utilise des tensions négatives et positives et le protocole RS-232-TTL qui utilise les niveaux 0 et 5V et a une logique inversée. Les imprimantes utilisent le protocole standard, tandis que les écrans LCD modernes utilisent le protocole TTL.

  • Il y a plus d'informations sur le protocole RS-232 et la conversion des niveaux sur ces pages.
  • Deux applications concrètes pour commander une imprimante série: chauffage et data logger.
    Le second exemple montre qu'on peut inverser les polarités avec les routines SoftwareSerial sans devoir passer par un circuit électronique (si l'imprimante permet ces niveaux).

L'arduino permet de communiquer directement via le bus série (il utilise certaines lignes numériques fixes), mais on peut également utiliser une librairie qui donne plus de possibilités (choix des lignes et polarité).


I2C

Ce protocole 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.

Actuellement il 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) 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.

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

Une donnée est lue au moment où l'horloge est haute. La ligne data ne peut pas changer quand la lighe horloge est haute, c'est une condition qui ne peut se produire qu'en cas de sart ou stop. La condition start est la ligne SDA qui est tirée vers le bas, alors que l'horloge reste haute. La condition stop est signalée par la ligne SDA qui passe à un niveau haut alors que l'horloge est haute. La condition restart est une condition start sans que le master ne libère le bus (pas de condition stop).

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.


SPI

C'est un protocole plus récent et plus rapide. Il travaille avec des lignes unidirectionelles, ce qui permet de transmettre des signaux sur une plus grande distance en utilisant des amplificateurs, mais la distance est limitée à quelques mètres au maximum. Il nécessite 4 lignes de communication.

C'est une norme qui est utilisée nativement par certains périphériques comme les cartes de mémoire de type SD. Un interface SD ne se compose que d'un porte-cartes et d'un connecteur.

Pour utiliser ce protocole il faut utiliser la librairie SPI. Cette routine utilise les lignes numériques arduino uno 11, 12 et 13 et la ligne 4.

Pour lire une carte de mémoire, il faut également utiliser la librairie SD qui contient les routines pour accéder à la carte (formatée FAT16 ou FAT32).

Un exemple où les données sont enregistrées sur carte SD se trouve ici: enregistrement des données de fonctionnement de mon chauffage. Un exemple de carte SD est à droite, on voit bien les 4 lignes de données: Chip Select, Master Out Slave In, Serial Clock, Master In Slave Out et l'alimentation. Le circuit ne contient qu'un régulateur de tension 3.3V pour les cartes qui ne fonctionnent qu'en 3.3V.

Autres protocoles de communication

La plupart des écrans lcd ont nativement un protocole de communication parallèle sur 4 bits (transmettant un demi-octet ou nibble à la fois). Pour éviter de bloquer de nombreuses lignes numériques de l'arduino, la plupart des écrans lcd ont un petit interface supplémentaire qui accepte les données au format sériel classique et les transforme au format adapté aux écrans LCD.

Un écran a jusqu'à 16 broches, dont on en utilise 7 pour la communication. Ecrire vers un écran lcd de cette manière utilise plus de la moitié des broches d'un arduino uno, alors qu'il est possible de le faire en n'utilisant qu'une seule broche. Par contre, utiliser la communication parallèle permet de donner des instructions spécifiques à l'écran, la communication sérielle ne permettant que quelques instructions de base (effacer l'écran, saut d'une ligne,...). Les autres broches servent au backlighting, au réglage du contraste et à l'alimentation.

Publicités - Reklame

-