USART je synchronní a asynchronní sériové rozhraní pro přenos dat mezi zařízeními v obou směrech (plný duplex). Používá se pro komunikaci mezi mikrokontroléry, počítači a dalšími zařízeními podporující tento standard.
Pro přenos se používají rámce, které mohou mít 5 až 9 bitů a jsou od sebe odděleny jedním start bitem a jedním nebo dvěma stop bity (obr. 1). Každý rámec může obsahovat ještě paritní bit pro kontrolu rámce. Dále je možné nastavit rychlost přenosu dat od 1 200 bps až do 250 kbps.
Některé vlastnosti USART u mikrokontroléru ATmega32
- Plný duplex (může současně přijímat i vysílat).
- Synchronní nebo asynchronní režim.
- Možnost nastavení přenosové rychlosti v rozsahu 1 200 bps až 250 kbps.
- Podpora rámců délky 5 až 9 datových bitů a 1 až 2 stop bity.
- Generátor sudé/liché parity pro vysílač a hardwarové testování parity pro přijímač.
- Detekce ztráty znaku (OverRun).
- Detekce chyby rámce (Frame Error).
- Obsahuje digitální dolnofrekvenční propust pro detekci falešného start bitu a filtraci zákmitů datových bitů.
- Tři nezávislá přerušení (odvysílání znaku, vyprázdnění vysílacího registru a příjem znaku).
- Možnost zdvojnásobit přenosovou rychlost v asynchronním režimu.
Nastavení a popis registrů USART u mikrokontroléru ATmega32
Pro používání USART se pro správnou práci používají osmibitové registry. Některé slouží pouze k nastavení, některé k odeslání znaku a některé pro příjem. Tyhle registry jsou popsány zde:
- Aby USART správně fungoval je třeba jej inicializovat a to se řeší pomocí registrů UCSRA, UCSRB a UCSRC, kde každý z bitů těchto registrů má svoji funkci. Jednotlivé bity jsou popsány v tabulce 1.
- Pro příjem a poslání znaku se používá registr UDR.
- Registry UBRRL a UBRRH slouží pro nastavení přenosové rychlosti (hodnotu lze vypočítat podle vzorců (1.1 a 1.2) nebo najít v tabulce 2).
Vzorec na výpočet hodnoty registru UBRR pro klasický režim
BAUD = fOSC/(16*(UBRR+1)) (vzorec 1.1)
UBRR = (fOSC/(16*BAUD))-1
a pro režim dvojnásobné rychlosti
BAUD = fOSC/(8*(UBRR+1)) (vzorec 1.2)
UBRR = (fOSC/(8*BAUD))-1
kde BAUD je přenosová rychlost a fOSC je frekvence krystalu. Vzorec pro synchronní režim zde neuvádím z toho důvodu, že synchronní režim USART ve své práci nevyužívám.
Tabulka 1: Popis jednotlivých bitů registrů UCSRA, UCSRB a UCSRC.
BIT | UCSRA | |
7 | RXC | příjem kompletní |
6 | TXC | vysílání kompletní |
5 | UDRE | prázdný buffer |
4 | FE | chyba rámce |
3 | DOR | přetečení bufferu |
2 | PE | chyba parity |
1 | U2X | dvojnásobná přenosová rychlost |
0 | MPCM | multiprocesorový komunikační režim |
BIT | UCSRB | |
7 | RXCIE | povolení přerušení při příjmu |
6 | TXCIE | povolení přerušení při odvysílání |
5 | UDRIE | povolení přerušení při prázdném bufferu |
4 | RXEN | povolení příjmu |
3 | TXEN | povolení vysílání |
2 | UCSZ2 | určuje počet bitů (viz. tabulka 4) |
1 | RXB8 | 9. přijatý bit |
0 | TXB8 | 9. odvysílaný bit |
BIT | UCSRC | |
7 | URSEL | určuje přístup k registrům UBRRH a UCSRC |
6 | UMSEL | výběr mezi synchronním a asynchronním režimem |
5 | UPM1 | parita (viz. tabulka 3) |
4 | UPM0 | parita (viz. tabulka 3) |
3 | USBS | počet stop bitů |
2 | UCSZ1 | určuje počet bitů (viz. tabulka 4) |
1 | UCSZ0 | určuje počet bitů (viz. tabulka 4) |
0 | UCPOL | polarita dat synchronního režimu |
Tabulka 2: Příklady nastavení registrů UBRRL a UBRRH při frekvenci krystalu 16 MHz
Baud Rate (bps) | UBRR | |
U2X = 0 | U2X = 1 | |
2400 | 416 |
832 |
4800 | 207 | 416 |
9600 | 103 | 207 |
14 400 | 68 | 138 |
19 200 | 51 | 103 |
28 800 | 34 | 68 |
38 400 | 25 | 51 |
57 600 | 16 | 34 |
76 800 | 12 | 25 |
115 200 | 8 | 16 |
230 400 | 3 | 8 |
250 000 | 3 | 7 |
Tabulka 3: Nastavení parity
UPM1 | UPM0 | Režim |
0 | 0 | deaktivováno |
0 | 1 | vyhrazeno |
1 | 0 | sudá parita |
1 | 1 | lichá parita |
Tabulka 4: Nastavení počtu bitů rámce
UCSZ2 | UCSZ1 | UCSZ0 | Počet bitů |
0 | 0 | 0 | 5 |
0 | 0 | 1 | 6 |
0 | 1 | 0 | 7 |
0 | 1 | 1 | 8 |
1 | 0 | 0 | vyhrazeno |
1 | 0 | 1 | vyhrazeno |
1 | 1 | 0 | vyhrazeno |
1 | 1 | 1 | 9 |
Připravuje se:
- Knihovna I2C ke stažení pro ATMEL AVR
- Knihovna I2C ke stažení pro STM32F4 Discovery