Lammert Bies     Interfacing     Sitemap   
 EN   NL   
Quick links

Seriële UART informatie

Seriële UART, een inleiding

Een UART, universal asynchronous receiver / transmitter is verantwoordelijk voor het uitvoeren van de hoofdtaken bij seriële communicatie met computers. De chip verandert binnenkomende parallelle informatie naar seriële data die kan worden verzonden over een communicatielijn. Een tweede UART wordt dan gebruikt om de informatie weer te ontvangen. De UART voert alle benodigde taken uit zoals timing, pariteitscontrole, etc. die nodig zijn voor de communicatie. De enige chips die nog extra benodigd zijn zijn line drivers die de signalen van TTL niveau converteren naar lijn spanningen en omgekeerd.

Om de UART in verschillende omstandigheden te kunnen gebruiken zijn registers aanwezig om de communicatie instellingen te lezen en te wijzigen. Instellingen die kunnen worden gemaakt zijn bijvoorbeeld de communicatiesnelheid, de pariteitscontrole methode en de manier waarop binnenkomende gegevens worden gemeld aan de software.

Seriële UART types

Seriële communicatie op PC compatibles is begonnen met de 8250 UART in de IBM XT. In de daarop volgende jaren zagen andere familieleden het licht zoals de 8250A en 8250B revisies en de 16450. Deze laatste werd voor het eerst toegepast in de AT. De hogere bussnelheid in deze computer kon door de 8250 series niet worden bijgehouden. Het verschil tussen deze eerste UART series was betrekkelijk klein. De meest belangrijke eigenschap die elke keer wijzigde was de maximaal toegestane snelheid aan de processor bus zijde.

De 16450 bleek inzetbaar voor toepassingen met een maximale communicatie snelheid van 38,4 kbps. De vraag naar hogere snelheiden leidde tot de ontwikkeling van nieuwe series die in staat zouden zijn de processor enigszins van zijn taak te ontlasten. Het grote probleem met de originele series was de noodzaak om voor elk binnenkomend of te versturen byte een software handeling te verrichten. Om dit probleem de baas te worden werd de 16550 gelanceerd met twee FIFO buffers aan boord. Elke FIFO was in staat 16 bytes te bewaren. Één FIFO was bedoeld voor binnenkomende bytes en de andere voor te versturen data.

Een goed idee, maar het werkte toch niet naar behoren. Een firmware bug in de 16550 maakte het in de praktijk onmogelijk om de buffers praktisch te gebruiken. Daarom werd de 16550A niet lang daarna gelanceerd. Dat was daarmee de eerste UART uit de familie die in staat was zijn FIFO buffers werkelijk te gebruiken. Hierdoor werd het mogelijk om de maximale snelheid voor betrouwbare communicatie te verhogen tot 115,2 kbps. Deze snelheid was inmiddels nodig gebleken om nieuwe modems met compressie aan boord effectief te kunnen gebruiken. Een verdere verbetering die ingevoerd werd met de 16550 series was de mogelijkheid van het gebruik van DMA, direct memory access ofwel directe geheugen toegang voor data verzending. Twee pinnen werden voor dit doel geherdefiniëerd. DMA wordt op dit moment bij de meeste applicaties echter niet toegepast. Alleen speciale seriële I/O kaarten met een groot aantal poorten bevatten soms de extra elektronische circuits die noodzakelijk zijn om deze feature te laten werken.

Op dit moment is de 16550A de meest gebruikte UART. Nieuwere versies zijn echter in ontwikkeling waaronder de 16650 met 32 byte FIFO’s en automatische uitvoering van software flow control. Texas Instruments is bovendien aan het ontwikkelen met de 16750 die 64 byte grote FIFO’s gaat bevatten.

Registers

Acht I/O bytes worden gebruikt om alle registers van een UART te kunnen benaderen. In de volgende tabel is aangegeven op welke lokatie elk register kan worden gevonden. Het basis adres zoals dat in de tabel wordt gebruikt is het laagste I/O poort adres dat door de UART wordt gebruikt. Het schakel bit DLAB kan in het line control register LCR worden gevonden als bit 7 op I/O adres basis + 3.

UART register naar poort conversie tabel
  DLAB = 0 DLAB = 1
I/O poort Lezen Schrijven Lezen Schrijven
basis RBR
receiver
buffer
THR
transmitter
holding
DLL divisor latch LSB
basis + 1 IER
interrupt
enable
IER
interrupt
enable
DLM divisor latch MSB
basis + 2 IIR
interrupt
identification
FCR
FIFO
control
IIR
interrupt
identification
FCR
FIFO
control
basis + 3 LCR line control
basis + 4 MCR modem control
basis + 5 LSR
line
status

fabriekstest
LSR
line
status

fabriekstest
basis + 6 MSR
modem
status

ongebruikt
MSR
modem
status

ongebruikt
basis + 7 SCR scratch

Aanwezige registers
RBR, receiver buffer register
THR, transmitter holding register
IER, interrupt enable register
IIR, interrupt identification register
FCR, FIFO control register
LCR, line control register
MCR, modem control register
LSR, line status register
MSR, modem status register
SCR, scratch register
DLL, divisor latch LSB
DLM, divisor latch MSB

De communicatie tussen de processor en de UART wordt volledig geregeld door 12 registers. Deze registers kunnen worden gelezen of geschreven om de communicatie status te controleren of het gedrag van de UART te veranderen. Elk register is 8 bits groot. Op een PC compatible zijn de registers toegankelijk in het I/O adressen gebied. De functie van elk register wordt hier in detail beschreven.

RBR : Receiver buffer register (RO)

Het RBR, receiver buffer register bevat het ontvangen byte als geen FIFO wordt gebruikt, of het oudste ongelezen byte met FIFO’s. Als FIFO buffering wordt toegepast levert elke nieuwe leesactie het volgende byte op, tot er geen bytes meer beschikbaar zijn. Bit 0 in het line status register kan worden gebruikt om te controleren of alle ontvangen bytes ook zijn ingelezen. Dit bit verandert naar 0, als geen bytes meer opvraagbaar zijn.

THR : Transmitter holding register (WO)

Het THR, transmitter holding register wordt gebruikt om uitgaande karakters te bufferen. Als geen FIFO wordt toegepast kan slechts één karakter worden opgeslagen. Anders is het aantal karakters afhankelijk van het type UART dat wordt toegepast. Bit 5 in het line status register kan worden gebruikt om te controleren of nieuwe informatie moet worden geschreven naar het transmitter holding register. De waarde 1 geeft aan dat het register leeg is. Als FIFO buffering wordt toegepast, dan kunnen meer dan één karakters naar het transmitter holding register worden geschreven als dit bit een lege toestand aangeeft. Er is geen indicatie hoeveel bytes er op een bepaald moment aanwezig zijn in de verzend FIFO.

Het transmitter holding register wordt niet gebruikt om de gegevens vanuit te verzenden. Daarvoor wordt het byte eerst naar een shift register overgebracht waaruit de afzonderlijke bits over het communicatie kanaal worden uitgeklokt.

IER : Interrupt enable register (R/W)

De slimste methode om met een PC seriële communicatie uit te voeren is door gebruik te maken van interrupt service routines. In die configuratie is het niet noodzakelijk om de registers van de UART periodiek uit te lezen om status veranderingen te controleren. De UART zal elke verandering aankondigen met het genereren van een processor interrupt. Een software routine moet aanwezig zijn om de interrupt af te vangen en te controleren welke oorzaak er was voor het aanroepen van de interrupt routine.

Interrupts worden niet gegenereerd, tenzij de UART geprogrammeerd is om dat te doen. Dit kan worden gedaan door bits te zetten in het IER, interrupt enable register. Een bit waarde 1 geeft aan, dat de bijbehorende toestandsverandering een interrupt mag genereren.

IER : Interrupt enable register
Bit Beschrijving
0 Ontvangen data aanwezig
1 Transmitter holding register leeg
2 Receiver line status register status verandering
3 Modem status register status verandering
4 Slaap modus (alleen 16750)
5 Energie besparingsmodus (alleen 16750)
6 Gereserveerd
7 Gereserveerd

IIR : Interrupt identification register (RO)

Een UART is in staat om een processor interrupt te genereren wanneer een status verandering van de communicatiechip optreedt. Één interrupt lijn wordt gebruikt om de aandacht te vragen. Dit betekent dat aanvullende informatie voor de software noodzakelijk is alvorens de noodzakelijke acties uitgevoerd kunnen worden. Het interrupt identification register is hiervoor behulpzaam. De bits in het register geven de huidige status van de UART, en welke statusverandering heeft gezorgd voor de interrupt.

IIR : Interrupt identification register
Bit Waarde Beschrijving Reset door
0 0 Interrupt af te handelen
1 Geen interrupt af te handelen
1,2,3 Bit 3 Bit 2 Bit 1    
0 0 0 Modem status verandering MSR lezen
0 0 1 Transmitter holding register leeg IIR lezen of THR schrijven
0 1 0 Ontvangen data beschikbaar RBR lezen
0 1 1 Line status verandering LSR lezen
1 1 0 Karakter timeout (16550) RBR lezen
4 0 Gereserveerd
5 0 Gereserveerd (8250, 16450, 16550)
1 64 byte FIFO geactiveerd (16750)
6,7 Bit 7 Bit 6    
0 0 Geen FIFO
1 0 Onbruikbare FIFO (alleen 16550)
1 1 FIFO geactiveerd

FCR : FIFO control register (WO)

Het FCR FIFO control register is vanaf de 16550 series aanwezig. Dit register regelt het gedrag van de FIFO’s in de UART. Als een logische waarde 1 wordt geschreven naar bits 1 of 2, dan wordt de daaraan hangende functie getriggerd. De andere bits worden gebruikt om een bepaalde FIFO mode te selecteren.

FCR : FIFO control register
Bit Waarde Beschrijving
0 0 Schakel FIFO’s uit
1 Activeer FIFO’s
1 0
1 Wis de ontvangst FIFO
2 0
1 Wis de verzend FIFO
3 0 Selecteer DMA mode 0
1 Selecteer DMA mode 1
4 0 Gereserveerd
5 0 Gereserveerd (8250, 16450, 16550)
1 Activeer 64 byte FIFO (16750)
6,7 Bit 7 Bit 6 Ontvangst FIFO interrupt trigger niveau
0 0 1 byte
0 1 4 bytes
1 0 8 bytes
1 1 14 bytes

LCR : Line control register (R/W)

Het LCR, line control register wordt bij initialisatie gebruikt om de communicatie parameters in te stellen. Pariteit en het aantal databits kan bijvoorbeeld worden in gesteld. Het register wordt ook gebruikt om de toegang tot de DLL en DLM registers te regelen. Deze registers zijn beschikbaar op dezelfde I/O poort als de RBR, THR en IER registers. Omdat de registers alleen tijdens de initialisatie worden gebruikt heeft dit dubbele gebruik van poorten geen nadelige invloed op de performance.

LCR : line control register
Bit Waarde Beschrijving
0,1 Bit 1 Bit 0 Datawoord lengte
0 0 5 bits
0 1 6 bits
1 0 7 bits
1 1 8 bits
2 0 1 stop bit
1 1,5 stop bits (5 bits datawoord)
2 stop bits (6, 7 of 8 bits datawoord)
3,4,5 Bit 5 Bit 4 Bit 3  
x x 0 Geen pariteit
0 0 1 Oneven pariteit
0 1 1 Even pariteit
1 0 1 Hoog pariteitsbit
1 1 1 Laag pariteitsbit
6 0 Break signaal gedeactiveerd
1 Break signaal geactiveerd
7 0 DLAB : RBR, THR en IER toegankelijk
1 DLAB : DLL en DLM toegankelijk

Enige opmerkingen over pariteit:

De UART is in staat om aan het eind van elk verzonden datawoord een bit te genereren dat kan worden gebruikt om dataverminking te detecteren. Omdat slechts één bit wordt gebruikt is het pariteitssysteem alleen in staat om een oneven aantal foute bits te detecteren. Als een even aantal bits omgeklapt is zal de fout niet worden gedetecteerd.

Als de even pariteit modus is geselecteerd, dan zal de UART altijd een even aantal hoge bits zenden. Bij ontvangen data zal worden gecontroleerd of het aantal bits van waarde 1 even is. Oneven pariteit doet het omgekeerde. Het gebruik van hoge of lage pariteit heeft weinig nut. Dit zet het pariteitsbit op een vaste waarde.

Veel voorkomende instellingen zijn:

  • 8 data bits, één stop bit, geen pariteit
  • 7 data bits, één stop bit, even pariteit

MCR : Modem control register (R/W)

Het MCR, modem control register wordt gebruikt om handshaking acties uit te voeren met het aangesloten apparaat. In de originele UART series inclusief de 16550 wordt de complete handshaking cyclus uitgevoerd door software. De nieuwe 16750 is in staat om de flow control automatisch uit te voeren waardoor de belasting van de processor vermindert.

MCR : Modem control register
Bit Beschrijving
0 Data terminal ready
1 Request to send
2 Alternatieve output 1
3 Alternatieve output 2
4 Loopback modus
5 Autoflow controle (alleen 16750)
6 Gereserveerd
7 Gereserveerd

De twee alternatieve outputs zijn vrij definiëerbaar. Output 2 wordt soms gebruikt in circuits die het interrupt proces op een PC uitvoeren. Output 1 wordt meestal niet gebruikt. Op sommige I/O kaarten wordt deze uitgang echter benut om op een tweede oscillator met een frequentie van 4 MHz over te schakelen. Dit is meestal voor MIDI toepassingen.

LSR : Line status register (RO)

Het LSR, line status register laat de huidige status van de communicatie zien. Fouten worden in het register gemeld. Ook is de status van de zend- en ontvangstbuffers in het register af te lezen.

LSR : Line status register
Bit Beschrijving
0 Data beschikbaar
1 Overrun error
2 Pariteits error
3 Framing error
4 Break signaal ontvangen
5 THR is leeg
6 THR is leeg en alle bits verzonden
7 Foute data in FIFO

Bit 5 en 6 laten beide de status zien van de verzendcyclus. Het verschil is, dat bit 5 hoog wordt zodra het transmitter holding register leeg is, terwijl bit 6 aangeeft dat ook alle bits in het shift register uitgeklokt zijn.

MSR : Modem status register (RO)

Het MSR, modem status register bevat informatie over de vier op de UART binnenkomende modem controle lijnen. De informatie is opgesplitst in twee groepen van vier bits. In de vier meest significante bits wordt informatie over de huidige toestand bewaard terwijl in de minst significante bits toestand veranderingen worden gesignaleerd. Deze laatste vier bits worden gereset als het register wordt gelezen.

MSR : Modem status register
Bit Beschrijving
0 verandering in Clear to send
1 verandering in Data set ready
2 afvallen van Ring indicator signaal
3 verandering in Carrier detect
4 Clear to send
5 Data set ready
6 Ring indicator
7 Carrier detect

SCR : Scratch register (R/W)

Het SCR, scratch register was niet aanwezig op de 8250 en 8250B UART. Het kan worden gebruikt voor tijdelijke opslag van één byte aan informatie. In de praktijk heeft het register slechts beperkt nut. Het enige werkelijke nuttige gebruik is om te controleren of het een UART van het type 8250/8250B betreft, of één van de 8250A/16450 series. Omdat de 8250 UART alleen op XT’s aangetroffen wordt is ook dit gebruik van het register op het ogenblik van weinig nut meer.

DLL en DLM : Divisor latch registers (R/W)

Om timing informatie te genereren maakt elke UART gebruik van een oscillator die een frequentie genereert van ca. 1,8432 MHz. Deze frequentie wordt intern in de UART gedeeld door 16 waaruit de tijdbasis ontstaat voor de communicatie. Door deze deling is de maximaal toegestane snelheid voor communicatie op PC’s gelimiteerd tot 115200 bps. Nieuwere series UARTs zoals de 16550 zijn in staat om een veel hogere ingangsfrequentie aan te kunnen, tot 24 MHz. Daarmee zijn communicatiesnelheden tot 1,5 Mbps mogelijk. Op PC’s worden echter slechts zelden andere oscillatoren dan de 1,8432 MHz versie aangetroffen, omdat de configuratie anders niet meer software compatible zou zijn met de originele XT.

De communicatie snelheid van 115200 bps is niet toepasbaar voor alle applicaties. Om de communicatiesnelheid te kunnen wijzigen kan de frequentie verder worden verlaagd door deze te delen door een programmeerbare waarde. Bij zeer lage communicatiesnelheden kan dit deeltal groter worden dan 255. Daarom wordt het deeltal opgeslagen in twee aparte bytes, het DLL en DLM register die respectievelijk de minst en meest significante byte bevatten.

Voor foutloze communicatie is het noodzakelijk dat zowel de zendende, als de ontvangende UART dezelfde tijdbasis gebruiken. Standaard waarden zijn gedefiniëerd die in de praktijk vaak worden gebruikt. De tabel laat de meest algemene waarden zien met daarbij de noodzakelijke instellingen van de DLL en DLM bytes. Houd er rekening mee dat deze instellingen alleen gelden voor een PC compatible systeem waarop een klokfrequentie van 1,8432 MHz wordt toegepast.

DLL en DLM : Divisor latch registers
Snelheid (bps) Deeltal DLL DLM
50 2.304 0x00 0x09
300 384 0x80 0x01
1.200 96 0x60 0x00
2.400 48 0x30 0x00
4.800 24 0x18 0x00
9.600 12 0x0C 0x00
19.200 6 0x06 0x00
38.400 3 0x03 0x00
57.600 2 0x02 0x00
115.200 1 0x01 0x00

  Nov. 2019
   Copyright © 1997-2019 Lammert Bies, All rights reserved