Lammert Bies     Interfacing     Sitemap     Forum 
 EN   NL   
Snelkoppelingen

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 = 0DLAB = 1
I/O poortLezenSchrijvenLezenSchrijven
basisRBR
receiver
buffer
THR
transmitter
holding
DLL divisor latch LSB
basis + 1IER
interrupt
enable
IER
interrupt
enable
DLM divisor latch MSB
basis + 2IIR
interrupt
identification
FCR
FIFO
control
IIR
interrupt
identification
FCR
FIFO
control
basis + 3LCR line control
basis + 4MCR modem control
basis + 5LSR
line
status

fabriekstest
LSR
line
status

fabriekstest
basis + 6MSR
modem
status

ongebruikt
MSR
modem
status

ongebruikt
basis + 7SCR 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
BitBeschrijving
0Ontvangen data aanwezig
1Transmitter holding register leeg
2Receiver line status register status verandering
3Modem status register status verandering
4Slaap modus (alleen 16750)
5Energie besparingsmodus (alleen 16750)
6Gereserveerd
7Gereserveerd

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
BitWaardeBeschrijvingReset door
00Interrupt af te handelen
1Geen interrupt af te handelen
1,2,3Bit 3Bit 2Bit 1  
000Modem status veranderingMSR lezen
001Transmitter holding register leegIIR lezen of THR schrijven
010Ontvangen data beschikbaarRBR lezen
011Line status veranderingLSR lezen
110Karakter timeout (16550)RBR lezen
40Gereserveerd
50Gereserveerd (8250, 16450, 16550)
164 byte FIFO geactiveerd (16750)
6,7Bit 7Bit 6  
00Geen FIFO
10Onbruikbare FIFO (alleen 16550)
11FIFO 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
BitWaardeBeschrijving
00Schakel FIFO's uit
1Activeer FIFO's
10
1Wis de ontvangst FIFO
20
1Wis de verzend FIFO
30Selecteer DMA mode 0
1Selecteer DMA mode 1
40Gereserveerd
50Gereserveerd (8250, 16450, 16550)
1Activeer 64 byte FIFO (16750)
6,7Bit 7Bit 6Ontvangst FIFO interrupt trigger niveau
001 byte
014 bytes
108 bytes
1114 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
BitWaardeBeschrijving
0,1Bit 1Bit 0Datawoord lengte
005 bits
016 bits
107 bits
118 bits
201 stop bit
11,5 stop bits (5 bits datawoord)
2 stop bits (6, 7 of 8 bits datawoord)
3,4,5Bit 5Bit 4Bit 3 
xx0Geen pariteit
001Oneven pariteit
011Even pariteit
101Hoog pariteitsbit
111Laag pariteitsbit
60Break signaal gedeactiveerd
1Break signaal geactiveerd
70DLAB : RBR, THR en IER toegankelijk
1DLAB : 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
BitBeschrijving
0Data terminal ready
1Request to send
2Alternatieve output 1
3Alternatieve output 2
4Loopback modus
5Autoflow controle (alleen 16750)
6Gereserveerd
7Gereserveerd

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
BitBeschrijving
0Data beschikbaar
1Overrun error
2Pariteits error
3Framing error
4Break signaal ontvangen
5THR is leeg
6THR is leeg en alle bits verzonden
7Foute 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
BitBeschrijving
0verandering in Clear to send
1verandering in Data set ready
2afvallen van Ring indicator signaal
3verandering in Carrier detect
4Clear to send
5Data set ready
6Ring indicator
7Carrier 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)DeeltalDLLDLM
502.3040x000x09
3003840x800x01
1.200960x600x00
2.400480x300x00
4.800240x180x00
9.600120x0C0x00
19.20060x060x00
38.40030x030x00
57.60020x020x00
115.20010x010x00
No matter which way you ride,
it's uphill and against the wind.
FIRST LAW OF BICYCLING

  Apr. 2015
   Copyright © 1997-2015 Lammert Bies, Alle rechten voorbehouden