Home     Interfacing     Software     About     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, elk in staat om 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. en 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.

I/O poortLezen (DLAB=0)Schrijven (DLAB=0)Lezen (DLAB=1)Schrijven (DLAB=1)
basisRBR receiver bufferTHR transmitter holdingDLL divisor latch LSBDLL divisor latch LSB
basis+1IER interrupt enableIER interrupt enableDLM divisor latch MSBDLM divisor latch MSB
basis+2IIR interrupt identificationFCR FIFO controlIIR interrupt identificationFCR FIFO control
basis+3LCR line controlLCR line controlLCR line controlLCR line control
basis+4MCR modem controlMCR modem controlMCR modem controlMCR modem control
basis+5LSR line statusfabriekstestLSR line statusfabriekstest
basis+6MSR modem statusniet gebruiktMSR modem statusniet gebruikt
basis+7SCR scratchSCR scratchSCR scratchSCR scratch
UART register naar poort conversietabel

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.

BitBeschrijving
0Ontvangen data beschikbaar
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
IER : Interrupt enable register
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.

BitWaardeBeschrijvingReset door
0xxxxxxx0Interrupt af te handelen
xxxxxxx1Geen interrupt af te handelen
3,2,1xxxx000xModem status veranderingMSR lezen
xxxx001xTransmitter holding register leegIIR lezen of THR schrijven
xxxx010xOntvangen data beschikbaarRBR lezen
xxxx011xLine status veranderingLSR lezen
xxxx110xKarakter timeout (16550)RBR lezen
4xxx0xxxxGereserveerd
5xx0xxxxxGereserveerd (8250, 16450, 16550)
xx1xxxxx64 byte FIFO geactiveerd (16750)
7,600xxxxxxGeen FIFO
01xxxxxxOnbruikbare FIFO (alleen 16550)
11xxxxxxFIFO geactiveerd
IIR : Interrupt identification register
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.

BitWaardeBeschrijving
0xxxxxxx0Schakel FIFO’s uit
xxxxxxx1Activeer FIFO’s
1xxxxxx0x
xxxxxx1xWis de ontvangst FIFO
2xxxxx0xx
xxxxx1xxWis de verzend FIFO
3xxxx0xxxSelecteer DMA mode 0
xxxx1xxxSelecteer DMA mode 1
4xxx0xxxxGereserveerd
5xx0xxxxxGereserveerd (8250, 16450, 16550)
xx1xxxxxActiveer 64 byte FIFO (16750)
Ontvangst FIFO interrupt trigger niveau
7,600xxxxxx1 byte
01xxxxxx4 bytes
10xxxxxx8 bytes
11xxxxxx14 bytes
FCR : FIFO control register
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.

BitWaardeBeschrijving
1,0xxxxxx005 data bits
xxxxxx016 data bits
xxxxxx107 data bits
xxxxxx118 data bits
2xxxxx0xx1 stop bit
xxxxx1xx1.5 stop bits (5 bits data woord)
2 stop bits (6, 7 of 8 bits data woord)
5,4,3xxxx0xxxGeen pariteit
xx001xxxOneven pariteit
xx011xxxEven pariteit
xx101xxxHoog pariteitsbit
xx111xxxLaag pariteitsbit
6x0xxxxxxBreak signaal gedeactiveerd
x1xxxxxxBreak signaal geactiveerd
70xxxxxxxDLAB : RBR, THR en IER toegankelijk
1xxxxxxxDLAB : DLL en DLM toegankelijk
LCR : Line control register

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.

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

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.

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

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.

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
MSR : Modem status register
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.

Snelheid (bps)DeeltalDLLDLM
502,3040x000x09
3003840x800x01
1,200960x600x00
2,400480x300x00
4,800240x180x00
9,600120x0C0x00
19,20060x060x00
38,40030x030x00
57,60020x020x00
115,20010x010x00
DLL en DLM : Divisor latch registers
At any rate, I am convinced
that He [God] does not play dice.
ALBERT EINSTEIN
  mei. 2021
   Copyright © 1997-2021 Lammert Bies, All rights reserved