Protocole UART
Introduction
UART est un protocole de communication utilisé pour échanger des données entre des appareils. Parmi les protocoles populaires pour microcontrôleurs les plus utilisés UART (UART, SPI et I2C), UAR a été le premier développé.
UART signifie Émetteur-Récepteur Asynchrone Universel (Universal Asynchronous Receiver and Transmitter). Les protocoles synchrones ont des liens séparés pour l’horloge et les données : les liens de données et d’horloge sont utilisée pour déclencher la lecture (ou l’écriture) des données. UART est asynchrone, ce qui signifie qu’il n’utilise que des liens de données et pas de signal d’horloge. Les données sont transmises à une vitesse définie, donc le récepteur et l’émetteur doivent être configurés à la même vitesse (appelé baud rate) afin que la communication soit établie. UART à normalement 2 liens de données, nommés Transmission (TX) et Réception (RX), afin de permettre aux données d’être envoyées dans les deux sens (full duplex).
La trame UART
La connexion de données UART est au niveau logique haut en repos quand aucune donnée n’est transmise. La transmission des données commence par tirer la ligne au niveau logique bas pour 1 bit. Après ce bit de démarrage (Start Bit), les bits de données (Data Bits) sont transmis. Ceci se termine par un bit d’arrêt (Stop Bit) puis la ligne revient au niveau logique haut.
Par exemple, voici une transmission du nombre binaire 01011110 (hexadécimam 0x7A)
Certaines variations sur la trame sont possibles, mais le tramage illustré au-dessus est de loin le plus commun. Nous reviendrons sur ces variations plus tard dans cet article. Lors de la transmission de multiples octets, ceux-ci s’enchainent les uns à la suite des autres sans de temps de repos (idle time) entre eux.
Par exemple, ci-dessous la séquence hexadécimale de 0x1A9E2B est présentée :
Baud Rate
La vitesse à laquelle la communication intervient est appelée, le baud rate. Le baud rate exprime un nombre de bits par seconde (bps), et des vitesses couramment utilisées sont 9 600, 19200 et 115200. Pour un tramage de 1 bit d’arrêt et pas de bit de parité (nous en reparlerons plus tard), on envoie 10 bits pour transmettre 8 bits de données (c’est-à-dire 1 octet) ; donc à 9 600 bauds, cela nous donne un débit de données de 960 octets par seconde soit un peu plus d’une milliseconde par octet.
Comme le protocole est asynchrone et qu’aucun signal n’existe d’horloge, l’émetteur et le récepteur doivent utiliser leurs horloges internes (telle que l’horloge système d’un microcontrôleur). Parfois, il est impossible pour l’émetteur ou le récepteur de générer exactement le baud rate demandé, car les vitesses possibles sont souvent un facteur de la vitesse de l’horloge interne de l’émetteur/récepteur – Dans ce cas, la vitesse actuelle va dévier de la vitesse demandée d’un certain pourcentage, mais lorsque la déviation reste dans une certaine tolérance, alors les communications vont s’effectuer, sachant que la limite usuelle de déviation possible pour que la communication s’effectue est de 3 %. La datasheet du microcontrôleur (ou de l’émetteur-récepteur) peut être utilisée pour calculer les vitesses exactes possibles (et donc le pourcentage de déviation pour les autres vitesses).
Auto-ajustement de la vitesse
Certains systèmes supportent l’autobauding, ou le récepteur va automatiquement détecter la vitesse après avoir analysé quelques données reçues. Ceci est fait en mesurant la largeur de la plus petite impulsion dans les données. Par exemple, si la plus petite impulsion à une largeur de 8.86µs, alors la vitesse est de 115200bps.
Contrôle de flux
Le protocole peut aussi avoir des liens supplémentaires liés au contrôle du flux, qui indique au transmetteur quand le récepteur est occupé et ne peut pas immédiatement recevoir de nouvelles données. Ceci peut être très utile, par exemple, dans le cadre d’un module radio (par ex. Bluetooth) qui prend les données reçues en UART et les transmet dans l’air et que le débit air est moins important de la vitesse sur la ligne UART (même temporairement si les voies de données sont congestionnées par d’autres trafics). Les lignes de contrôle de flux, sont appelées Demande d’envoi (Request to Send) (RTS) et Autorisé à envoyer (Clear to Send) (CTS). La connexion RTS est connecté à la connexion CTS de l’autre émetteur-récepteur et vice versa. L’émetteur-récepteur qui souhaite transmettre surveille la ligne CTS de l’autre émetteur-récepteur (connecté à la broche RTS du premier émetteur-récepteur), qui tire la ligne CTS haute quand il est prêt à recevoir des données.
Variations de protocole
De loin, la variation la plus utilisée du protocole UART est 8N1 qui veut dire :
- 8 bits de données ;
- Pas de bits de parité ;
- 1 bit d’arrêt ;
Le nombre de bits de données peut varier de 5 à 9 (même si la majorité des UART des microcontrôleurs supportent uniquement 8 ou 9 bits). Quand un neuvième bit est utilisé, c’est souvent pour indiquer si la trame contient des données ou un message de contrôle.
Avoir deux bits d’arrêt permet un contrôle d’erreur supplémentaire sur la trame (si les deux bits de stop sont absents, alors il y a une erreur).
La Parité est une autre forme de contrôle d’erreur ou un bit additionnel est défini selon que le nombre de 1 dans la trame est pair ou impair. Par exemple: pour la parité paire, si le nombre de 1 dans les données est 3 ainsi le bit de parité sera défini pour que le nombre de 1 dans la trame soit 4 (pair). Pour la parité impaire, si le nombre de 1 dans les données est de 4 alors le bit de parité sera défini à 1 pour que le nombre de 1 dans la trame soit de 5 (impair).
Vous trouverez de nombreux exemples de différentes simulations UART dans notre portfolio d’exemples. Vous pouvez aussi mettre en place des tests grâce au modèle terminal RS232 (TTY) associé à un microprocesseur dans Proteus.
A présent nos deux pics sont à 3.5V et nos creux à 1.5V, ce qui nous donne toujours une amplitude pic à pic de 2V (donc un gain de x2).
Erreur de protocole
Différentes erreurs de protocole peuvent apparaître, quand le signal ne conforme pas au standard UART, et un nombre important de microcontrôleurs ont intégré de quoi détecter et remonter ces erreurs. Des erreurs peuvent survenir à cause d’interférence sur la ligne de communication, par ex. des interférences électro-magnétiques (IEM), des paramétrages incorrects de protocole ou vitesses (bauds) non identiques.
- Erreur de tramage : le(s) bit(s) de stop ne sont pas détectés à la position attendue
- Erreur de parité : la parité est incorrecte ;
- Erreur de bruit : des transitions (impulsions) ont été détectées, sur la ligne, qui sont plus courtes que le baud rate. Certains microcontrôleurs ont une fonctionnalité de sur-échantillonnage qui lit la ligne UART plus d’une fois par bit, et cette fonctionnalité est utilisée pour détecter du bruit.
Câblage
Une erreur très commune (et très facile à faire) est de ne pas câbler la communication correctement. Il est important de se rappeler que le RX d’un côté va dans le TX de l’autre côté et vice-versa. La même chose s’applique aux lignes de contrôle de flux, RTS d’un côté relié à CTS de l’autre côté et vice-versa. Pour rendre ça plus compliqué, certains fabricants nomment les pins de leurs périphériques pour une connexion sur l’hôte ! Ces périphériques doivent donc avoir le RX de l’hôte câblé sur le RX du périphérique (et ainsi de suite). C’est toujours une excellente idée de vérifier le câblage UART avec la datasheet du périphérique. Par exemple, ici un extrait de la datasheet d’un module GSM ou les pins sont nommés depuis le point de vue du module :
Ici un autre extrait de datasheet d’un module GSM qui a les broches nommées relativement à l’hôte.
Le schéma de nommage SPI de MISO (Master-In-Slave-Out) (Hôte-entrée-Périphérique-sortie) / MOSI (Master-Out-Slave-In) (Hôte-sortie-Périphérique-entrée) est beaucoup mieux pour éviter ces erreurs bêtes (et coûteuses), cependant cela ne s’applique pas à l’UART. Quand vous faites votre schéma il peut être utile de nommer les liens avec précision (comme Bluetooth_TX) pour éviter les erreurs.
Couche physique
Les communications UART peuvent intervenir sur différents schémas hardware. Lies liaisons TTL, RS232 et RS485 en font partie :
- TTL veut dire Transistor to Transistor Logic (voir notre article sur les signaux analogiques et digitaux) et est utilisable pour des communications de courte distance. Le niveau haut est usuellement 5V ou 3.3V et bas 0V.
- RS232 était très commun sur les ordinateurs, mais a été remplacé par l’USB. Le niveau haut se situe entre -3V et -15V et le niveau bas entre 3V et 15V. RS232 ayant été remplacé par l’USB, des convertisseurs USB-série sont très communs (comme le FT32 par ex.) qui se présente en port COM virtuel sur le PC.
- RS485 est une implémentation en paires différentielles, qui offre une meilleure immunité aux interférences électromagnétiques (IEM), et autorise une communication sur de plus grandes distances. Voir notre article sur la conception haute vitesse pour plus d’information sur les paires différentielles.
Conclusion
Même si c’est un des premiers protocoles de communication à avoir été développé, l’UART est toujours aussi pertinent et populaire de nos jours. Comprendre ce protocole permet de d’appréhender son implémentation dans les applications et savoir déboguer un souci (avec un oscilloscope par ex.). Proteus intègre un terminal virtuel ainsi qu’un oscilloscope pour fonctionner en simulation UART, en plus de la grande sélection de composants UART présents dans les bibliothèques de composants.
Copyright Labcenter Electronics Ltd. 2024
Traduction française
Copyright Multipower France 2024