3.18. UART-basis

Een UART (Universal Asynchronous Receiver-Transmitter) is de oudste en eenvoudigste manier om bytes te verplaatsen tussen twee microcontrollers, of tussen een microcontroller en een host-pc. Twee draden voeren de data – één voor elke richting – en een gedeelde massa voert het signaal terug. Geen van beide kanten draait een gedeelde klok; ze spreken vooraf een baudrate af en herstellen de bittiming uit de datalijn zelf.

3.18.1. Het frame

Elk teken op de draad wordt verpakt in een frame: een startbit, de databits, een optionele pariteitsbit en één of twee stopbits.

Een golfvorm van een UART-frame. Het signaal staat links inactief hoog, valt één bittijd lang laag (de startbit), voert vervolgens acht databits achter elkaar, en keert dan één bittijd lang terug naar hoog (de stopbit) voordat het terugkeert naar inactief.

Eén UART-frame: een startbit, acht databits en een stopbit, elk één bitperiode (1 / baudrate seconden) breed.

De lijn is inactief hoog. De ontvanger let op een dalende flank, die het begin van een nieuw frame markeert. Vervolgens bemonstert hij de datalijn eenmaal per bitperiode – doorgaans in het midden van elke bit – en stelt de bits weer samen tot een teken. De stopbit zet de lijn terug naar inactief zodat de volgende startbit gedetecteerd kan worden.

3.18.2. De baudrate

De bitperiode – en de snelheid van de verbinding – wordt bepaald door de baudrate, het aantal bits per seconde. 9600, 19200, 38400, 57600, 115200, 230400, 460800 en 921600 zijn de standaardwaarden; 115200 is de meest voorkomende standaard. Beide uiteinden moeten het op een paar procent na eens zijn over de baudrate, anders bemonstert de ontvanger de bits op de verkeerde punten en komt de data verminkt terug.

Hogere baudrates verplaatsen meer data per seconde, maar zijn gevoeliger voor kabellengte, capaciteit en de nauwkeurigheid van de klokken aan elk uiteinde. Voor korte verbindingen tussen twee boards op dezelfde werkbank werkt 115200 tot 921600 comfortabel.

3.18.3. Bedrading

Een UART-verbinding gebruikt drie draden:

Twee boards met label A en B, verbonden door drie draden. De TX-pin van board A is verbonden met de RX-pin van board B; de TX-pin van board B is verbonden met de RX-pin van board A; en de massapinnen van beide boards zijn aan elkaar gekoppeld.

UART-bedrading: TX op het ene board gaat naar RX op het andere, en beide massa’s zijn gekoppeld.

  • TX → RX, beide kanten op. De zendpin van elk board is de ontvangstpin van het andere board. Een veelgemaakte beginnersfout is TX → TX bedraden – twee uitgangen die tegen elkaar vechten, zonder data op beide ontvangers.

  • Gedeelde massa. De signaalniveaus zijn gerefereerd aan massa, dus de twee boards moeten een gemeenschappelijke massa hebben, anders ziet de ontvanger de verkeerde spanning op de lijn.

3.18.4. Spanningsniveaus en fysieke lagen

De signaalniveaus op de UART-pinnen van de camera zijn 3,3 V CMOS: massa voor een logische nul, 3,3 V voor een logische één. Alles wat 3,3 V CMOS UART spreekt – een andere microcontroller, een USB-naar-serieel-adapter ingesteld op 3,3 V, een 3,3 V GPS-module – kan rechtstreeks worden bedraad.

Notitie

5 V CMOS UART-apparaten (oudere microcontrollers, bepaalde GPS-modules, sommige oudere sensor-breakouts) spreken dezelfde UART-framing op 5 V logische niveaus. Ze rechtstreeks aan de camera bedraden is onveilig: een 5 V TX die de RX van de camera aanstuurt, overschrijdt de absolute maximale ingangsspanning op cams die niet 5 V-tolerant zijn, en de 3,3 V TX van de camera bereikt mogelijk niet de hoge drempel van het 5 V-apparaat voor een schone logische één.

Vertalen tussen de twee spanningen vereist een actieve lijndriver – een speciale bidirectionele levelshifter-IC met eigen aanstuurtransistoren aan beide kanten van elke lijn. De passieve MOSFET-en-pull-up-shifters uit Niveau-omzetting zijn hier niet voldoende: hun stijgende flanken vertrouwen op het opladen van de lijn via een weerstand, wat prima is bij schakelsnelheden maar veel te traag voor UART. Bij 115200 baud duurt elke bit ongeveer 8 µs, en de RC-helling van de passieve shifter laat de ene bit in de andere overlopen.

Een actieve lijndriver produceert schone flanken in beide richtingen op volledige UART-snelheden. Kies een onderdeel dat geschikt is voor de baudrate waarop de verbinding gaat draaien, bedraad de TX en RX van de camera naar de 3,3 V-kant van de shifter, en bedraad de TX en RX van het 5 V-apparaat naar de 5 V-kant van de shifter.

Drie oudere fysieke lagen gebruiken dezelfde framing maar verschillende spanningen, en hebben een levelconverter nodig tussen hen en een 3,3 V-microcontroller:

  • RS-232. Gebruikt door seriële poorten op desktop-pc’s en sommige industriële apparatuur. De lijn schommelt tussen ongeveer ±5 V en ±15 V, met inactief op de negatieve rail. Omgekeerde polariteit en hoge spanning vergeleken met CMOS; een chip uit de MAX232 / MAX3232-familie (of vergelijkbaar) verzorgt de conversie.

  • RS-422. Een differentiële signaleringsstandaard voor punt-tot-puntverbindingen (één driver, tot tien ontvangers). De driver verzendt over een gebalanceerd paar draden; de ontvanger ziet het verschil tussen beide en negeert common-mode-ruis onderweg. Full-duplexverbindingen gebruiken twee paren – één voor elke richting. RS-422 reikt tientallen meters tot een kilometer, afhankelijk van de baudrate, en een RS-422-transceiverchip zit tussen de TX / RX van de camera en het gebalanceerde paar.

  • RS-485. De multidrop-neef van RS-422 – dezelfde differentiële signalering, maar ontworpen om tot 32 drivers en ontvangers op één bus te plaatsen. De meeste verbindingen zijn half-duplex op één enkel paar, waarbij de driver en ontvanger van elke node dezelfde draden delen en software arbitreert wie er praat. Gebruikt in industriële automatiseringsbussen (Modbus, DMX512, Profibus) waar de draden ver lopen en de ruis erg is; een RS-485-transceiverchip zit tussen de TX / RX van de camera en het differentiële paar.

Beide verzenden nog steeds UART-frames op het onderliggende bitniveau. De machine.UART-configuratie van de camera (baudrate, bits, pariteit, stopbits) is hetzelfde, ongeacht welke fysieke laag het signaal aan de andere kant van de transceiver draagt.