Liaisons UART du Raspberry Pi (2022)

12 juin 2022

Avoir un PC embarqué c’est bien, pouvoir communiquer facilement avec les microcontrôleurs de l’électronique, c’est mieux !

Pour cela, le Raspberry Pi propose plusieurs protocoles de communication :

Nous pourrions reprocher à l’I2C et au SPI de ne pas permettre de communications asynchrones. C’est en partie pour cela quoi nous nous sommes intéressés à l’UART.

Si ces trois protocoles sont des protocoles de communication de type série, l’UART est souvent considéré comme LE protocole série. C’est l’un des protocoles de type série les plus simples.

 Type d’UART

Sur le Raspberry Pi (la carte), il y a deux types de liaisons UART :

  • PL011
  • Mini UART

Le PL011 est un UART complet, tandis que le mini UART est limité sur plusieurs points. Les plus importants c’est que la vitesse du mini UART est liée à celle du processeur. Il faut donc figer celle-ci pour se servir du mini-UART.

Pour plus d’information sur le mini UART, la référence est la fiche technique des périphériques du BCM2835 ARM, §2.2 en page 10.


Mini UART - Extrait

 Assignation des broches

L’un des UARTs est relié au connecteur GPIO. Cet UART est nommé UART primaire (primary - dans la documentation). Ça peut être un PL011 ou un Mini UART en fonction du modèle de votre carte.

L’autre UART est relié au module Bluetooth, en fonction des modèles de Raspberry Pi.

Il est possible d’inverser ces deux UARTs en fonction de vos besoins.

Ces UARTs peuvent être assignés à différentes broches du processeur, mais seules les broches 14 et 15 sont reliées au connecteur GPIO (aux broches 8 et 10).

Model PL011 mini UART
Raspberry Pi Zero Primaire Secondaire
Raspberry Pi Zero W Secondaire (Bluetooth) Primaire
Raspberry Pi 1 Primaire Secondaire
Raspberry Pi 2 Primaire Secondaire
Raspberry Pi 3 Secondaire (Bluetooth) Primaire
Compute module 3 et + Primaire Secondaire
Raspberry Pi 4 Secondaire (Bluetooth) Primaire

Attention : Le mini-UART est désactivé par défaut, qu’il soit en primaire ou en secondaire

 Les fichiers d’accès

Raspberry Pi OS essaie de vous simplifier la tâche, en appliquant ces deux conventions.

En fonction des "capacités" de l’UART :

Fichier Description
/dev/ttyS0 mini UART
/dev/ttyAMA0 PL011 (UART0)

En fonction des broches :

Fichier Description
/dev/serial0 Primaire
/dev/serial1 Secondaire

Donc si vous voulez accéder à l’UART sur le port GPIO, en toute logique vous devriez utiliser /dev/serial0.

 Sur le Raspberry Pi Zero W

Et comme sur le Raspberry Pi 3 et 4, le PL011 est affecté au Bluetooth. Pour utiliser l’UART, deux options :

  1. Désactiver le bluetooth et récupérer PL011 en UART primaire, ceci en ajoutant dtoverlay=disable-bt dans /boot/config.txt.
  2. Activer le mini-UART, ceci en ajoutant enable_uart=1 dans /boot/config.txt.

L’activation du mini-UART figera la fréquence du processeur, soit à 250 Mh, soit en "turbo" si vous ajoutez force_turbo=1 dans /boot/config.txt.

 Confiscation par le noyau

L’UART primaire, celui sur GPIO, est accaparé par le noyau pour offrir un terminal par la liaison série. Au choix, soit vous passez par sudo raspi-config, soit vous éditez directement le fichier /boot/cmdline.txt.

/boot/cmdline.txt Avant : console=serial0,115200 console=tty1 root=PARTUUID=ac01d331-02 rootfstype=ext4 fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles Après : console=tty1 root=PARTUUID=ac01d331-02 rootfstype=ext4 fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles

 Configuration de la liaison UART

Maintenant, vous êtes sur de la configuration Linux standard.

Obtenez la configuration actuelle de votre liaison série avec :

Terminal
stty -F /dev/serial0 -a

Pour comprendre précisément la configuration, la page man de stty vous sera bien utile. Nous utilisons la commande suivante pour avoir une configuration fonctionnelle.

Terminal
sudo stty -F /dev/serial0 115200 cs8 -cstopb -onlcr -echo -echoe -echok -opost

Vous pouvez changer 115200 par la vitesse souhaitée de votre liaison série.

 Utilisation

Sous Linux, "tout est fichier". L’envoi ou la réception de données sur le RPi se fait en lisant ou en écrivant dans /dev/serial0. En C, nous utiliserons par exemple fopen, fprintf et fget, tandis qu’en bash, nous utiliserons les commandes suivantes. Pour la réception des données du port série :

Terminal
cat /dev/serial0

Pour l’émission de données sur le port série :

Terminal
echo -e -n "Bonjour\x00" > /dev/serial0

Pour la commande echo, nous utilisons les options suivantes :

  • -e Demande à la fonction echo d’interpréter les caractère spéciaux, ce qui transformera notre ’\x00’ en caractère de fin de chaîne.
  • -n Demande à la fonction echo de ne pas générer automatiquement de retour à la ligne.

 Des problèmes de droits ?

Si vous obtenez un message du type "Permission non accordée", vérifier les droits du fichier.

Terminal

# ls -l /dev/serial0
crw-rw---- 1 root dialout 4, 64 juin  11 08:44 /dev/ttyS0

Ajoutez votre utilisateur au groupe auquel appartient le fichier, dialout dans l’exemple.

Terminal
# sudo addgroup $USER dialout

Note : Une grande partie de l’article se base sur la documentation du Raspberry Pi, notamment la partie sur l’UART.

Commentaires

Il n'y a pas de commentaires

Ajouter un commentaire

Pseudo :
Mail :

Texte :

Copyright "POIVRON" 2011-2023, tous droits réservés
Administration du site