Interface logicielle (API) - Driver UART
Présentation
#include "drivers/serial.h"
Le driver "serial" donne accès aux périphériques UART (Universal Asynchronous Receiver and Transceiver) ou USART (Universal Synchronous or Asynchronous Receiver and Transceiver).
Lorsque le micro-contrôleur inclue plusieurs liaisons séries le fichier d'entête fournit plusieurs définitions permettant d'indiquer la liaison série à utiliser lors des appels aux différentes fonctions :
- UART0
- UART1
- UART2
- UART3
- ....
Configuration
int uart_on(uint32_t uart_num, uint32_t baudrate, void (*rx_callback)(uint8_t)); void uart_off(uint32_t uart_num);
La fonction uart_on() permet de configurer une des liaisons série dans le mode de fonctionnement par défaut : mode UART, 8 bits de donnée, pas de parité, un bit de stop, soit (LPC_UART_8BIT | LPC_UART_NO_PAR | LPC_UART_1STOP), aussi noté "8n1".
Le paramètre 'baudrate' sert à spécifier le baudrate (la vitesse de transmission des motifs utilisés pour la communication sur le bus série. Il faut dix motifs pour faire un octet avec la configuration par défaut (8n1)). Attention, tous les baudrate ne sont pas systématiquement supportés. La configuration des horloges est faite de telle manière que le baudrate "115200" soit tout le temps disponible.
Si il n'est pas NULL, le paramètre 'rx_callback' correspond à la fonction qui sera appelée lors de la réception d'un caractère par la routine d'interruption de la liaison série correspondante. Voir les détails plus bas dans la section "Utilisation : Réception".
La fonction uart_on() renvoie -EINVAL si le numéro de liaison série n'est pas valide ou que le baudrate demandé n'est pas supporté. La fonction renvoie 0 si la liaison série a pu être configurée et démarrée.
La fonction uart_off() permet de couper une liaison série en désactivant l'interruption et supprimant l'horloge et l'alimentation du sous-système correspondant. Le callback est aussi supprimé. La configuration modifiée à l'aide de la fonction uart_set_config() sera réutilisée lors du prochain appel à la fonction uart_on().
int uart_set_config(uint8_t uart_num, uint32_t config);
La fonction uart_set_config() permet de modifier la configuration de la liaison série avant un appel à la fonction uart_on().
Cette configuration concerne principalement le mode de fonctionnement (UART, USART) et le format des trames composant un octet (nombre de bits de donnée, de stop, et parité).
Pour sélectionner les modes RS485 ou IRDA quand ils sont supportés, utilisez les fonctions uart_set_mode_rs485() et uart_set_mode_irda().
Le paramètre 'config' est un masque créé à partir des configurations suivantes :
- Nombre de bits de donnée : LPC_UART_7BIT - LPC_UART_8BIT - LPC_UART_9BIT
- Type de parité : LPC_UART_NO_PAR - LPC_UART_EVEN_PAR - LPC_UART_ODD_PAR
- Nombre de bits de stop : LPC_UART_1STOP - LPC_UART_2STOP
- Activation du signal CTS : LPC_UART_CTS_EN
- Activation du mode de test "loopback" : LPC_UART_LOOPBACK
Modes de fonctionnement / Capabilities
- SERIAL_CAP_UART
- SERIAL_CAP_RS485
- SERIAL_CAP_IRDA
UART
Le mode de fonctionnement "UART" est le mode de fonctionnement par défaut.
USART
Actuellement non supporté. Support à faire.
RS485
int uart_set_mode_rs485(uint32_t uart_num, uint32_t control, uint8_t addr, uint8_t delay);
Certaines liaisons séries de certains micro-contrôleurs peuvent être utilisées en mode RS485.
Le fichier d'entête "drivers/serial.h" définit la macro LPC_RS485_ADDR(x) pour le paramètre 'addr'.
IRDA
int uart_set_mode_irda(uint32_t uart_num, uint32_t control, uint16_t pulse_width);
Certaines liaisons séries de certains micro-contrôleurs peuvent être utilisées en mode IRDA.
Utilisation : Transmission
Taille du buffer en émission :
#define SERIAL_OUT_BUFF_SIZE 96
Le fichier d'entête "drivers/serial.h" définit al taille du buffer d'émission.
int serial_write(uint32_t uart_num, const char *buf, uint32_t length);
La fonction serial_write() permet de déclencher le début de l'émission de 'length' caractères contenus dans le buffer 'buf' sur la liaison série 'uart_num'.
La fonction renvoie -EINVAL si 'uart_num' ne correspond pas à une liaison série existante, ou -EBUSY si un appel à la fonction serial_write() est déjà en cours.
La fonction serial_write() réalise une copie de au plus SERIAL_OUT_BUFF_SIZE octets dans le buffer interne du driver correspondant à la liaison série sélectionnée. Si une émission est en cours, la fonction attends la fin de l'émission avant de réaliser la copie du buffer. Le buffer passé en paramètre peut donc être ré-utilisé dès le retour de la fonction serial_write().
La fonction serial_write() renvoie le nombre de caractère copiés dans le buffer interne de la liaison série sélectionnée.
int serial_flush(uint32_t uart_num);
La fonction renvoie -EINVAL si 'uart_num' ne correspond pas à une liaison série existante, ou 0 une fois que le buffer interne de la liaison série sélectionnée est à nouveau disponible.
int serial_send_quickbyte(uint32_t uart_num, uint8_t data);
Si la liaison série 'uart_num' n'est pas en cours d'envoi du contenu de son buffer interne cette fonction envoie la donnée 'data' sur cette liaison série et renvoie 0.
Si la liaison série est entrain de transmettre des données la fonction serial_send_quickbyte() renvoie -EBUSY et la donnée 'data' n'est pas transmise.
Utilisation : Réception
La réception se fait par l'enregistrement d'une fonction de rappel (callback) lors de l'appel à la fonction uart_on() en utilisant le paramètre 'rx_callback'.
void (*rx_callback)(uint8_t)
Ce "callback" correspond à la fonction qui sera appelée lors de la réception d'un caractère par la routine d'interruption de la liaison série correspondante.
Attention, lors de cet appel le micro-contrôleur sera en mode "interruption", le traitement doit donc être le plus court possible (enregistrer le caractère reçu dans un buffer et mettre à jour un indice par exemple).
La fonction de callback reçoit en paramètre le caractère reçu sur la liaison série.
Lorsqu'il n'y a pas de callback enregistré, les caractères reçus sont retransmis automatiquement (echo), sauf si une transmission est en cours.
Spécificités par micro-contrôleur
LPC82x
- Nombre de liaisons séries : 3
- Modes de fonctionnement : UART (all), Synchronous UART (all), RS485 (all)
- Contrôle de modem RTS et CTS (all)
LPC11A04
- Nombre de liaisons séries : 1
- Modes de fonctionnement : UART
LPC122x
- Nombre de liaisons séries : 2
- Modes de fonctionnement : UART (all), RS485 (UART0 seulement), IRDA (UART1 seulement)
- Contrôle de modem complet sur UART0 seulement : RTS, DTR, DSR, CTS, DCD et RI
LPC176x
- Nombre de liaisons séries : 4
- Modes de fonctionnement : UART