22 janvier 2025

USART/UART

L’USART est un terme qui signifie « Universal Synchronous/Asynchronous Receiver/Transmitter« , à ne pas confondre avec UART, qui lui ne possède pas de fil pour synchroniser les horloges, il veut dire la même chose mais sans le « Synchronous« . L’horloge d’un UART est alors interne, et la synchronisation se fait à l’aide du bit de start de la trame envoyée et du réglage du baudrate. Seules les données sont envoyées, pas d’horloge.
Cependant, il faut régler le baudrate dans nos différents périphériques pour qu’ils puissent communiqué correctement. Un baudrate est une unité qui définit le nombre de symboles par secondes, dans notre cas, un symbole est un bit. Donc le baudrate est directement le nombre de bits par seconde.

Format de la trame

Une trame (ou frame, en anglais) est une série de bit composant :

  • Un bit de start
  • un certain nombre de bit de donnée
  • la présence ou non d’un bit de parité (pair ou impaire)
  • Un ou plusieurs bit de stop

Celle-ci circulera dans notre communication série grâce à l’USART.

Dans le cas de l’Atmega 328p, nous pouvons avoir 1 bit de start, de 5 à 9 bits de données, un bit de parité (ou non), et 1 ou 2 bits de stop. Nous voyons le format d’une trame ci-dessous :

Configuration de notre UART/USART

Dans notre Atmega328p, nous pouvons fonctionner dans ces deux modes, synchronisé ou non. Nous allons aborder plus particulièrement le cas du mode asynchrone, et nous avons un seul USART, le « USART0 », la suite utilisera donc ce registre.
Pour configurer notre communication, série, nous devons :

  • Paramétrer le baudrate
  • Configurer le format de la trame (Parité, taille des données, bit de stop)
  • Activer la transmission et/ou la réception

Et selon si on utilise une interruption :

  • Activer l’interruption sur la réception (ou transmission) de donnée

Paramétrage du baudrate

Nous avons deux modes de fonctionnement, soit en mode « rapide » (appelé double speed mode) soit en mode « normal ».
Le mode rapide est activable en mettant à 1 le bit U2Xn (U2X0 dans notre cas car on utilise USART0) du registre UCSRnA (Registre USART Control and Status Register n A, on remplacera n par 0 donc car USART0).

La conséquence d’activer le mode rapide est que le diviseur du baudrate passe de 16 à 8.
Mais pour le moment restons en mode « normal ».

Le registre qui permet de configurer le baudrate est « UBRR », un registre de 12 bits composant d’un registre de 8bits et 4 bits comme ci-dessous:

Nous devons alors trouver une valeur de UBRR qui correspond au baud souhaité.
Prenons le cas où nous avons un Atmega328p avec une horloge utilisée de 16MHz, nous sommes dans le mode normal (U2X0 = 0) et nous voulons un Baud Rate de 115200.
La Datasheet du µC (microcontrôleur) nous permet de trouver la valeur qui convient d’utiliser.

La valeur d’UBRR est 8, nous devons alors écrire dans notre programme avec l’USART0:
UBRR0 = 8;

Paramétrage de la trame

Dans un premier temps, nous devons configurer la taille de la donnée, par défaut on préférera une donnée de 8 bits qui correspond à 1 octet et aussi à un caractère ASCII, ce qui est assez agréable à utiliser.

Pour cela, nous allons devoir changer les bits « UCSZn » (UCSZ0, UART Character Size) du registre « UCSRnC » (donc UCSR0C ici).
Toujours dans la datasheet, nous avons ce tableau qui décrit comment configurer ces bits :

Donc pour configurer l ‘USART0 avec des données de 8 bits, il faut placé à 1 les bits UCSZ01 et UCSZ00 dans le registre UCSR0C :

Après avoir configurer la taille de donnée, il faut configuré la parité et le nombre de bit de stop, si on ne le fait pas, par défaut cela est à 1 bit de stop et il n’y a pas de bit de parité.

Bit de stop

Même principe que pour la configuration de la taille de la donnée mais avec le bit USBSn du registre UCSRnC.

Donc pour l’USART0, si l’on souhaite mettre 2 bits de parités, il faut mettre à 1 le bit USBS0 du registre UCSR0C.

Bit de parité

Exactement la même chose ici que pour précédemment, avec exactement le même registre, pas besoin d’explication.

Activation de la réception et/ou transmission

Pour activer cela, nous avons besoin de mettre le bit TXENn et/ou RXENn dans le registre UCSRnB (EN comme Enable)
Donc pour activer la transmission et la réception de l’USART0, je place les bits TXEN0 et RXEN0 à 1 pour le registre UCSR0B.

Ensuite, nous utiliserons le registre UDRn (USART I/O Data Register n) qui permet d’envoyer ou recevoir une donnée.

Comme sur le tableau ci-dessus, lorsque nous utilisons la transmission et la réception, lorsqu’on écrit dans le registre UDRn, c’est le « sous »-registre (appelé Buffer) TXB qui enregistrera l’information. Et quand nous lirons UDRn, ce sera le buffer RXB qui sera lu. De ce fait, lorsque le microcontrôleur enverra sa trame, il utilisera TXB, et quand il recevra une trame, la donnée sera placée dans RXB.

Gestion des interruptions

La gestion des interruptions permet d’avoir une interruption lorsqu’une donnée est reçu complètement ou transmise complètement. Lorsqu’il y a gestion de la parité, s’il y a une erreur, une donnée ne sera pas considérer comme complète et donc il n’y aura pas d’interruption.
Chaque interruption permettra alors par exemple de lire la donnée reçu et l’exploiter tout de suite.

Pour activer l’interruption à la réception : RXCIEn (RX Complete Interrupt Enable n)
Pour activer à la transmission : TXCIEn (TX Complete Interrupt Enable n)
Ces deux bits font partie du registre UCSRnB.

Avec les précédents exemples, vous comprenez donc comment régler les interruptions

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *