Liaison série

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.