Liaison série
Pile
3/10/2019
Définition
Une liaison série est un dispositif permettant la mise en communication de deux équipements par le biais de liaisons électriques sur lesquels circulent des données sérialisées.
Il existe de nombreux types de liaison série:
- liaison RS232
- liaison RS485
- liaison I2C
- liaison SPI
- ethernet
- bluetooth
Inversement une liaison parallèle utilise autant de liaisons électriques que de données élémentaires, très souvent on va avoir 8 liaisons électriques pour la largeur d'une donnée.
L'usage de la liaison série se généralise car elle permet de diminuer le coûts des liaisons en diminuant le nombre de fils nécessaire et en utilisant des dispositifs électroniques spécialisés permettant d'alléger la tâche des processeurs. Un de ces dispositifs est l'UART ("Universal Asynchronous Receiver Transceiver") qui est étudié ici.
Les liaisons parallèles entres équipements matériels sont moins utilisés mais restent majoritaires dans les processeurs avec l'utilisation des bus.
Fonctionnement
Ce qui caractérise la liaison série est donc l'émission les uns à la suite des autres des bits de chacun des octets transmis par l'émetteur; et la reconstitution de ces mêmes données à partir du flot de signaux électriques élémentaires par le récepteur.
Le flot de signaux électriques émis en bloc est appelé une trame.
Pour que cela fonctionne il faut que l'émetteur et le récepteur se soit mis "d'accord" sur la manière d'envoyer les données, les différentes étapes d'un échange et ce qui doit être fait en cas d'anomalie; tout cela est défini dans le protocole.
A un instant T, le dispositif UART peut émettre une trame sur la ligne d'émission et en recevoir une autre trame sur la ligne de réception. Une liaison série est composée de deux liaisons physiques, une dans chaque sens.
Un équipement émet toujours sur la ligne d'émission (Tx) et reçoit toujours sur la ligne de réception (Rx). Si le support physique permet d'émettre et de recevoir en même temps comme ci-dessus (par exemple avec 3 fils), c'est le mode full duplex.
[/doc/19/10/pYvhq@bv.svg]
Pour certains protocoles (exemple RS485), on peut réduire la liaison à deux fils seulement, mais le protocole impose alors à ce que chacun émette à son tour (mode half-duplex).
Constituants d'un dispositif UART
Un dispositif de liaison série ou UART est un ensemble de composants électroniques permettant d'émettre sur une ligne (Tx) des données sérialisées et de recevoir sur une autre ligne (Rx) des données sérialisées.
Les données émises sont écrites par le processeur dans un registre de transmission (Transmit Data Register -TDR) et les données lues dans le registre de réception (Receive Data Register - RDR). Le dispositif est paramétré avant toute utilisation par l'intermédiaire de registres de contrôle (CR1, ... CR6). L'état courant de la liaison est lu dans le registre de statut ( Status Register - SR).
Trames
Les données émises par un dispositif sont conçus pour pouvoir être détectées par le dispositif récepteur.
Les principes mis en œuvre sont les suivants:
- Lorsque aucune donnée n'est transmise, la ligne est mise dans un état inactif ( niveau haut en TTL),
- Lorsqu’une donnée est à transmettre, l’émetteur émet d'abord un bit de démarrage (Start Bit toujours à 0),
- La suite de bits ( 8 ou 9) composant la donnée (le bit le moins significatif en premier),
- Des bits d’arrêt de longueur 1, 1,5 ou 2 (Stop bits toujours à 1),
- La durée d'un bit est défini par le débit de la ligne; à 9600 bauds on une durée de 104µs (1/ 9600).
===Émission=== ====Émission d'un seul octet==== Pour transmettre un seul octet, le programme écrit l'octet dans le registre de transmission (Transmit Data Register - TDR). Lors de l'envoi effectif (Transmit ENable (TEN) doit être à 1), le bit start (0), la donnée à transmettre et le bit stop (1) sont copiés vers le registre de sérialisation ( Transmit Shift Register - TSR). Une horloge paramétrée (cf.CRx) génère les signaux qui vont cadencer les décalages du registre TSR. A chaque décalage le bit de sortie du TSR définit la ligne de sortie et un bit à 0 est introduit à l'entrée du TSR. Lorsque tous les bits ont été transmis y compris le bit de stop (toujours à 1), le registre de sérialisation ne contient que des bits de remplissage à zéro; il suffit de faire un NAND de ces 10 bits pour savoir que la transmission est terminée. Le dispositif met alors le drapeau TC à 1. ====Émission d'une trame==== Il est rare que l'on transmette un seul octet, en général on émet une trame composée de n octets. Chaque octet est émis l'un après l'autre en continu afin de faciliter la lecture par le receveur.
Le principe est que le processeur peut charger le TDR avec un octet quand le dispositif a déjà transféré l'octet précédent dans le TSR, un drapeau particulier TXE indique au processeur quand il peut charger le TDR sans écraser l'octet précédent en attente d'émission.
| Processeur | UART | TXE | TCE |
|---|---|---|---|
| met TEN à 1 | attend TXE à 0 | 1 | 0 |
| écrit premier octet dans TRD (TXE↘) | 0 | 0 | |
| attend TXE à 1 | transfert de TRD vers TSR (TXE↗) | 1 | 0 |
| écrit deuxième octet dans TRD (TXE↘) | sérialise TSR | 0 | 0 |
| attend TXE à 1 | sérialise TSR | 0 | 0 |
| attend TXE à 1 | a fini de sérialiser, test TXE | 0 | 0 |
| attend TXE à 1 | TXE est à 0 alors transfert de TRD vers TSR (TXE↗) | 1 | 0 |
| écrit troisième octet dans TRD (TXE↘) | sérialise TSR | 0 | 0 |
| attend TC à 1 | a fini de sérialiser, test TXE | 0 | |
| attend TC à 1 | TXE est à 0 alors transfert de TRD vers TSR (TXE↗) | 1 | 0 |
| attend TC à 1 | sérialise TSR | 1 | 0 |
| attend TC à 1 | a fini de sérialiser, test TXE | 1 | 0 |
| attend TC à 1 | TXE est à 1 alors indique la fin de trame (TC↗) | 1 | 1 |
| Transmission terminée (TEN↘) |
Ce genre de synchronisation entre deux dispositifs indépendants est très courant en informatique, la possibilité d'utiliser une ressource, ici le registre TRD, est gérée par un drapeau ici le bit TXE levé par un dispositif et rabaissé par l'autre, c'est une forme de poignée de main.
Réception
Une réception ne peut être sûre que si l'émetteur et le récepteur utilise le même débit, la même taille de donnée et la même parité. Suivant la tolérance du receveur le même nombre de bit stop est requis.
Le principe de base est que le dispositif de réception ne sait pas quand va arriver le début d'une trame, et donc il observe la ligne d'entrée en permanence à une fréquence multiple de la fréquence de la liaison série ( 3x9600 = 2880Hz) afin d'être certain de reconnaître le start bit et de "caler une horloge" qui cadencera le registre de décalage d'entrée.
Une fois que le bit start, les bits de données et le bit stop ont été introduits dans le registre de décalage, l'UART peut écrire la donnée correspondantes dans le registre d'entrée (Read Data Register - RDR). A partir de ce moment cette donnée est disponible pour le processeur.
| Processeur | UART | RXNE |
|---|---|---|
| met REN à 1 et RXNE à 0 | attend l'arrivée d'une trame | 0 |
| attend RXNE à 1 | sérialise une trame | 0 |
| attend RXNE à 1 | a fini de sérialiser la trame entrante | 0 |
| si RXNE == 0 alors lève une erreur de débordement | ||
| si d'autres erreurs ont été détectées, lève l'erreur correspondante (frame, noise) | ||
| range la donnée dans RDR (RXNE↗) | 1 | |
| si RIEN est activé alors lève une interruption | ||
| Lit RDR (RXNE↘) et range la donnée en mémoire | attend l'arrivée d'une trame | 0 |
On répète autant de fois que d'octets attendus et à la fin le processeur met REN à zéro, ce qui arrête la scrutation de la ligne entrante par l'UART.
La aussi un mécanisme de synchronisation assure qu'une donnée reçue sur la ligne d'entrée n'est pas perdue, ce mécanisme repose sur le drapeau RXNE.
Les registres du UART2
L'UART2 comporte 7 registres décrits en détail dans les documents duc constructeur (RM0016), nous décrivons ici les plus importants.
UART_SR - Status Register
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|
| TXE | TC | RXNE | IDLE | OR/LHE | NF | FE | PE |
| r | rc_w0 | rc_w0 | r | r | r | r | r |
TXE: Transmit data register empty
Ce drapeau est levé par le dispositif quand le contenu de TDR est transféré dans le registre à décalage sortant. Une interruption est alors levée si TIEN=1 dans CR2.
Ce drapeau est rabaissé par une écriture du processeur dans le UART_DR.
TC: Transmission complete
This bit is set by hardware if the transmission of a frame containing data is complete and TXE bit is set. An interrupt is generated if TCIEN=1 in the UART_CR2 register.
The TC bit is cleared either by a software sequence (a read to the UART_SR register followed by a write to the UART_DR register), or by programming the bit to ‘0’. This clear sequence is recommended only for multibuffer communications.0: Transmission is not complete1: Transmission is complete
RXNE: Read data register not empty
This bit is set by hardware when the content of the RDR shift register has been transferred to the UART_DR register. An interrupt is generated if RIEN=1 in the UART_CR2 register. It is cleared by a read to the UART_DR register. In UART2 and UART3, it can also be cleared by writing 0.0: Data is not received1: Received data is ready to be read
OR: Overrun error
This bit is set by hardware when the word currently being received in the shift register is ready to be transferred into the RDR register while RXNE=1. An interrupt is generated if RIEN=1 in the UART_CR2 register.
It is cleared by a software sequence (a read to the UART_SR register followed by a read to the UART_DR register).
0: No Overrun error 1: Overrun error is detected
NF: Noise flag
This bit is set by hardware when noise is detected on a received frame. It is cleared by a software sequence (a read to the UART_SR register followed by a read to the UART_DR register).0: No noise is detected1: Noise is detected
FE: Framing error
PE: Parity error
UART_DR - Data register
| 7 6 5 4 3 2 1 0 |
|---|
| DR |
| rw |
DR[7:0]: Data value
Contains the Received or Transmitted data character, depending on whether it is read from or written to.
The Data register performs a double function (read and write) since it is composed of two registers, one for transmission (TDR) and one for reception (RDR)
- The TDR register provides the parallel interface between the internal bus and the output shift register.
- The RDR register provides the parallel interface between the input shift register and the internal bus
UART_BRR1 et UART_BRR2
UART_BRR1
| 7 6 5 4 3 2 1 0 |
|---|
| UART_DIV[11:4] |
| rw |
UART_BRR2
| 7 6 5 4 | 3 2 1 0 |
|---|---|
| UART_DIV[15:12] | UART_DIV[3:0] |
| rw | rw |
L'émetteur et le récepteur utilise la même fréquence de signaux. La formule qui détermine le débit exprimé en bauds est la suivante.
Pour rappel le Baud (Bd) est l'unité de rapidité de modulation d'un signal; la rapidité de modulation d'un signal, exprimée avec cette unité, est égale à l'inverse de la durée en secondes du plus court élément du signal. Dans le cas où le signal a deux états ( 0 et 1) le baud équivaut au nombre de bits par seconde.
Pour des raisons de compatibilité entre génération de micro-contrôleurs, la définition du débit de la liaison UART est complexe, on enregistre dans deux registres le diviseur de la fréquence de référence (UART_DIV).
UART_BRR1 = UART_DIV[11:4] UART_BRR2 = UART_DIV[15:12]<<4 | UAR_DIV[3:0]
IL est plus simple de se référer à une table définie dans le manuel du constructeur, pour les débits courants de liaisons série.
| Débit (Bd) | UART_DIV | BRR1 | BRR2 |
|---|---|---|---|
| 9600 | 0x0412 | 0x41 | 0x02 |
| 115 200 | 0x0057 | 0x05 | 0x07 |
UART-CR1
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|
| R8 | T8 | UARTD | M | WAKE | PCEN | PS | PIEN |
| rw | rw | rw | rw | rw | rw | rw | rw |
R8: Receive Data bit 8
This bit is used to store the 9th bit of the received word when M=1
T8: Transmit data bit 8
This bit is used to store the 9th bit of the transmitted word when M=1
UARTD: UART Disable (for low power consumption)
When this bit is set the UART prescaler and outputs are stopped at the end of the current byte transfer in order to reduce power consumption. This bit is set and cleared by software.
- 0: UART enabled
- 1: UART prescaler and outputs disabled M: word length This bit determines the word length. It is set or cleared by software.
- 0: 1 Start bit, 8 Data bits, n Stop bit (n depending on STOP[1:0] bits in the UART_CR3 register)
- 1: 1 Start bit, 9 Data bits, 1 Stop bit
Note: The M bit must not be modified during a data transfer (both transmission and reception)
WAKE: Wakeup method
This bit determines the UART wakeup method, it is set or cleared by software.
- 0: Idle Line
- 1: Address Mark
PCEN: Parity control enable
This bit selects the hardware parity control (generation and detection). When the parity control is enabled, the computed parity is inserted at the MSB position (9th bit if M=1; 8th bit if M=0) and parity is checked on the received data. This bit is set and cleared by software. Once it is set, PCEN is active after the current byte (in reception and in transmission).
PS: Parity selection
This bit selects the odd or even parity when the parity generation/detection is enabled (PCEN bit set) in UART mode. It is set and cleared by software. The parity will be selected after the current byte.
- 0: Even parity
- 1: Odd parity
PIEN: Parity interrupt enable
This bit is set and cleared by software.
- 0: Parity interrupt disabled
- 1: Parity interrupt is generated whenever PE=1 in the UART_SR register
UART_CR2
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|
| TIEN | TCIEN | RIEN | ILIEN | TEN | REN | RWU | SBK |
| rw | rw | rw | rw | rw | rw | rw | rw |
TIEN: Transmitter interrupt enable
This bit is set and cleared by software.
- 0: Interrupt is inhibited
- 1: An UART interrupt is generated whenever TXE=1 in the UART_SR register
TCIEN: Transmission complete interrupt enable
This bit is set and cleared by software.
- 0: Interrupt is inhibited
- 1: An UART interrupt is generated whenever TC=1 in the UART_SR register
RIEN: Receiver interrupt enable
This bit is set and cleared by software.
- 0: Interrupt is inhibited
- 1: An UART interrupt is generated whenever OR=1 or RXNE=1 in the UART_SR register
ILIEN: IDLE Line interrupt enable
This bit is set and cleared by software.
- 0: Interrupt is inhibited
- 1: An UART interrupt is generated whenever IDLE=1 in the UART_SR register
TEN: Transmitter enable
This bit enables the transmitter. It is set and cleared by software.
- 0: Transmitter is disabled
- 1: Transmitter is enabled
REN: Receiver enable
This bit enables the receiver. It is set and cleared by software.
- 0: Receiver is disabled
- 1: Receiver is enabled and begins searching for a start bit
RWU: Receiver wakeup
This bit determines if the UART is in mute mode or not. It is set and cleared by software and can be cleared by hardware when a wakeup sequence is recognize
SBK: Send break
This bit set is used to send break characters. It can be set and cleared by software.It should be set by software, and will be reset by hardware during the stop bit of break.
- 0: No break character is transmitted
- 1: Break character will be transmitted
UART_CR3
| 7 | 6 | 5 4 | 3 | 2 | 1 | 0 | |
|---|---|---|---|---|---|---|---|
| reservé | LINEN | STOP[1:0] | CLKEN | CPOL | CPHA | LBCL | |
| r | rw | rw | rw | rw | rw | rw | rw |
STOP: STOP bits
These bits are used for programming the stop bits.
- 00: 1 Stop bit
- 01: Reserved
- 10: 2 Stop bits
- 11: 1.5 Stop bits // Le reste est essentiellement utilisé pour le mode synchrone (CLK).// ===UART_CR4===
| 7 6 | 5 | 4 | 3 2 1 0 | |
|---|---|---|---|---|
| reservé | LBDIEN | LBDL | LBDF | ADD |
| r | rw | rw | rw | rw |
Utilisé essenitellement pour le mode LIN et le réveil.
ADD[3:0]: Address of the UART node
This bitfield gives the address of the UART node.This is used in multi-processor communication during mute mode, for wakeup with address mark detection
Le reste est utilisé seulement pour le mode LIN.
UART_CR5
| 7 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|
| reservé | SCEN | NACK | HDSEL | IRLP | IREN | réservé |
| r | r | r | rw | rw | rw | r |
utilisé seulement pour le mode IdDa et le mode Smartcard.
UART_CR6
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|
| LDUM | réservé | LSLV | LASE | réservé | LHDIEN | LHDF | LSF |
| rw | r | rw | rw | r | rw | rc_w0 | rc_w0 |
utilisé seulement pour le mode LIN.
UART_GTR
| 7 6 5 4 3 2 1 0 |
|---|
| GT |
| rw |
utilisé seulement pour le mode Smartcard.
UART_PSCR
| 7 6 5 4 3 2 1 0 |
|---|
| PSC |
| rw |
utilisé seulement pour le mode IrDa et le mode Smartcard.