Vous êtes sur la page 1sur 6

Le périphérique de communication asynchrone (USART)

1 Caractéristiques
Mode full duplex
Mode synchrone ou asynchrone
Nombreuses possibilités de vitesses de transmission
Mots transmis de 5, 6, 7, 8 ou 9 bits
Parité ; calcul et vérification
Filtrage du bruit
Détection de collision
Détection d’erreurs de transmission
Détection de bit de start erroné
3 IT séparées
• Transmission terminée
• Registre de transmission vide
• Réception terminée
Mode de communication multi-processeur
Mode vitesse double

2 Format de transmission / réception

Start D0 D1 D2 D3 D4 (D5) (D6) (D7) (D8) (Parité) Stop1 (Stop2)

3 Configuration du mot
Registre de commande et d’état : UCSRB valeur initiale 00

7 6 5 4 3 2 1 0
RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8
R/W R/W R/W R/W R/W R/W R R/W

Registre de commande et d’état : UCSRC

7 6 5 4 3 2 1 0
URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL
R/W R/W R/W R/W R/W R/W R/W R/W
1 0 0 0 0 1 1 0

URSEL : Les registres UCSRC et UBRRH ont même adresse :


sélection du registre UBRRH s’il est mis à ‘0’,
sélection du registre UCRRC s’il est mis à ‘1’

1
Longueur du mot Parité

UCSZ2 UCSZ1 UCSZ0 Longueur UPM1 UPM0 Parité


0 0 0 5 bits 0 0 Aucune
0 0 1 6 bits 0 1 Réservé
0 1 0 7 bits 1 0 Paire (even)
0 1 1 8 bits 1 1 Impaire (odd)
1 1 1 9 bits
Autres combinaisons interdites

Le 9ième bit est écrit dans TXB8 ou lu dans RXB8

Cas d’une transmission synchrone Nombre de bits de stop

UMSEL Mode USBS Stop bit(s)


0 Asynchronous operation 0 1 bit
1 Synchronous operation 1 2 bits

4 Vitesse de transmission
Registres ‘baud rate’ : UBRRH, UBRRL valeurs initiales 00
7 6 5 4 3 2 1 0
URSEL - - - UBRR11 UBRR10 UBRR9 UBRR8
R/W R R R R/W R/W R/W R/W
UBRR7 UBRR6 UBRR5 UBRR4 UBRR3 UBRR2 UBRR1 UBRR0
R/W R/W R/W R/W R/W R/W R/W R/W

URSEL : Les registres UCSRC et UBRRH ont même adresse :


sélection du registre UBRRH si URSEL est mis à ‘0’,
sélection du registre UCRRC si URSEL est mis à ‘1’

Equations de calcul du contenu de UBRR en fonction de la vitesse de transmission (Baud) :


avec U2X : bit 1 de UCSRA
U2X = 0 Mode normal UBRR = (fXTAL /(16*Baud)) – 1
U2X = 1 Mode double vitesse UBRR = (fXTAL /(8*Baud)) – 1
U2X = 0 Mode synchrone UBRR = (fXTAL /(2*Baud)) – 1

2
Avec un quartz de 7.3728 MHz ET 0.0% d’erreur :
Baud Rate U2X = 0 U2X = 1
2400 191 383
4800 95 191
9600 47 95
14400 31 63
19200 23 47
28800 15 31
38400 11 23
57600 7 15
76800 5 11
115200 3 7
230400 1 3

5 Utilisation de l’USART
Registre de commande et d’état : UCSRA

7 6 5 4 3 2 1 0
RXC TXC UDRE FE DOR PE U2X MPCM
R R/W R R R R R/W R/W
0 0 1 0 0 0 0 0

RXC : Réception d’une donnée terminée


TXC : Transmission d’une donnée terminée
UDRE : Registre de transmission vide
FE : Lecture d’un bit de stop à ‘0’ (frame error)
DOR : Réception d’un bit de Start avant que la donnée précédente n’ait été lue (data
overrun)
PE : Erreur de parité sur la réception

6 fonction de configuration de l’USART en mode polled :


// Initialisation de l'USART avec quartz de 7.3728 MHz
// ---------------------------------------------------
// baud UBRR (U2X = 1)
// 2400 383
// 4800 191
// 9600 95
// 14400 63
// 19200 47
// 28800 31
// 38400 23
// 57600 15
// 76800 11
// 115200 7
// 230400 3
// long_mot : 5, 6, 7, 8 ou 9 bits
// parite = N, E ou O; sans parite, parite paire, parite impaire
// nb_stop = 1 ou 2;

3
void Init_USART (long int baud, char long_mot, char parite, char nb_stop)
{
unsigned char prop, imUCSRC;
Interrupts_Disable; // Pas d’IT pendant la configuration
UCSRA = (1<<U2X); // Vitesse double
prop = (char)(baud/2400); // PGCM de baud
imUCSRC = (1<<URSEL); // Selection indirecte de UCSRC
// Format de transmission
switch (long_mot)
{
case 6: imUCSRC |= (1<<UCSZ0);
break;
case 7: imUCSRC |= (1<<UCSZ1);
break;
case 8: imUCSRC |= (1<<UCSZ0) | (1<<UCSZ1);
break;
case 9: imUCSRC |= (1<<UCSZ0) | (1<<UCSZ1);
UCSRB = (1<<UCSZ2);
break;
}
switch (parite)
{
case 'E': imUCSRC |= (1<<UPM1);
break;
case 'O': imUCSRC |= (1<<UPM0) | (1<<UPM1);
break;
case 'e': imUCSRC |= (1<<UPM1);
break;
case 'o': imUCSRC |= (1<<UPM0) | (1<<UPM1);
break;
}
if (nb_stop == 2) imUCSRC |= (1<<USBS);
UCSRC = imUCSRC;
// Vitesse de transmission
switch (prop)
{
case 1: UBRRL = 127; // 2400
UBRRH = 1;
break;
case 2: UBRRL = 191; // 4800
break;
case 4: UBRRL = 95; // 9600
break;
case 6: UBRRL = 63; // 14400
break;
case 8: UBRRL = 47; // 19200
break;
case 12: UBRRL = 31; // 28800
break;
case 16: UBRRL = 23; // 38400
break;
case 24: UBRRL = 15; // 57600
break;
case 32: UBRRL = 11; // 76800
break;
case 48: UBRRL = 7; // 115200
break;
case 96: UBRRL = 3; // 230400
break;
default: UBRRL = 95; // 9600 Bd par defaut
}
UCSRB |= (1<<TXEN) | (1<<RXEN); // Emission et réception
}

4
7 Emission en mode sans IT (polled)
La mise en service en émission de l’USART se fait en mettant le bit TXEN à ‘1’. L’E/S PD1
est une sortie quelque soit le contenu de ses registres de configuration. L’envoi est effectué
‘LSB first’.

UDRE = 1 : le registre de transmission UDR a été transféré dans le registre à décalage.


TXC = 1 : le registre à décalage de transmission est vide.

Une transmission débute par une écriture dans UDR lorsque UDRE = 0. UDR est transféré
dans le registre à décalage et l’émission a lieu incluant les bits de start, de stop et de parité.

// Transmission d'un octet


// -----------------------
void Tx_Data (unsigned char data)
{
while (!(UCSRA & (1<<UDRE))); // Attente émission octet précédent
UDR = data;
}

8 Réception en mode sans IT (polled)


La mise en service en réception de l’USART se fait en mettant le bit RXEN à ‘1’.
RXC = 1 : une donnée non lue est présente dans le registre à décalage de réception.
L’entrée de réception PD0 est validée par la mise à 1 du bit RXEN de UCRB, quelque soit le
contenu des registres de configuration de cette E/S. Le bit PORTD0 qui contrôle la résistance
de pull up de cette entrée reste actif.

// Reception d'un octet


// --------------------
unsigned char Rx_Data (void)
{
while (!(UCSRA & (1<<RXC))); // Attente réception de l'octet
return UDR; // (!! si pas de réception, programme bloqué)
}
En raison du risque de bloquer le programme si le périphérique communicant avec le µC est
muet, on préférera configurer la réception en mode IT.

9 Détection des erreurs


FE : mis à ‘1’ si non détection du bit de stop.
DOR : mis à ‘1’ si un bit de start est détecté alors que le dernier octet reçu n’a pas été lu.
PE : mis à ‘1’ sur défaut de parité.

10 Interruptions
RXCIE = ‘1’ : IT sur réception complète (à la mise à ‘1’ de RXC).
TXCIE = ‘1’ : IT sur émission terminée (à la mise à ‘1’ de TXC)
UDRIE = ‘1’ : IT sur registre de transmission vide (à la mise à ‘1’ de UDRE).

5
11 Communication en mode multi-processeurs
MPCM (Multi-processor communication mode). Dans ce mode, plusieurs processeurs
esclaves peuvent communiquer avec un processeur maître. Un octet d’adresse débute
l’échange entre un esclave et le maître.
Le protocole est alors que le 9ème bit de la transmission est à 1 si l’envoi est une adresse, sinon
il est à 0.
Les processeurs esclaves ont leur bit MPCM de UCSRA à 1.

11.1 Procédure de communication :


• Mettre MPCM à 1 pour chaque µP esclave
• Le µP maître envoie une adresse et chaque esclave lit cette adresse
• L’esclave qui a été sélectionné met son bit MPCM à 0
• L’envoi de données est terminé lorsqu’une nouvelle adresse est présente. Si ce n’est pas
l’esclave sélectionné, il remet son bit MPCM à 1 et la procédure recommence.

Vous aimerez peut-être aussi