Seriële protocollen – USART / UART / RS-232 / USB / I2C / SPI
Binnen elektronica en vooral bij het werken met computers en met name met verschillende PCB’s (Printed Circuit Boards) komen we vaak verschillende interfaces tegen. Interfaces waarmee we kunnen communiceren met het board. Soms geeft een interface direct toegang tot b.v. de microcontroller zodat je de microcontroller kunt besturen of zelfs kunt herschrijven. Vaak zijn deze interfaces serieel en deze werken middels een bepaald protocol. Om dus te kunnen communiceren over de interface met het apparaat moet je de juiste taal spreken ofwel het juiste protocol gebruiken. Er zijn verschillende veelgebruikte seriële protocollen zoals UART, I2C, USB, Ethernet en SPI. In deze post leg ik je uit wat de verschillen in deze seriële protocollen zijn.
Om te begrijpen hoe seriële protocollen werken moeten we eerst begrijpen wat “serieel” eigenlijk is.
Serieel betekend het “bit-voor-bit” verzenden van informatie.
Het “bit-voor-bit” verzenden van data noemen we ook wel “sequentiële” verzending omdat het verzenden van data in een vast en gestructureerd patroon geschied. Bij parallelle verzending wordt gebruik gemaakt van meerdere “draden” waardoor deze draden dedicated zijn voor een specifieke richting. Draad A verzend altijd data van links naar rechts en draad B verzend altijd data van rechts naar links. Door de “transportbanen” gescheiden te houden kan data zonder verlies continue over de draden reizen. Bij een seriële verbinding hebben we dit voordeel niet. Data moet volgens een structuur worden verzonden zodat de bits niet “botsen” met elkaar en zodat data pakketjes volledig aankomen.
Synchrone Seriële Verbinding
Seriële verbindingen kennen 2 soorten. “Synchrone” seriële verbindingen en “asynchrone” seriële verbindingen. De eerste, de synchrone seriële verbinding wordt mogelijk gemaakt middels een “klok”. De apparaten delen via dit type verbinding (zoals SPI en I2C) een gemeenschappelijke klok. Met deze gemeenschappelijke klok is een rechtlijnige en vaak snellere verbinding mogelijk maar vereist ook 1 extra draad, de klok draad. Voordat de verbinding gestart wordt worden de klokken aan beide kanten gelijk gezet. De klok telt het aantal verzonden en ontvangen bytes. Omdat er een de stroom van data continue is moeten beide computers weten wanneer een byte compleet verstuurd is. De klok telt dus het aantal bits. Op deze manier kan de stroom continue zijn en is het niet nodig om een start- en stop bit aan de data toe te voegen.
Synchrone verbinding is:
Data verzonden als: blocks & frames
Snelheid: Snel
Kosten: Duurder
Tijd interval: Constant
Ruimte (gap) tussen data: Nee
Voorbeelden: SPI – I2C – USART
Asynchrone Seriële Verbinding
Als er het hebben over een seriële verbinding hebben we het meestal over een asynchrone seriële verbinding. Asynchrone seriële verbinding betekend dat de data zonder ondersteuning van een klok signaal verzonden wordt. Bij asynchrone transport heb je dus nog minder draden nodig maar er moet wel meer effort gedaan worden om data goed en volledig te transporteren.
Data wordt over de lijn getransporteerd in “data chunks”. Dit zijn datapakketten van 5 tot 9 bits groot. De standaardwaarde voor een datachunk is 8 bits. Nadat het formaat van de datachunk overeengekomen is moet er overeenstemming over de “endianness” van hun gegevens komen. Er zijn hier 2 modellen. Soms worden de data chunks verzonden met het meest significante bit (msb) als eerste en het minst significante bit (lsb) als laatste, of omgekeerd? De default instelling is dat het minst significante bit als eerste wordt getransporteerd.
Om te controleren of data succesvol getransporteerd wordt kan er optioneel, als beide kanten het hierover eens zijn “error checking” plaatsvinden door het toevoegen van een “parity bit” aan de pakketten. Een parity bit (of controlebit bit) wordt toegevoegd aan een reeks binaire codes om te zorgen dat het totale aantal 1-bits in de tekenreeks even of oneven is. Het parity bit wordt gebruikt als (een eenvoudige vorm van) error checking code. Er zijn twee varianten van parity bits, het “even parity bit” en het “odd parity bit”. In het geval van even parity bit wordt voor een gegeven reeks bits geteld hoe vaak de waarde 1 voorkomt. Als die telling oneven is, wordt het parity bit ingesteld op 1, waardoor het totale aantal keren dat er 1en voorkomen in de hele set (inclusief het parity bit) een even getal is. Als de telling van 1en in een gegeven reeks bits al even is, is de waarde van het pariteitsbit 0. In het geval van oneven pariteit is de codering omgekeerd.
Ook wordt er bij asynchrone communicatie een start- en stop bit toegevoegd zodat de ontvangende kant exact weet wanneer deze een nieuw data pakketje ontvangt en wanneer dit data pakketje volledig getransporteerd is. Deze noemen we de “synchronisation bits”. Het startbit wordt altijd aangegeven door een inactieve datalijn van 1 tot 0 te schakelen terwijl de stopbit(s) de lijn in idle mode zetten door de lijn op 1 te houden. Er is altijd 1 startbit maar er kunnen 2 stopbits gebruikt worden. Standaard wordt 1 stopbit gebruikt.
Tenslotte moeten er ook afspraken gemaakt worden over de snelheid van de data overdracht. De snelheid van dataoverdracht wordt uitgedrukt als “baud rate”. De baud rate wordt gemeten in bits-per-second (bps). De baud rate kan in theorie elke waarde hebben. Normaliter is deze 9600 bps. Andere veelvoorkomende waardes zijn 1200, 2400, 4800, 19200, 38400, 57600 en 115200. Normaliter is 115200 de maximale snelheid die de meeste microcontrollers kunnen verwerken.
Voor een asynchrone verbinding moeten beide devices dus beschikken over de volgende informatie:
- Data Chunks – standaard: 8 bits
- Endianness – standaard: lsb
- Synchronisation Bits – standaard: 1 start- en stop bit
- Baud Rate – standaard: 9600bps
- Parity Bit – optioneel – standaard: even bit
Als we met bovenstaande standaard settings (zonder parity controle) de ASCII karakters O (01001111) K (01001011) zouden verzenden dan zou dit er als volgt uit zien:
Om “OK” te verzenden moeten dus twee gegevenspakketten worden gemaakt. De ASCII-waarde van O (dat is hoofdletters) is 79, die wordt onderverdeeld in een 8-bits binaire waarde van 01001111, terwijl de binaire waarde van de letter K de volgende reeks vormt: 01001011 is. Vervolgens worden de sync (start- en stop) bits toegevoegd.
De data wordt verzonden volgens de “lsb” methode. Dit zie je terug omdat elke pakketje van rechts naar links gelezen moet worden.
Omdat we de letters met een snelheid van 9600 bps verzenden, is de tijd die we besteden aan het hoog of laag houden van deze bits 1 / (9600 bps) = 104 μs per bit. Voor elke byte aan verzonden gegevens worden er feitelijk 10 bits verzonden: een startbit, 8 databits en een stopbit. Dus, met 9600 bps, sturen we eigenlijk 9600 bits per seconde of 960 (9600/10) bytes per seconde.
Resume: Een asynchrone seriële verbinding heeft dus geen speciale kloklijn nodig en vermindert dus het aantal draden en I/O pinnen maar heeft wel meer data overhead door de extra informatie die op en neer verzonden moet worden.
Asynchrone verbinding is:
Data verzonden als: 1 byte of karakter per keer
Snelheid: Langzaam
Kosten: Goedkoper
Tijd interval: Random
Ruimte (gap) tussen data: Ja
Voorbeelden: RS-232 – UART – USART
Parallelle Verbinding
Om een volledig beeld te geven is het ook zinvol om even uit te leggen wat de tegenhanger van een seriële verbinding is, namelijk de parallelle verbinding.
Bij een seriële verbinding kan er slechts 1 bit per keer over de kabel verzonden worden. Dus “van links naar rechts” of “van rechts naar links”. Bij een parallelle verbinding worden meerdere bits tegelijk naar de overkant verzonden door gebruik te maken van meerdere elektrische geleiders welke op de fysieke laag worden gebruikt om de bits gelijktijdig te transporteren. Parallelle verbindingen maken vaak gebruik van “bussen” waarbij data over 8, 16 of meer draden verzonden worden. Seriële interfaces zijn qua opzet simpeler en kunnen zelfs data verzenden met slechts 1 draad. Meestal maken we bij seriële interfaces gebruik van maximaal 4 draden en niet meer. Parallelle verbindingen zijn meestal sneller en gemakkelijker te programmeren maar ook duurder om te maken. De eerste parallelle poort was de 36-pins IBM parallelle poort welke gemaakt was voor Centronics printers. Later kwam een 25-pins poort uit. De eerste parallelle poorten konden alleen data (met meerdere bits tegelijk) versturen OF ontvangen. De SPP (Standaard Parallel Port) zoals de PS2 aansluiting bracht hier verandering in. Nu kon data bidirectioneel (2 kanten tegelijkertijd) verzonden op. In sommige gevallen was dit half duplex en in sommige gevallen full-duplex. Toen later ook dataopslag aangestuurd moest worden kwam de Extendend Capabilities Port (ECP) poort uit welke bedoeld was voor hogere snelheden. Andere veel voorkomende parallelle protocollen zijn ISA / ATA / PCI / VESA Logical Bus en SCSI.
Laten we een aantal seriële verbindingen eens nader bekijken. We beginnen met USB omdat het USB protocol een speciale is. USB was van origine een serieel maar is tegenwoordig een parallel protocol met seriële backwards compatibility.
USB – Universal Serial Bus
USB staat voor Universal Serial Bus en is dus (van origine) een seriële aansluiting. Maar de toevoeging van “bus” is eigenlijk onjuist omdat dit suggereert dat het aansluiten van meerdere apparaten (zonder hub) mogelijk is en dat er meerdere draden gebruikt worden voor dataoverdracht zodat meerdere bits tegelijkertijd 1 richting op verzonden kunnen worden. USB gebruikt slechts 4 draden. Een + (5 volt) en een – (ground / null) en daarnaast 2 differentiële data draden (D- en D+). Er worden dus geen controle draden gebruikt. USB 3+ kent wel extra draden en wordt daarmee (v.a. USB-C) ook een parallel protocol met seriële backwards compatibility.
USB komt in meerdere varianten en snelheden maar zijn allemaal backwards compatible. Dit wil zetten dat een snel apparaat (USB 3) op een langzame controller (USB 1) wordt aangesloten het apparaat gewoon functioneert maar op een langzamere snelheid. Daarnaast levert USB ook stroom (5 volt) aan randapparaten zodat LED’s en USB disks zonder externe stroomtoevoer kunnen functioneren. Daarnaast vereenvoudigd het het aansluiten en het plug&play principe.
USB heeft een asymmetrisch design. USB bestaat uit een host (het device), 1 of meerdere downstream USB-poorten en de aangesloten randapparatuur op deze poorten. Dit alles is aangesloten in een stertopologie. Mogelijk zijn er extra USB-hubs aanwezig in verschillende lagen. Op deze manier kan de USB topologie uit maximaal 5 niveaus bestaan (in een boomstructuur). Een USB-host kan meerdere hostcontrollers hebben. Elke hostcontroller biedt een of meer USB-poorten tot maximaal 127 apparaten (inclusief hub-apparaten).
USB-apparaten worden in series verbonden via hubs. Er is altijd een hub bekend als de root-hub. De root-hub is ingebouwd in de hostcontroller en kun je zien als stam van de boomstructuur. Ook bestaan er speciale hubs, genaamd “sharing hubs”. Hiermee kunnen meerdere computers dezelfde randapparatuur gebruiken. Ze werken door de toegang tussen pc’s handmatig of automatisch in te stellenen zijn populair in kleine kantooromgevingen.
Een fysiek USB-apparaat kan verschillende logische subapparaten hebben die “apparaatfuncties” worden genoemd. Een enkel apparaat kan verschillende functies bieden, bijvoorbeeld een webcam (videoapparaat-functie) met een ingebouwde microfoon (functie audio-apparaat).
USB-eindpunten bevinden zich eigenlijk op het aangesloten apparaat: de kanalen naar de host worden “pipes” genoemd.
USB-apparaatcommunicatie is gebaseerd op “pipes” (de logische kanalen). “Pipes” zijn verbindingen van de hostcontroller naar een logische entiteit op het apparaat (endpoint). Een USB-apparaat kan maximaal 32 actieve “pipes” vanuit de controlle hebben, 16 inkomend en 16 uitgaand. Elk eindpunt kan gegevens slechts in één richting overbrengen, hetzij in of uit het apparaat, dus elke “pipe” is unidirectioneel.
Wanneer een USB-apparaat voor het eerst wordt aangesloten op een USB-host, wordt het optellingproces van het USB-apparaat gestart. De opsomming begint met het sturen van een resetsignaal naar het USB-apparaat. De snelheid van het USB-apparaat wordt bepaald tijdens de reset-signalering. Na het resetten wordt de informatie van het USB-apparaat door de host gelezen en krijgt het apparaat een uniek 7-bits adres toegewezen. Als het apparaat door de host wordt ondersteund, worden de stuurprogramma’s geladen en wordt het apparaat in een geconfigureerde staat ingesteld. Als de USB-host opnieuw wordt opgestart, wordt het enumeratieproces herhaald voor alle aangesloten apparaten.
De hostcontroller peilt de bus om verkeer, meestal op een round-robin-manier, dus geen enkel USB-apparaat kan gegevens overbrengen op de bus zonder een expliciet verzoek van de hostcontroller.
Wanneer een apparaat via het USB-protocol met een ander apparaat communiceert worden gegevens in de vorm van “packets” verstuurd. Alle datapakketten zijn samengesteld uit 8-bit bytes (of veelvouden van 8-bit bytes, afhankelijk van de ondersteunde bitsnelheid), waarbij de LSB (Least Significant Bit) als eerste wordt verzonden. USB 1 en 2 gebruiken 1 seriële lijn en data transport gebeurt half-duplex doordat 1 zijde het kanaal reserveert voor verbinding. Er kan dus maar over 1 kanaal data verzonden worden (en niet tegelijkertijd). Tot dat moment hebben we het bij USB nog over een seriële verbinding. Dit veranderd echter v.a. USB 3.
Vanaf USB 3 zijn er 2 nieuwe high-speed kanalen aanwezig (1 voor verzenden en 1 voor ontvangen). Uiteraard is de 3e half-duplex lijn ook nog aanwezig om backwards compatibility te zijn. Omdat hiermee wel full duplex verkeer mogelijk is kunnen hogere snelheden behaald worden maar de dataoverdracht is nog serieel. Er kunnen niet meerdere bits richting de overkant verzonden worden.
USB-type C is weer een ander verhaal. Deze heeft vier high-speed kanalenen een half-duplex-kanaal met lage bandbreedte voor USB 1 & 2-compatibiliteit. Deze kanalen hebben elk een paar pinnen, de hogesnelheidskanalen zijn gelabeld als TX1, TX2, RX1 & RX2, maar elk kanaal kan in beide richtingen, bidirectioneel worden gebruikt.
USB-type C ondersteunt ook andere typen signalen bij een USB-C naar USB-C verbinding zoals DisplayPort en MHL. Deze standaarden zijn voor video-signalering en ze kunnen de twee vrije kanalen gelijktijdig gebruiken terwijl USB 3 het eerste paar gebruikt. DisplayPort kan ook alle vier de kanalen gebruiken terwijl voor data USB 2 gebruikt wordt via het low-speed (half duplex) kanaal. Met USB-C is het zelfs mogelijk dat USB-C twee USB 3 stromen parallel draagt, wat in theorie zou kunnen worden gebruikt om de 10 Gbps USB 3.1-bandbreedte te verdubbelen. V.a. dit moment zijn er dus meerdere kanalen om bits gelijktijdig een richting op te verzenden. V.a. USB-C hebben we het dus over een parallelle verbinding. USB 3.2 is van nature een parallelle verbinding welke bovenstaande mogelijkheid gebruikt om snelheden 20 Gbps te behalen.
SPI – Serial Peripheral Interface
SPI staat voor Serial Peripheral Interface en is een relatief simpel synchroon serieel protocol. Bij SPI is er minimaal een connectie tussen 2 mediums maar dit kunnen er meer zijn. Bij SPI fungeert er 1 zijde als “master” en de andere zijde als “slave”. Als er meerdere apparaten met SPI aangesloten zijn dan is er nog steeds 1 master maar meerdere slaves. Omdat er bij SPI altijd 4 draden nodig zijn om te communiceren spreken we bij SPI van een 4-wire-serial-bus. Deze draden zijn:
SC(L)K = Clock
MOSI = Master Out Slave In
MISO = Master In Slave Out
SS = Slave Select
Ieder “slave” device heeft zijn eigen “slave select” lijn zodat de master meerdere slaves op zijn bus kan beheren. In sommige scenario’s wordt een zogenaamde “Daisy Chain” schakeling toegepast waarbij niet de SS maar de MOSI/MISO poorten gebruikt worden. Dit werkt als volgt. Slave A gaat via slave B naar de master. Slave B zal dan de MOSI poort verbinden aan de MISO poort van slave A. De slave die verbonden is met de master verbindt zijn MISO poort aan de MISO poort van de master. De Daisy Chain maakt individuele adressering overbodig maar dit gaat ten kost van de datasnelheid. Daarnaast is het programmeren van software veel lastiger voor apparaten die via een Daisy Chain gekoppeld zijn.
De communicatie tussen de master en slave is bij SPI altijd in full-duplex mode. SPI is dan ook een relatief snel protocol en heeft geen beperkingen m.b.t. bijvoorbeeld de woordgrootte. De maximale transportsnelheid is afhankelijk van het langzaamste device in de keten (master of slave). Adressering is feitelijk niet nodig en toch zijn er maar 4 draden nodig om SPI te laten functioneren. Het nadeel is echter dat SPI geen faciliteiten biedt op te controleren op errors tijdens of na het transport.
Als de communicatie tussen 2 SPI apparaten start dan zal eerst de juiste snelheid gekozen worden. Deze ligt meestal tussen de 1 MHz en 100 MHz. Als de snelheid gekozen is dan zal de slave gekozen worden. De SS lijn van de slave waarmee gecommuniceerd gaat worden zal op “0“ worden gezet. Als er slechts 1 device verbonden is zal de lijn permanent op 0 staan. In sommige gevallen moet eerst een “edge” (van hoog naar laag) gestuurd worden alvorens communicatie mogelijk is. Als de communicatie start zullen beide devices een bit sturen bij iedere tik van de klok. De kloksnelheid bepaald dus de transport snelheid. De master zal het signaal over de MOSI lijn sturen en de slave zal het signaal over de MISO lijn sturen.
I2C
Net als SPI is I2C een synchrone seriële verbinding. I2C spreek je uit als “I kwadraat C bus” welke voorheen als IIC (Inter-IC Bus) werd aangeduid. De I2C bus is in 1979 ontwikkeld door Philips als goedkoop alternatief voor de op dat moment beschikbare databussen. I2C is een TWI (Two-Wired Interface) oplossing welke dus uit slechts 2 draden bestaat. Deze 2 buslijnen zijn een seriële data lijn (SDA) en een seriële clock lijn (SCL).
Ook bij I2C is er 1 master device en 1 slave device. Een master kan verbonden zijn met meerdere slaves die allen een eigen slave-adres hebben. De master heeft controle over de bus en bestuurd de kloklijn. Daarnaast bepaald de master ook het startbit en de stopbit(s).
Wanneer er geen data overdracht is dan zijn zowel de SDA als de SCL lijn hoog. Om het signaal te starten zend de master eerst een startbit (een hoog-naar-laag signaal) over de datalijn. Dit trekt de SDA lijn omlaag. Dan wordt door de master een gekoppelde slave aangeroepen door een slave adres en een read/write bit over de lijn te verzonden. Het read/write bit geeft aan dat de master data wilt versturen of ontvangen. Als de slave actief is zal deze het signaal accorderen met een “acknowledge” signaal. Dit acknowledge signaal wordt gebruikt om te weten dat het verzenden van een nieuw datapakket kan beginnen. Na het verzenden van een datapakket (b.v. 8 bits) zal de master nog 1 kloksignaal nodig hebben om de acknowledge te sturen die de lijn weer hoog zet waarna de slave de lijn weer laag kan zetten om de accorderen dat de dataoverdracht goed gegaan is. Voor elke 8 bits zijn er dus 9 kloksignalen nodig. Als alle data getransporteerd is wordt een stop-bit verzonden waarna de dataoverdracht stopt en de lijn weer klaar is voor een nieuwe data transmissie. Zowel de SDA als de SCL lijnen staan nu weer hoog.
Het schema om meerdere I2C verbindingen te koppelen ziet er als volgt uit:
I2C interfaces zijn begonnen als langzame, redelijk foutgevoelige interfaces. Door diverse verbeteringen aan het protocol kan I2C tegenwoordig snelheden halden van 100 tot 400 kHz. De enige overhead aan de I2C interface is het aknowledge (ACK / NACK) bit. Qua hardware is I2C complexer dan SPI maar minder complex dan asynchrone seriele verbindingen. Het voordeel is dat er slechts 2 draden nodig zijn. I2C ondersteund tot 1008 slave apparaten en er kan zelfs gewerkt worden een multi-master / multi-slave opstelling waarbij meerdere masters over dezelfde bus kunnen praten de slaves (niet met andere masters). De nadelen van I2C moeten ook benoemd worden. I2C is half-duplex, en wordt traag bij grotere hoeveelheden data. Ook kan 1 foute aansluiting (of niet-functionerende chip) binnen een I2C netwerk al het verkeer op de hele bus blokkeren.
UART / USART
USART is en UART lijken qua naam en functionaliteiten best wel op elkaar. UART staat voor “Universal Asynchronous Receiver/Transmitter” en USART staat voor “Universal Synchronous and Asynchronous Receiver-Transmitter”. UART is een asynchroon serieel protocol en USART kan zowel asynchroon als synchroon zijn. Om dit te begrijpen gaan we eerst even kijken naar UART.
UART is dus een asynchrone seriele interface welke configureerbaar is. UART is meestal een individueel (of onderdeel van een) geïntegreerd circuit (IC) dat wordt gebruikt voor seriële communicatie via een seriële poort van een computer of randapparaat. Een of meer UART-randapparatuur wordt gewoonlijk geïntegreerd in microcontroller-chips.
Bij UART kan het gegevensformaat en de transmissiesnelheden worden geconfigureerd. De elektrische signaalniveaus en -methoden worden afgehandeld door een stuurcircuit dat zich buiten de UART bevindt. UART bestaat al sinds 1971 en is uitgevonden door Gordon Bell (DEC) voor het vervangen van roterende mechanische schakelaars (commutatoren). Verschillende karaktercodes met 5, 6, 7 of 8 databits werden gebruikelijk in teleprinters en later als computerrandapparatuur.
Tegenwoordig gebruiken we dit oude protocol nog steeds in microcontrollers, computers, en ander randapparatuur. Meestal worden deze poorten gebruikt om direct te communiceren met de microcontroller van een apparaat. Op computers komen we UART vaak tegen in de vorm van COM poorten. Doordat veel computers tegenwoordig USB gebruiken zijn er USB – UART adapters zodat we met onze computers kunnen blijven communiceren met apparaten die met de seriële UART interface werken.
Vooralsnog lijkt UART best wat vergelijkingen te hebben met SPI. Beide zijn gemaakt voor korte afstanden, beide gebruiken een klok en beide zijn ze full duplex. UART heeft echter slechts 2 pinnen nodig, is asynchroon en is 3x zo langzaam als SPI.
Een UART bestaat uit verschillende componenten, namelijk:
- Een clock generator
- Input/Output shift registers
- Controlefunctie over verzenden en ontvangen
- Controlefunctie voor lezen en schrijven
Een UART kan ook (optioneel) bestaan uitL
- Buffers voor verzenden en ontangen
- Buffer voor de system data bus
- FIFO (First In First Out) buffer
- Third-party DMA controller signalen
- Integrated bus voor het beheren van den DMA controller
Een UART dataframe ziet er als volgt uit:
Net als bij I2C is de datalijn altijd hoog als deze idle is. Dit is afkomstig van de telegrafie, waarbij de lijn hoog wordt gehouden om aan te tonen dat de lijn en zender niet zijn beschadigd. Hoeveel stopbits er gebruikt worden, welke snelheid gehanteerd wordt en of het parity bit gebruikt wordt is aan de gebruiker. Belangrijk is dat instellingen gebruikt worden die compatible zijn met de interface. Gebruik dus altijd een baud rate die in lijn ligt met de mogelijkheden van de interface omdat anders de data niet succesvol wordt overgebracht wat b.v. resulteert in de volgende onbegrijpelijke receive buffer:
UART is dus asynchroon maar USART kan synchroon zijn. De synchrone functies van de USART interface waren bedoeld ter ondersteuning van synchrone protocollen zoals IBM’s Synchronous Transmit-Receive (STR) en High-Level Data link Control (HDLC). Dus protocollen die werden gebruikt met synchrone spraakfrequentie-modems. Deze protocollen zijn ontworpen om optimaal gebruik te maken van de bandbreedte wanneer analoge modems gebruikt werden. In die tijd kon de snelste asynchrone voice-band modem een snelheden van 300 bit / s bereiken met behulp van FSK-modulatie (Frequency-Shift Keying Modulatie), terwijl synchrone modems snelheden van 9600 bit / sec konden behalen. Met behulp van Phase-Shift Keying (PSK). Zoals we al wisten hebben synchrone verbindingen minder overhead. Waneer de USART in asynchrone modus werkt dan functioneert deze net als een UART. Hij genereert zijn data clock intern naar de microcontroller en synchroniseert die klok met de datastream door gebruik te maken van de startbit. Er is geen inkomend kloksignaal dat aan de gegevens is gekoppeld, dus om de datastream correct te ontvangen, moet de ontvanger van tevoren weten wat de baudrate zou moeten zijn. Wanner de USART in synchrone modus werkt dan genereerd het verzendende randapparaat een klok die het ontvangende randapparaat kan ontvangen en interpreteren zonder de baudsnelheid van tevoren te kennen. Als alternatief zal de koppeling een volledig afzonderlijke lijn gebruiken om het kloksignaal te dragen. Het gebruik van de externe klok maakt het mogelijk dat de datasnelheid van de USART veel hoger is dan die van een standaard UART, met een topsnelheid tot 4 Mbps.
Logischerwijs heeft een USART dus een extra kabel nodig om de kloksignalen op te communiceren. Een USART poort zal dus minimaal 2 draden hebben terwijl een UART poort met 1 draad kan werken. UART en USART functioneren in half-duplex of in full-duplex mode. Dit is afhankelijk van de chip die gebruikt wordt.
Een ander groot verschil tussen een USART en een UART is het aantal protocollen dat ondersteund wordt. Een UART is eenvoudig en biedt slechts enkele configureerbare opties zoals het aantal stopbits en even of oneven pariteit. Een USART is complexer en kan naast het genereren van de basis UART gegevens ook gegevens genereren in een vorm die overeenkomt met veel verschillende standaardprotocollen.
USART- en UART-randapparatuur hebben verschillende mogelijkheden en kunnen nuttig zijn in verschillende situaties. Neem bijvoorbeeld een microcontroller die gericht is op een energiebesparend ontwerp, zoals de STM32-familie. De STM32-onderdelen hebben zowel een USART- als een UART-randapparaat op de chip. De USART is bedoeld om alle “heavy lifting” seriële communicatie te doen tijdens periodes van “hoog” energieverbruik. Wanneer de microcontroller slaapt en in een energiebesparende modus werkt, kan het UART-randapparaat echter communiceren met lage snelheid terwijl het een verminderde energie footprint biedt. Wat en hoe je het gebruikt is dus o.a. af van de kosten en de ondersteunende protocollen. De meeste computers ondersteunen alleen de asynchrone modus op een standaard COM-poort, waarvoor een speciale poort vereist is (zoals PCIe of USB) voor de synchrone modus.
RS-232
Hoewel de term RS-232 (Recommended Standard 232) niet meer bestaat en opgegaan is in de “ANSI/EIA/TIA-232-F” standaard gebruiken we “in de volksmond” deze term nog gewoon. De RS-232 standaard is het meeste bekend als seriële poort.
RS-232 komt in verschillende connectoren. Te weten de DTE (Data-Circuit Terminal Equipment) en de DCE (Data Communications Equipment) connector. De DTE connector wordt meestal gebruikt bij computers en beeldschermen en de DCE connector wordt meestal gebruikt bij modems en printers.
De pin-layout van een RS-232 connector is als volgt:
- DCD = Carrier Detect
- RX = Receive
- TX = Transmit
- DTR = Data Terminal Ready
- GND = Ground
- DSR = Data Set Ready
- RTS = Request To Send
- CTS = Clear To Send
- RI = Ring Indicator
RS-232 is eveneens een asynchrone seriële verbinding welke door zijn seperate RX en TX lijn in full-duplex mode kan werken. Omdat er geen clock lijn aanwezig is, is RS-232 dus afhankelijk is van een start-bit en stop-bit(s). De aanvraag om data te verzenden geschied over de juiste signaallijnen zoals DSR en RTS lijnen. Dataoverdracht bij RS-232 werkt anders als die van UART wat meteen het grootste verschil en voordeel oplevert van RS-232. RS-232 werkt namelijk op maximaal 25 volt (maar de meest voorkomende standaarden zijn 5, 10, 12 en 15 V). Een logische 1 (mark) wordt gezien als “Off / Negatief” en een logische 0 (space) wordt gezien als “On / Positief”. Omdat RS-232 op een hoger voltage werkt kan RS232 ook langere afstanden afleggen dan met UART (maximaal 5V). UART zet de te verzenden bits om in “logic level voltages” en RS-232 stuurt en ontvangt “voltage levels” die aangeven wat een 0 en een 1 is.
Bij b.v. een UART interface moet u vooraf veel informatie hebben om ze aan te kunnen sluiten zonder ze te beschadigen en zodat ze kunnen communiceren. U moet o.a. de juiste pinnen aansluiten, de juiste spanning gebruiken en de juiste lijninstellingen configureren. RS-232 is een eenduidige norm die zonder verdere configuratie functioneert. Andere voordelen van RS-232 zijn:
- De 2RS232-interface wordt op veel compatibele oudere apparaten ondersteund vanwege de eenvoud. Het wordt veel gebruikt voor point-to-point-verbinding tussen DTE- en DCE-apparaten.
- Het ondersteunt lange afstanden van ongeveer 15 meter (voor lage baudsnelheden) en met foutcorrectiemogelijkheden.
- RS232 is immuun voor “interferentie / ruis” door gebruik van +/- 5 volt of hoger voor binaire logica 0 en logica 1.
- RS232 is een goedkope interface.
- Converters of adapters zijn verkrijgbaar tegen goedkope tarieven voor conversie van RS232 naar RS485 / USB / Ethernet enz.
Er zijn uiteraard ook een aantal nadelen van RS232, zoals:
- RS-232is geschikt voor systeem-naar-systeemcommunicatie. Het is niet geschikt om als chip-naar-chip of als chip-naar-apparaat communicatie te gebruiken.
- RS-232 ondersteunt lagere snelheid voor lange afstanden. Hogere snelheden (dat wil zeggen 115200 baud) kunnen alleen voor korte afstanden worden bereikt.
- RS-232 kan alleen worden gebruikt voor de configuratie van één master en één slave en niet voor single master-multiple slaves-modus.
- Het is een ongebalanceerde verzending.
Conclusie
Hopelijk heeft deze post je iets meer inzicht gegeven in seriële verbindingen. Nu weet je wat seriële verbindingen zijn, wat de verschillen zijn tussen synchrone en asynchrone seriële verbindingen en hebben we een aantal seriële interfaces nader bekeken. Er is niet 1 seriële standaard “de beste”. Elke standaard dient een specifiek doel en kan toegepast worden in een specifieke configuratie met specifieke wensen.
Vond je deze post leuk, geef me dan een leuke reactie, like en deel deze post (of mijn website) op je sociale media of op je eigen website. Het maken van dit soort posts kost veel tijd en leuke (re)acties zorgen ervoor dat ik met veel plezier blijf schrijven. Thanks!