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 poort | Lezen (DLAB=0) | Schrijven (DLAB=0) | Lezen (DLAB=1) | Schrijven (DLAB=1) |
---|---|---|---|---|
basis | RBR receiver buffer | THR transmitter holding | DLL divisor latch LSB | DLL divisor latch LSB |
basis+1 | IER interrupt enable | IER interrupt enable | DLM divisor latch MSB | DLM divisor latch MSB |
basis+2 | IIR interrupt identification | FCR FIFO control | IIR interrupt identification | FCR FIFO control |
basis+3 | LCR line control | LCR line control | LCR line control | LCR line control |
basis+4 | MCR modem control | MCR modem control | MCR modem control | MCR modem control |
basis+5 | LSR line status | fabriekstest | LSR line status | fabriekstest |
basis+6 | MSR modem status | niet gebruikt | MSR modem status | niet gebruikt |
basis+7 | SCR scratch | SCR scratch | SCR scratch | 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.
Bit Beschrijving 0 Ontvangen data beschikbaar 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 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.
Bit Waarde Beschrijving Reset door 0 xxxxxxx0 Interrupt af te handelen – xxxxxxx1 Geen interrupt af te handelen – 3,2,1 xxxx000x Modem status verandering MSR lezen xxxx001x Transmitter holding register leeg IIR lezen of THR schrijven xxxx010x Ontvangen data beschikbaar RBR lezen xxxx011x Line status verandering LSR lezen xxxx110x Karakter timeout (16550) RBR lezen 4 xxx0xxxx Gereserveerd – 5 xx0xxxxx Gereserveerd (8250, 16450, 16550) – xx1xxxxx 64 byte FIFO geactiveerd (16750) – 7,6 00xxxxxx Geen FIFO – 01xxxxxx Onbruikbare FIFO (alleen 16550) – 11xxxxxx FIFO 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.
Bit Waarde Beschrijving 0 xxxxxxx0 Schakel FIFO’s uit xxxxxxx1 Activeer FIFO’s 1 xxxxxx0x – xxxxxx1x Wis de ontvangst FIFO 2 xxxxx0xx – xxxxx1xx Wis de verzend FIFO 3 xxxx0xxx Selecteer DMA mode 0 xxxx1xxx Selecteer DMA mode 1 4 xxx0xxxx Gereserveerd 5 xx0xxxxx Gereserveerd (8250, 16450, 16550) xx1xxxxx Activeer 64 byte FIFO (16750) Ontvangst FIFO interrupt trigger niveau 7,6 00xxxxxx 1 byte 01xxxxxx 4 bytes 10xxxxxx 8 bytes 11xxxxxx 14 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.
Bit Waarde Beschrijving 1,0 xxxxxx00 5 data bits xxxxxx01 6 data bits xxxxxx10 7 data bits xxxxxx11 8 data bits 2 xxxxx0xx 1 stop bit xxxxx1xx 1.5 stop bits (5 bits data woord)
2 stop bits (6, 7 of 8 bits data woord)5,4,3 xxxx0xxx Geen pariteit xx001xxx Oneven pariteit xx011xxx Even pariteit xx101xxx Hoog pariteitsbit xx111xxx Laag pariteitsbit 6 x0xxxxxx Break signaal gedeactiveerd x1xxxxxx Break signaal geactiveerd 7 0xxxxxxx DLAB : RBR, THR en IER toegankelijk 1xxxxxxx DLAB : 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.
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 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.
Bit Beschrijving 0 Data beschikbaar 1 Overrun error 2 Pariteit error 3 Framing error 4 Break signaal ontvangen 5 THR is leeg 6 THR is leeg en alle bits verzonden 7 Foutieve 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.
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 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) 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 DLL en DLM : Divisor latch registers
There is always one more bug.
LUBARSKY'S LAW OF CYBERNETIC ENTOMOLOGY
|