Wat is UART. Kort over de wijze van ontvangst en verzending. De seriële UART-poort verkennen

Er is één prachtige microschakeling - FT2232D. Het is een USB naar UARTx2 converter. Handig wanneer u twee UART-staarten van één USB-kabel nodig hebt. Maar dit zijn kiemen vergeleken met het feit dat krachtige hardware-ondersteuning voor MPSSE (Multi-Protocol Synchronous Serial Engine) werd geïntroduceerd in deze FTDI mikruhu, waarmee je een heleboel verschillende interfaces zoals SPI of JTAG alleen op deze mikruh kunt implementeren.
Dat geeft precies de breedste mogelijkheden voor het bouwen van programmeurs van verschillend kaliber voor wat dan ook. Op dit moment heb ik circuits gezien voor firmware AVR, ARM, Altera en God weet wat nog meer.

Theoretisch kan het worden gebruikt om alles te flashen, er zou software-ondersteuning zijn en een open en gedocumenteerd protocol.

Daarom heb ik voor zo'n leuke touch niet afgebroken en een universele sjaal gemaakt, die later, door middel van een baldakijn van mezzanine-sjaals, zal veranderen in verschillende flashers en debuggers.

Het voltooide programma moet op de een of andere manier in de controller worden gepropt. Er zijn veel manieren om dit te doen.

JTAG / SWD-adapter
Aangezien JTAG vaak wordt gebruikt voor foutopsporing onder ARM, is deze methode waarschijnlijk de meest populaire. Hiervoor wordt een adapter gebruikt. Ik gebruik bijvoorbeeld, zodat ik op zijn voorbeeld zal laten zien. Alles is daar eenvoudig - je sluit de adapter aan op de controller met een standaard SWD- of JTAG-kabel. Via NRST / TDI / TDO / TCK / TMS-lijnen voor JTAG of SWO / SWOCLK / SWDIO / NRST voor SWD-modus. Op de adapter van mijn versie van CoLinkEX zijn beide connectoren naar één blok gebracht, zodat het is alsof zowel JTAG- als SWD-verbinding tegelijk wordt verkregen. En daar heb je het nodig en kies je. Er is niet veel verschil in debug / firmware tussen de twee.

Of gebruik het CoFlash-hulpprogramma van CooCox.com

Een van de geweldige dingen van AVR-controllers is het enorme aantal interrupts. In feite heeft elk randapparaat een vector, zo niet één. Dus bij interrupts kun je een heleboel parallelle processen vertroebelen. Werken aan interrupts is een manier om een ​​pseudo-multitasking-omgeving te maken.

Ideaal voor gegevensoverdracht en langdurige verwerking.

Als voorbeeld zal ik de gebufferde USART-gegevensuitvoer op interrupts laten zien.

In de vorige voorbeelden was er code zoals deze:

// Verzenden van een string void SendStr (char * string) (while (* string! = "\ 0") (SendByte (* string); string ++;)) // Verzenden van één karakter void SendByte (char byte) (terwijl (! ( UCSRA & (1<

Deze methode is duidelijk volledig ineffectief. Het feit is dat we de domste verwachting hebben van een evenement hier - het hijsen van de USART-gereedheidsvlag. En dit hangt in de eerste plaats af van de gegevensoverdrachtsnelheid. Met een snelheid van 600 baud duurt de verzending van ongeveer 600 tekens bijvoorbeeld 9 seconden, waardoor de werking van het hele programma, dat in geen enkele poort klimt, wordt geblokkeerd.

Ooit had ik een apparaat nodig dat verbinding kon maken met een externe server en bytes kon overbrengen. Natuurlijk kan een computer voor deze doeleinden worden gebruikt, maar het is omslachtig en onhandig, en de betrouwbaarheid van een dergelijk systeem laat veel te wensen over - het is een te complex apparaat. Een ander ding is een microcontroller, bijvoorbeeld Microchip PIC, MSC-51 of Atmel AVR - eenvoudig, betrouwbaar, verbruikt een minimum aan energie en kan een beperkt aantal taken betrouwbaar uitvoeren. Bijvoorbeeld alarmbewaking via internet of Ethernet-netwerk. Alles zou in orde zijn, maar hier doet zich een ander probleem voor: het TCP / IP-protocol. Het implementeren van de TCP / IP-protocolstack op een AVR of PIC is een haalbare taak, maar het kost tijd, en tijd is, zoals u weet, geld. Het was dringend nodig en met minimale aambeien. En hier kwam de Ethernet-interfacemodule - RS232 mij te hulp. De taak is standaard, dus er zijn genoeg kant-en-klare modules op de markt, maar je moet je niet haasten. Er zijn een aantal subtiliteiten die verband houden met de eigenaardigheden van de werking van deze apparaten. De overgrote meerderheid van de modules kan bijvoorbeeld uitsluitend werken in de rol van een server, waarvoor een speciaal IP-adres vereist is. Het clientapparaat werkt alleen met gespecialiseerde software, meestal onder Windows, en opent een virtuele COM-poort die verbinding maakt met het externe systeem (UART - Ethernet-module) en voor gegevensuitwisseling zorgt. Niet de meest handige optie. Voor mijn taak was dit ontwerp volkomen ongeschikt. Dus ging ik verder zoeken, en al snel ontdekte ik een prachtige module EG-SR-7100, en dan de nieuwere wijziging WIZ100SR... Ik las de kenmerken - dat is het! Alles om mijn probleem op te lossen!

Ik heb mezelf een paar modules gekocht HM-TR433... Kwelling dus. Er is op dit moment zo'n vreugde over 800 roebel. Dit is een zendontvanger, dat wil zeggen dat hij zowel kan ontvangen als zenden. Bovendien is er een controlecontroller, die zelf de informatie codeert, deze naar het radiokanaal stuurt en decodeert wat wordt opgevangen. Dat wil zeggen, in feite krijgen we een UART-verlengkabel en allerlei problemen zoals ruis na het verlies van de drager, die in de bundel zaten HM-T433 / HM-R433 het maakt ons niet meer uit. Een nadeel is dat het kanaal half-duplex is, dat wil zeggen dat synchrone ontvangst en verzending onmogelijk zijn, slechts één voor één. Maar dit is geen groot probleem - half-duplex is vaak genoeg voor de ogen.


Er zijn twee modificaties van deze module. De ene heeft TTL-afsluiting, de andere is RS232. Het enige verschil zit in de niveaus en in het feit dat de Chinezen aanvankelijk vergaten de MAX232 en de condensatorband te solderen, maar jumpers zetten. Dus met rechte handen en het juiste gereedschap kun je RS232 maken van TTL en vice versa. Tegen een prijs gaan ze echter van cent tot cent.

Teckel, om aan een commercieel project te werken (en vraag niet welke - ik zal het je niet vertellen), die al mijn vrije tijd opslokte met een enorme gekartelde lepel, verlichtte de radiomodules tot de as HopeRF HM-R433 / HM-T433... Vandaag heb ik een half-duplex-schema samengesteld op vier modules en een langeafstandsontvangst- en transmissiesessie uitgevoerd.

Dus, hoe was de installatie:

Blok A:

  • Zender: HM-T433
  • Ontvanger: HM-R433
  • Bloklocatie: 5e verdieping, op tafel. Bij de noordmuur.
  • Voeding: 5 volt.
  • Baudrate: 4800 baud.
  • Lengte datapakket: 10 bytes.

Blok B:

  • Zender: HM-T433
  • Ontvanger: HM-R433
  • Zenderantenne: Een stuk MGTF-draad van 17 cm lang (1/4 van de signaalgolflengte van 433 MHz) is toch gebogen.
  • Ontvangerantenne: zelfde bullshit.
  • De locatie van de modules: parallel aan elkaar, op een afstand van 2 cm, antennes antennes zijn verspreid in verschillende richtingen, op de manier van kakkerlakken.
  • Bloklocatie: In mijn handen, op de grond. Vanaf de zuidkant van het huis (zie afbeelding)
  • Voeding: 5 volt.
  • Baudrate: 4800 baud.
  • Lengte datapakket: 10 bytes.

Overdrachtsvoorwaarde:
Blok B geeft een pakket van tien bytes aan blok A, dat, nadat het zich ervan heeft vergewist dat het pakket zonder vervorming is ontvangen, een bevestiging terugstuurt naar blok B, dezelfde tien bytes. Blok B, die bevestiging heeft ontvangen, licht een groene diode op. Transmissie wordt uitgevoerd met een carrier cutoff. Die. na het verzenden van het pakket wordt de zender volledig afgesneden.


Tijdens de eerste tests liet het zaaistuk van ijzer zich van zijn beste kant zien, maar in de praktijk kwamen er niet alleen insecten uit, maar gigantische moordende kakkerlakken. Het lijkt erop, waarom is het verkeerd om daar te werken? En, zo bleek, er is iets. Om precies te zijn, dit zijn geen bugs, maar functies waarover de fabrikant het meest gemeen heeft gezwegen in de datasheets. Als ik van ze wist, had ik erover nagedacht of ik ze zou kopen. Dus:

Vervoerder
De ontvanger vangt de verandering in de draaggolf op die door de zender wordt gegenereerd. En als er geen zender is, wat zal de ontvanger dan opvangen? In theorie zou het niets moeten vangen, maar wat in de praktijk? En in de praktijk een wilde shit!!! Natuurlijk witte ruis over het hele bereik van 0 tot 255. Lijkt op een bug, toch? Maar goed, naar de hel met deze witte ruis, uiteindelijk kun je het filteren, de aanwezigheid van iets redelijks erin volgen, en pas dan beginnen het te nemen.

Wachtmodus
De zender heeft tot mijn verbazing, evenals een aantal oplettende lezers, geen ingang tot mijn verbazing. Inschakelen. De ontvanger heeft dat wel. Zeldzaam delirium, vooral sinds na 70 mS downtime op de DATA-lijn gaat de zender in de slaapstand en ... dat klopt, snijdt de drager af - aan de uitgang van de ontvanger begint op dit moment een vreselijke shit. Dus of de gegevens kwamen in een continue stroom, of er was een identificatiepakket voor elke verzending. En niet te vergeten de ontvanger te waarschuwen dat de uitzending voorbij is en er niets te vangen valt.

Samenwerking
Alles is hier eenvoudig, twee zenders kunnen niet tegelijkertijd werken. Van het woord helemaal. Apart of helemaal niet. Dit was te verwachten en dient in acht te worden genomen.

Bugs overzetten
Maar waar ik het meest van af was, waren de bugs. Als de eerste drie punten zonder onnodige problemen in aanmerking kunnen worden genomen en programmatisch kunnen worden verwerkt, dan is met de laatste alles veel leuker.

Naast een ultrasone afstandsmeter kreeg ik onder andere radiomodules in een pakket van Terra. Hoop HM-T433 en Hoop HM-R433 Voor respectievelijk verzending en ontvangst. De module zelf is een kleine sjaal 15x25 mm met een connector die eruit steekt. De zender heeft een driepolige connector - GND, DATA en Vcc de ontvanger heeft een andere ingang INSCHAKELEN bij het aanvragen waarvoor ontvangst op hoog niveau is toegestaan.

Ik had de behoefte om mezelf een apparaat af te staan ​​zodat ik het kon gebruiken om bytes over te verdelen ik 2 c en UART, en ook bytes ontvangen met dezelfde protocollen en deze op het scherm weergeven. Zowel één voor één als in bundels. Een soort debugger.

Nou, cho, er wordt gezegd dat het gedaan is. Vast ATMega8535- de eerste die opdook onder de arm van de veelbenige. Ik heb alles wat mogelijk was naar buiten gebracht, een kleintje toegevoegd 4x4 toetsenbordmatrix en lcd-scherm... Klein scherm WH0802A 8x2 symbolen, maar wat het was. Ik heb anderen niet in de uitverkoop ontmoet, maar onder de bestelling is het te lui om te dragen. En ik denk dat dat niet meer nodig is.

En sinds zo'n drank begon, bracht ik een paar kanalen naar de stapel PWM, ja een paar ingangen ADC... We zullen SPI tegelijkertijd - om zo te lopen. Je kan ook Dallas 1-draads een protocol om te organiseren, een frequentiemeter bevestigen, een signaalindicator, een voltmeter en in het algemeen kun je veel dingen doen, er zou een verlangen zijn. Wederom zijn er heel veel input/output lijnen, dus je kan er een head-unit van een smart home of een controller van iets van maken.

Het gebouw nam een ​​gratis, PAC-TEC De 'ovskiy' die het ongeveer twee jaar geleden verknalde. Dus de doos zal van pas komen :) Ik moet zeggen, PAC-TEC maakt geweldige dozen. Niet zoals de shit die in onze radiowinkels wordt verkocht. Ze kraken niet, spelen niet, ze zijn stevig neergeslagen, ze zijn goed gesneden en zien er cool uit. Waar anders zouden ze bij ons worden verkocht.

Tot nu toe is alleen het bestuur gescheiden, enkele details ontbreken nog. Een dezer dagen ga ik het bord etsen, monteren en programmeren. Dan heb je voorbeelden van live code en een gedetailleerde beschrijving. SPI, i2c, UART, toetsenbord en LCD... Merk trouwens op hoe gemakkelijk het is om gemeenschappelijke tact-knoppen te matrixen. En dat allemaal dankzij het feit dat ze vier pinnen hebben die paarsgewijs zijn verbonden.

In de tussentijd, aangezien het nog steeds in de vorm van een tekening is, gooi je ideeën over de functies van het toekomstige apparaat in de opmerkingen.

Terwijl ik een artikel over UART aan het schrijven was, kwam er een pervers idee in me op: op basis van UART kun je de meest natuurlijke PWM met lage resolutie organiseren!

Het is voldoende om ergens in het geheugen een variabele te maken, waar we een getal met een gegeven werkcyclus van nullen en enen zullen pushen, en bij het onderbreken van de buffer-underrun, dit getal terug in het UDRE-register duwen. De PWM-generatie zal dus spontaan zijn, zonder onnodige gebaren. Toegegeven, u kunt slechts 10 verschillende PWM-waarden krijgen, maar dan gratis !!!

Voor degenen die niet begrepen hoe, zal ik de nummers geven die continu via de UART moeten worden verzonden:
we krijgen twee extra waarden vanwege de start- en stopbits.

00000000 — 1/10
00000001 — 2/10
00000011 — 3/10
00000111 — 4/10
00001111 — 5/10
00011111 — 6/10
00111111 — 7/10
01111111 — 8/10
11111111 — 9/10

En je kunt daar non-fig-frequenties krijgen!
Schoonheid! =)))))

Bijna elke microcontroller heeft een universele seriële interface aan boord - UART. AVR dit is geen uitzondering en ondersteunt dit protocol volledig, volledig in hardware. In structuur is het normaal asynchroon een serieel protocol, dat wil zeggen, de zendende kant geeft op zijn beurt 0 en 1 af aan de lijn, en de ontvangende kant bewaakt en slaat ze op. Synchronisatie is getimed - de ontvanger en de zender spreken van tevoren af ​​op welke frequentie de uitwisseling zal plaatsvinden. Dit is een heel belangrijk punt! Als de snelheid van de zender en ontvanger niet overeenkomen, kan het zijn dat er helemaal geen transmissie is of dat de verkeerde gegevens worden uitgelezen.

Protocol
Eerst gooit de zender de lijn naar een laag niveau - dit is begin beetje... De ontvanger voelt dat de lijn is verdwenen en wacht op het T1-interval en leest het eerste bit, waarna de rest van de bits wordt uitgezocht op het T2-interval. Het laatste stukje is stop beetje... Geeft aan dat de overdracht van deze byte is voltooid. Dit is in het eenvoudigste geval.

Aan het einde van de byte, vóór de stopbit, kan er een pariteitsbit zijn. Die wordt verkregen als je alle bits onderling kruist om de kwaliteit van de transmissie te controleren. Er kunnen ook twee stops zijn, wederom voor de betrouwbaarheid. Bits mogen dan geen 8 zijn, maar 9. Al deze parameters worden aan de wal onderhandeld, voordat de transmissie begint. De meest populaire is 8 bits, één start één stop, geen pariteit.

En u hoeft zich niet bezig te houden met het protocol zelf - alles is in hardware geïmplementeerd. Tenzij u een tweede UART wilt starten, moet u dit programmatisch doen.

De COM-poort van de computer werkt volgens hetzelfde protocol, het verschil zit alleen in het verschil in voltages, daarom zal ik dit protocol gebruiken om de microcontroller met de computer te communiceren. Een RS232-TTL-converter kan worden gebruikt om spanningen om te zetten. COM-poort. Maar er is hier één probleem: het feit is dat de computer RS232 hij neemt voor logische niveaus +/- 12 volt, en UART werkt op vijf volt niveaus. Hoe ze te combineren? Hiervoor zijn er verschillende opties voor niveau-omzetterschakelingen, maar de meest populaire zit nog steeds op een speciale omzetter. RS232-TTL... Dit is een microschakeling MAX232 en zijn analogen.
Bijna elk bedrijf maakt zijn eigen converter, dus hier past het en ST232, en ADM232, en HIN232... Het circuit is zo simpel als drie kopeken - input, output, voeding en omsnoering van vijf condensatoren. Condensatoren zijn meestal geïnstalleerd 1uF elektrolyten, maar in sommige modificaties 0.1uF keramiek. Ik soldeerde overal 0.1uF keramiek en meestal was het genoeg. :) Werkt als een klok. Als het bij hoge snelheden faalt, moet de capaciteit worden verhoogd.


Er is trouwens ook MAX3232 het is hetzelfde, maar de output is geen 5 volt TTL, maar 3,3 volt TTL. Het wordt gebruikt voor laagspanningsregelaars.

Ik heb zo'n universeel snoer voor mezelf gemaakt, zodat het gemakkelijk was om me aan de controllers vast te klampen. UART... Voor de algehele compactheid werd het hele circuit rechtstreeks in de connector geduwd, omdat ik had ST232 in het soic corpus. De zakdoek bleek niet groter te zijn dan een roebelmunt. Omdat er geen kleine SMD-condensatoren bij de hand waren, moest ik de geleiders van bovenaf solderen, wie op welke manier. Het belangrijkste werkt, hoewel het niet erg mooi is geworden.


Als je twijfelt of je zo'n kleine installatie krijgt, dan stop ik het bord in een standaard PDIP-koffer. Het heeft de grootte van een luciferdoosje, maar je hoeft het niet te malen.


Na montage is de controle eenvoudig:
Wordt aangesloten op connector COM haven. Er wordt 5 volt stroom aan het circuit geleverd en dan sluit je Rx op de Tx(Ik heb groene en gele draden).

Dan open je echter een willekeurige terminal Hyperterminal Als u zich vastklampt aan de poort en begint met het verzenden van bytes, moeten deze onmiddellijk worden geretourneerd. Als dit niet gebeurt, controleer dan het circuit, waar een deurpost is.

Als het werkt, is alles eenvoudig. De draad die van been 9 van de microschakeling gaat MAX232 het zenduitvoer:, zet hem op zijn benen RxD controleur. En die met een been 10 - ontvangen, zette hem stoutmoedig op de conclusie TxD controleur.


Het bord is gemaakt volgens de LUT-methode, op één plaats, in mijn toezicht, bleek de spelingdikte 0,05 mm te zijn, het was geëtst, maar met spikes moest ik krassen. Maar over het algemeen vanaf de eerste poging en geen problemen. Ik wilde meteen iets kleins, kleins, gevuld gevuld maken :)

3.1 Seriële asynchrone UART-interface

De seriële interface gebruikt een enkele signaallijn voor datatransmissie, waarover bits informatie achter elkaar in serie worden verzonden. Seriële transmissie vermindert het aantal signaallijnen, wat de bedrading van PCB's vereenvoudigt, de grootte van het apparaat verkleint en meer ruisvrije interfaces mogelijk maakt. Tijdens seriële verzending moet elk informatiebit vergezeld gaan van een synchronisatiepuls - een stroboscoop. Als synchronisatiepulsen via een speciale lijn van het ene apparaat naar het andere worden verzonden, wordt zo'n interface synchroon genoemd; in dit geval bevindt de synchronisatiegenerator zich aan de zijkant van het apparaat dat de overdracht start. Als de ontvanger en zender elk hun eigen klokgenerator hebben die op dezelfde frequentie werkt, wordt zo'n interface asynchroon genoemd. Het blijkt dat de informatieontvanger zelf synchronisatiepulsen genereert.

Een typische vertegenwoordiger van een asynchrone seriële interface is: UART(Universele asynchrone ontvanger-zender).

Bij verzending via de UART-interface wordt elke databyte voorafgegaan door a START-bit signalering aan de ontvanger over het begin van de transmissie, wordt het START-bit gevolgd door de databits. Maakt het pakket compleet! STOP beetje, waardoor een pauze tussen berichten wordt gegarandeerd. De START-bit van de volgende byte wordt op elk moment na de STOP-bit verzonden, dat wil zeggen, er kunnen pauzes van willekeurige lengte zijn tussen transmissies. De START-bit biedt een eenvoudig mechanisme om de ontvanger te synchroniseren met het signaal van de zender. De interne klok van de ontvanger maakt gebruik van een referentiefrequentiedelerteller, die wordt gereset wanneer de start van de START-bit wordt ontvangen. Deze teller genereert interne stroboscopen die de ontvanger vastklikt op volgende ontvangen bits.

3.2 Kenmerken van de UART-microcontroller ADuC842

In de ADuC842-microcontroller is de seriële UART-poort: full duplex- hiermee kunt u tegelijkertijd gegevens verzenden en ontvangen. In de beschouwde microcontroller wordt de ontvangst via de seriële poort gebufferd: de poort kan een databyte beginnen te ontvangen nog voordat de vorige byte uit het bufferregister van de ontvanger is gelezen. Als de vorige byte echter niet voor het einde van de ontvangst uit de buffer wordt gelezen, gaat deze verloren: de nieuw ontvangen byte zal de oude overschrijven.

Gegevens worden ontvangen en verzonden via verschillende lijnen, verzending vindt plaats via output TxD microcontroller (zendergegevens - gegevenszender), ontvangst - via RxD(Ontvangergegevens). Fysieke gevolgtrekkingen RxD en TxD uitgelijnd met de pinnen van de derde parallelle poort P3.0 en P3.1 respectievelijk.

Software-interactie met de UART seriële poort wordt uitgevoerd via speciale functieregisters (SFR) SBUF en SCON... Aan de overkant SBUF(Seriële buffer) heeft toegang tot de ontvanger- en zenderregisters van de seriële poort. Wanneer u programmatisch schrijft naar SBUF, dan worden de gegevens in het zenderregister geladen, wanneer het programma leest: SBUF, dan wordt het ontvangerregister geopend. Fysiek zijn de ontvanger- en zenderregisters gescheiden. SFR-adres - 0x99.

SCON- registreer voor configuratie en controle van de seriële poort van de microcontroller.
SFR het adres - 0x98.
0x00.
Het register is bit-adresseerbaar.

Tabel 1 - Doel van de SCON-registerbits

Kamer geheugensteuntjes Beschrijving
7 SM0 SM1, SM0 de bits bepalen de bedrijfsmodus van de seriële poort.
SM0 SM1 Geselecteerde modus
0 0 modus 0: synchrone modus met vaste snelheid f core / 2.
0 1 modus 1: 8-bits asynchrone modus met configureerbare baudrate.
1 0 modus 2: 9-bits asynchrone modus met vaste snelheid f core / 32 of f core / 16.
1 1 modus 3: 9-bits asynchrone modus met configureerbare baudrate.
6 SM1
5 SM2 Transceiver modus controle bit. Het is door software ingesteld om de ontvangst van een bericht te verbieden waarin de negende bit de waarde "0" heeft. Deze modus wordt gebruikt bij het implementeren van een netwerkprotocol in een systeem met meerdere processors.
4 REN Seriële gegevens ontvangen inschakelen bit. Softwarematig ingesteld om ontvangst mogelijk te maken.
3 TB8 De 9e seriële poort zenderbit. De gegevens die in TB8 zijn geladen, worden verzonden door de negende bit. Dit is relevant voor de UART-modus 2 en 3.
2 RB8 De 9e seriële poort ontvanger bit. In bedrijfsmodi 2 en 3 wordt de ontvangen negende databit in deze bit geladen. In modus 1 slaat dit bit het STOP-bit op.
1 TI Onderbrekingsvlag van seriële poortzender. Ingesteld door hardware aan het einde van een byte-overdracht. De vlag moet programmatisch worden gewist (schrijf "0").
0 RI Onderbrekingsvlag van seriële poortontvanger. Ingesteld door hardware aan het einde van een byte-ontvangst. De vlag moet programmatisch worden gewist (schrijf "0").

Bedrijfsmodus 0: 8-bits schuifregistermodus. Om deze bedrijfsmodus te selecteren, moet dit in bits zijn SM0 en SM1 schrijf logische nullen ( SM1 = 1 en SM0 = 0). In deze modus worden gegevens achtereenvolgens verzonden en ontvangen via pin RxD... Gevolgtrekking TxD gebruikt om klokpulsen toe te passen. De overdracht wordt gestart door elke instructie die gegevens naar een register schrijft. SBUF... De databyte-overdracht begint met het minst significante bit. De ontvangst begint wanneer de ontvangst-inschakelbit is ingesteld op één ( REN = 1), en de interruptvlag van de ontvanger wordt op nul gezet ( RI = 0). In dit geval werkt de seriële poort dus in een synchrone modus, daarom wordt voor sommige families van microcontrollers een dergelijke seriële poort niet UART genoemd, maar USART(Universele synchrone-asynchrone ontvanger-zender).

Bedrijfsmodus 1: asynchrone 8-bits modus met configureerbare snelheid. Om de eerste modus te selecteren, moet deze in bit zijn SM0 schrijf één, en in bits SM1- nul ( SM1 = 0 en SM0 = 1). Chip pin TxD gebruikt om informatie over te dragen, output RxD- voor de receptie.

De verzending van een informatiebyte begint met het verzenden van een START-bit, gevolgd door acht informatiebits, en de verzending eindigt met een STOP-bit. Er worden dus 10 bits gebruikt om elke byte aan informatie over te dragen. De vorming van een START-bit en een STOP-bit gebeurt automatisch.

De baudrate kan worden ingesteld door Timer 1 of Timer 2, of een combinatie van beide, één voor zenden en één voor ontvangen. Het gebruik van timers 1 en 2 is typisch voor de hele MCS-51/52-familie, hoewel Timer 2 alleen in oudere modellen voorkomt, maar in de ADuC842-microcontroller is het mogelijk om de UART-transceiver te synchroniseren met een speciale Timer 3, waardoor er algemene timers voor het uitvoeren van andere functies.

Gegevensoverdracht begint wanneer het register SBUF het verzonden nummer is in software geschreven. De gegevens worden verzonden zolang: TxD het STOP-bit wordt niet ontvangen, waarna de zender-interruptvlag ( TI) wordt ingesteld op één, zoals weergegeven in de onderstaande afbeelding:

Afbeelding 1 - Byte-overdrachtsdiagram

Om de ontvangst van gegevens via de seriële poort in bits mogelijk te maken REN de logische eenheid moet worden geschreven. De ontvangst van de databyte begint met de aankomst op de lijn RxD START-bit: overgang van de lijn van een hoog logisch niveau naar een laag. Aan het einde van de ontvangst van de hele byte, de interruptvlag van de ontvanger RI is ingesteld op één en de ontvangen byte kan programmatisch worden gelezen uit het bufferregister SBUF.

Bedrijfsmodus 2: asynchrone 9-bit modus met vaste snelheid. De standaard baudrate is f core / 32, maar indien geschreven in bits SMOD register PCON logische eenheid, dan wordt de baudrate verdubbeld: f core / 16. Om de tweede modus te selecteren, moet dit in bit zijn SM0 schrijf logische nul, en in bit SM1- eenheid ( SM1 = 1 en SM0 = 0).

In deze modus bestaat elk verzonden of ontvangen bericht uit elf bits: START-bit, acht informatiebits, de negende programmeerbare bit en een STOP-bit. Het negende bit wordt vaak gebruikt als pariteitsbit voor pariteit, hoewel het voor elk ander doel kan worden gebruikt.

Ontvangst en verzending in de tweede modus wordt op dezelfde manier uitgevoerd als in de eerste modus. De negende bit tijdens verzending wordt programmatisch naar de bit geschreven TB8 register SCON, bij ontvangst van de negende bit is in RB8 register SCON.

Bedrijfsmodus 3: asynchrone 9-bits modus met configureerbare snelheid. Om de derde modus te selecteren, ga naar bits SM0 en SM1 schrijf logische eenheden ( SM1 = 1 en SM0 = 1). In deze modus werkt de UART seriële poort hetzelfde als in modus 2, alleen wordt de snelheid ingesteld door timers 1, 2 of 3, net als in modus 1.

In alle vier de modi begint de gegevensoverdracht met elke instructie die naar het register schrijft SBUF nummer. In modus 0 start de ontvangst op voorwaarde RI = 0 en REN = 1... In alle andere modi begint de ontvangst met de aankomst van een START-bit, op voorwaarde dat in bit REN logische eenheid is geschreven ( REN = 1).

3.3 Berekening van UART-timingparameters

De seriële poort van de ADuC842 is standaard geconfigureerd om te klokken vanaf Timer 1. De UART-baudsnelheid wordt bepaald door de overlooptijd van de timer:

waarbij T T de tijd van de timerwerking is.

De timer moet worden geconfigureerd om te werken in de modus voor automatisch herladen (modus 2). Om deze modus in de bovenste 4 bits van het register in te stellen: TMOD je moet de binaire combinatie 0010b schrijven. In dit geval wordt de gegevensoverdrachtsnelheid bepaald door de formule:

waarbij: f kern de frequentie van de microprocessorkern is, TH1 de inhoud van het gegevensregister is TH1.

Vanuit formule 2 is het gemakkelijk om de registerwaarde te vinden TH1 het verstrekken van de vereiste snelheid:

Het resultaat van de berekening moet worden afgerond op het dichtstbijzijnde gehele getal.

Het gebruik van Timer 1 om de UART te synchroniseren is niet altijd mogelijk om de vereiste frequentie met voldoende nauwkeurigheid te verkrijgen. Met een microprocessorkernklok van 2097kHz (de standaard voor de ADuC842) wil je bijvoorbeeld een baudrate van 19,2 kbps. Met formule 3 vinden we de waarde van TH1:

Met behulp van deze TH1-waarde berekenen we de werkelijke baudrate van de UART:

De werkelijke snelheid is 14% lager dan de vereiste snelheid, waardoor gegevensoverdracht onmogelijk is. Het probleem werd opgelost door een speciale timer 3 toe te voegen, gespecialiseerd voor zeer nauwkeurige UART-timing over een breed frequentiebereik. Bovendien maakt het gebruik van een speciale timer timers voor algemene doeleinden vrij voor verschillende andere doeleinden.

Timer 3 is in feite een set configureerbare delers van de kernklokfrequentie, het blokschema van de timer wordt weergegeven in de onderstaande afbeelding:


Figuur 2 - Blokschema van Timer 3

Timer 3 wordt bestuurd door twee registers van speciale functies - T3CON en T3FD... Register T3CON bevat een beetje T3EN, wanneer er een logische eenheid naar wordt geschreven, wordt de UART gesynchroniseerd vanaf Timer 3, anders - vanaf Timer 1. De onderste drie bits van het register T3CON bepaal de binaire deler DIV... Fractionele delingsfactor instelbaar per register T3FD.

T3CON- configuratieregister door Timer 3.
SFR het adres - 0x9E.
Waarde na inschakelen 0x00.

Tabel 2 - Toewijzing van bits van register T3CON

Kamer geheugensteuntjes Beschrijving
7 T3EN Timerresolutie 3.
Als de bit is ingesteld ( T3EN = 1) Synchronisatie van de seriële poort ontvanger en zender komt van Timer 3.
Wanneer het bit is gewist ( T3EN = 0) - synchronisatie van Timer 1.
6 Niet gebruikt
5
4
3
2 DIV2 Gehele scheidingsbits DIV.
DIV2 DIV1 DIV0 DIV
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7
1 DIV1
0 DIV0

T3FD- Timerregister 3.
SFR het adres - 0x9D.
Waarde na inschakelen 0x00.
Het register heeft geen bitsgewijze adressering.

Met behulp van het Timer 3-blokdiagram is het gemakkelijk om een ​​analytische uitdrukking te schrijven om de resulterende seriële poortsnelheid te berekenen:

waarbij f-kern de frequentie van de microcontroller-kern is.

Delerwaarde DIV kan worden bepaald met formule 5, de resulterende waarde moet naar beneden worden afgerond op het dichtstbijzijnde gehele getal.

Fractionele deler T3FD kan worden gevonden met formule 6, de resulterende waarde moet worden afgerond op het dichtstbijzijnde gehele getal.

Laten we de configuratieparameters van Timer 3 berekenen, voor het vorige voorbeeld: met een van 2097 kHz, moet u een transmissiesnelheid van 19,2 kbps krijgen.

De fout bij het instellen van de snelheid is dus slechts 0,2%.

3.4 Kenmerken van de presentatie van tekstinformatie

Verschillende besturingssystemen gebruiken speciale tekensets om tekstinformatie weer te geven. In de regel wordt een dergelijke set gepresenteerd in de vorm van een tabel, waarbij elk teken overeenkomt met een binaire reeks van één of meerdere bytes. In de literatuur wordt zo'n symbooltabel vaak een "codering" genoemd. Veruit de meest voorkomende code is ASCII(American Standard Code for Information Interchange - American Standard Code for Information Interchange), die wordt gebruikt voor de interne weergave van tekeninformatie in het MS DOS-besturingssysteem, in Windows Kladblok en voor het coderen van tekstbestanden op internet.

Omdat ASCII oorspronkelijk bedoeld was voor de uitwisseling van informatie, worden naast informatiesymbolen ook commandosymbolen gebruikt om de communicatie te regelen. In de volgende tabel worden dergelijke tekens weergegeven met een ellips.

Tabel 3 - ASCII-tabel

.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .EEN .B .C .D .E .F
0. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2. ! " # $ % & " ( ) * + , - . /
3. 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4. @ EEN B C D E F G H I J K L m N O
5. P Q R S t jij V W x ja Z [ \ ] ^ _
6. ` een B C D e F G H I J k ik m N O
7. P Q R s t jij v met wie x ja z { | } ~ ...

De codetabel bevat 8 kolommen en 16 regels, waarbij elke regel en kolom in hexadecimale notatie is genummerd. De hexadecimale weergave van de ASCII-code bestaat uit het kolomnummer en het regelnummer waarin het teken staat, waarbij het regelnummer het eerste cijfer vormt (meest significante vier bits), en het kolomnummer het tweede cijfer vormt (minst significante 4 stukjes). Dus de ASCII-code van het teken "E" is bijvoorbeeld het getal 0x45 en het teken "\" is 0x5C.

Het is gemakkelijk te zien dat de onderstaande tabel 128 tekens bevat, terwijl één teken wordt gecodeerd door een byte - acht bits. Het feit is dat de bovenste waarden (128-255) kunnen worden ingenomen door verschillende extra tekens, bijvoorbeeld de set van het Russische alfabet, dit hangt af van het specifieke type codering.

3.5 Manieren van software-implementatie van de UART

Voor de eerste toegang tot de UART-transceiver moet de seriële poort worden geconfigureerd: de bedrijfsmodus wordt bepaald, de klokbron wordt geselecteerd en geconfigureerd. UART-modus wordt ingesteld door bits SM0 en SM1 register SCON... Aangezien het register zowel byte- als bitadressering heeft, kan de instelling op verschillende manieren worden gedaan: naar het register schrijven SCON gewenste nummer of stel elke bit afzonderlijk in. De synchronisatiebron wordt bepaald door de bit T3EN register T3CON: als er een logische naar deze bit wordt geschreven, dan zal de synchronisatie plaatsvinden vanaf Timer 3, als er niets wordt geschreven (standaard T3EN = 0), vervolgens synchronisatie vanaf Timer 1.

Wanneer u Timer 1 gebruikt, moet u deze configureren om in modus 2 te werken (free-running timer met auto-reload), hiervoor in de bovenste vier bits van het register SMOD de binaire combinatie 0010b moet worden geschreven. Teller register TH1 bepaalt de overdrachtssnelheid van informatie op de UART, de waarde ervan moet worden berekend met behulp van de formule 3. Na opname: TH1 de timer moet gestart worden, dit doe je door naar een bit te schrijven TR1 register TMOD logische eenheid.

Bij synchronisatie vanaf Timer 3 worden de delers berekend met formule 5 en 6 DIV en T3FD... Als de delerinvoer T3FD rechtstreeks in het register gedaan T3FD, dan de deler DIV bepaald door de minst significante drie bits van het register T3CON, terwijl in het meest significante deel van dit register ( T3EN) moet een logische eenheid worden geschreven. De timer start automatisch.

Het verzenden van gegevens via UART begint met elk commando, waarvan het resultaat naar het register wordt geschreven SBUF:

SBUF = 0x45; // stuur het teken "E"

Je hoeft niet elke keer de ASCII-tabel te gebruiken om de tekencode te bepalen, de taal C heeft hier een handig hulpmiddel voor: zet gewoon het vereiste teken tussen apostrofs, de compiler interpreteert dit als een tekencode.

SBUF = "E"; // stuur het teken "E"

Als u meer dan één teken moet verzenden, moet u voordat de volgende code wordt geschreven naar: SBUF, moet u wachten tot het vorige teken is verzonden. Het einde van de verzending wordt aangegeven door een vlag TI register TCON wanneer de overdracht is voltooid, in bits TI een logische eenheid is in hardware geschreven. U kunt een controle in een lus programmatisch organiseren TI gelijk zijn aan nul, en de volgende byte alleen verzenden wanneer TI zal gelijk zijn aan één:

SBUF = 0x45; // stuur het teken "E" terwijl (! TI); // terwijl TI nul is, doe een lege lus TI = 0; // wis de vlag voor de volgende overdracht

De ontvangst van een byte wordt op dezelfde manier uitgevoerd. De ontvangen byte kan pas uit het bufferregister worden gelezen als de laatste bit en de ontvangstvlag zijn ontvangen. RI set.

terwijl (! RI); // wacht tot de byte-ontvangst is voltooid cmd = SBUF; // lees de ontvangen byte in de cmd variabele RI = 0; // reset de ontvangstvlag

In toepassingen waar de uitvoeringstijd van cruciaal belang is, is het onaanvaardbaar om tijdens de verzending veel tijd te besteden aan het wachten op de verzending van de byte en de buffer vrij is, in dit geval, zonder te wachten tot de volledige byte is verzonden, gaat u verder met de uitvoering van het verdere programma, maar voordat u de volgende byte verzendt, moet u ervoor zorgen dat de buffer vrij is en dat de zender klaar is voor gebruik. Het gedeelte van het programma dat de databyte verzendt, kan als volgt worden gewijzigd:

terwijl (! TI); // wacht tot de overdrachtsbuffer vrij is (indien bezet) SBUF = 0x45; // vul de buffer en start de overdracht TI = 0; // reset de overdrachtsvlag naar nul

Deze implementatie elimineert pauzes bij het uitvoeren van programma's tussen overdrachten van individuele bytes.

Onderstaande figuur 3 toont de adressen van de registers van bijzondere functies die in het werk worden gebruikt.


Figuur 3 - Adressen van registers van speciale functies

Houd er bij het schrijven van een programma rekening mee dat het programma voor de microcontroller moet worden uitgevoerd voordat het apparaat wordt uitgeschakeld en niet kan worden voltooid. Daarom moet het programma een oneindige lus bevatten.

3.6 Interactie van de microcontroller met een personal computer

De LESO1 educatieve laboratoriumstandaard is verbonden met een personal computer via een USB-UART-interfaceconvertermicroschakeling. Voor communicatie met de microcontroller is een terminal geïmplementeerd in het nwFlash-bootloaderprogramma. Met de terminal kunt u informatie via de seriële poort naar de microcontroller sturen, informatie ontvangen en weergeven die van de microcontroller is ontvangen. De terminal wordt geconfigureerd in het hoofdmenu-item "Terminalopties". Terminal-opties maken het volgende mogelijk:

  1. selecteer de gegevensweergavemodus: tekst of hexadecimaal, terwijl het type gegevens dat wordt verzonden ook wordt gewijzigd;
  2. kies codering ANSI(Windows-1251) of ASCII(DOS-866);
  3. schakel de automatische tekst-scrollmodus in en uit;
  4. wis het terminalvenster;
  5. sla de informatie die van de microcontroller is ontvangen op in een bestand:
    • zoals het kwam - het menu-item "Opslaan";
    • zoals het wordt weergegeven in de terminal - het menu-item "Opslaan als tekst".

Figuur 4 toont het tabblad van het hoofdmenu "Terminal opties".


Afbeelding 4 - Terminalopties configureren Figuur 5 - Instellen van de snelheid van de UART

Bij het uitwisselen van gegevens met de trainingsstandaard is het noodzakelijk om de gewenste verbindingssnelheid in te stellen. Dit kan in het menu "verbinding", zoals weergegeven in figuur 5.

4 Opdracht voor werk in het laboratorium

4.1 Informatie uitvoeren via de seriële poort

  1. Ontwikkel een algoritme voor een programma dat gegevens via een UART-seriële poort naar een personal computer verzendt - de naam van een student. De gegevensoverdrachtsnelheid moet overeenkomen met de optie (tabel 5). De UART-klokbron (Timer 1 of Timer 3) wordt overeengekomen met de docent. De interactie van de microcontroller met de computer wordt uitgevoerd via de terminal van het bootloader-programma - nwFlash.
  2. Raadpleeg de tabel met speciale functiesregisters (SFR) om de controleregisteradressen en seriële poortinstellingen te bepalen.
  3. Bepaal de waarde van de registers voor seriële poortinstellingen en de timer die wordt gebruikt voor synchronisatie.
  4. Bereken de waarden van de registers van de timer die wordt gebruikt voor synchronisatie.
  5. Ga naar de geïntegreerde programmeeromgeving van Keil-C. Bouw en configureer het project waar nodig.
  6. Ontwikkel en voer de tekst van het programma in in overeenstemming met het gemaakte algoritme.
  7. Vertaal het programma en corrigeer de syntaxisfouten.
  8. Pas de UART-baudrate van de nwFlash-programmaterminal aan volgens de taak.
  9. Download de ontvangen * .hex bestand naar de LESO1-laboratoriumbank.
  10. Zorg ervoor dat de achternaam van de student wordt weergegeven in het terminalvenster.

4.2 Microcontroller-besturing via seriële poort (optioneel)

  1. Pas het programma zo aan dat gegevens van de microcontroller alleen worden verzonden door een opdracht die vanaf de computer wordt verzonden. De opdracht wordt verzonden via de nwFlash-terminal.
  2. Download de ontvangen * .hex bestand naar de LESO1-laboratoriumbank.
  3. Zorg ervoor dat het programma werkt zoals verwacht.

Tabel 5 - Opties voor taken

optie nummer UART-snelheid
1 300 bps
2 600 bps
3 1200 bps
4 1800 bps
5 2400 bps
6 4800 bps
7 7200 bps
8 9600 bps
9 600 bps
10 1200 bps
11 1800 bps
12 2400 bps
13 4800 bps
14 7200 bps
15 9600 bps

5 Instructies voor rapportage

Het rapport moet bevatten:

  1. Objectief.
  2. Serieel communicatieschema.
  3. Berekening van synchronisatieparameters (timerinstellingen).
  4. Een grafisch diagram van het algoritme van het programma.
  5. De broncode van het programma.
  6. De inhoud van het lijstbestand van het softwareproject.
  7. Conclusies over het uitgevoerde laboratoriumwerk.

De schema's, evenals het rapport als geheel, worden uitgevoerd in overeenstemming met de ESKD-normen.

UART-communicatieprotocol
Universele asynchrone transceiver

Voorwoord

Moderne digitale elektronica zijn altijd verbindingen tussen circuits (processors, controllers, enz.) om een ​​symbiotisch systeem te creëren. Om ervoor te zorgen dat individuele microschakelingen elkaar "begrijpen", moeten ze een gemeenschappelijk communicatieprotocol delen. In de loop van de jaren van de digitale technologie zijn er veel protocollen ontwikkeld. Over het algemeen kunnen ze allemaal in twee grote groepen worden verdeeld - parallel en sequentieel.

Parallel of sequentieel?

Parallelle interfaces verzenden gelijktijdig (parallel) verschillende stukjes informatie (vandaar hun naam). Om gegevens te verzenden, hebben deze interfaces bussen van 8, 16 of meer geleiders nodig.

Parallel 8-bits interfacediagram. De gegevensoverdracht wordt bestuurd door de CLK-klok. Op elke CLK-puls wordt een databyte verzonden. Er worden 10 draden gebruikt.

In tegenstelling tot parallelle interfaces zenden seriële interfaces één bit tegelijk uit. In theorie kan zo'n interface op een enkele draad werken. In de praktijk worden er maximaal vier gebruikt.

Deze twee interfaces zijn te vergelijken met de stroom auto's. Parallel is een brede snelweg met meer dan acht rijstroken, terwijl serieel meer op een landelijke weg met twee rijstroken lijkt. Mega - Highway heeft potentieel een hogere verkeerscapaciteit, maar is qua aanleg erg duur. Een landelijke weg vervult gewoon zijn functie en is vele malen goedkoper dan een meerbaans megasnelweg.

Het lijdt geen twijfel dat parallelle interfaces hun voordelen hebben. Het is rechtlijnigheid, snelheid en gemak van implementatie. Maar we krijgen het ten koste van een groot aantal datatransmissiedraden (lijnen). Als je ooit programma's voor microcontrollers hebt moeten ontwikkelen (bijvoorbeeld in een Arduino-omgeving), weet je waarschijnlijk hoe kostbaar I/O-lijnen kunnen zijn. Daarom kiezen we vaak voor seriële communicatie, waarbij we snelheid opofferen, maar kostbare microcontrollerpoorten besparen.

Asynchrone seriële interface

Tijdens het bestaan ​​van digitale technologie zijn er tientallen seriële protocollen gecreëerd. USB (Universal Serial Bus) en Ethernet zijn voorbeelden van de twee meest populaire seriële protocollen van tegenwoordig. Andere zeer populaire seriële interfaces zijn SPI, I2C en serieel, die in dit artikel worden besproken. Elk van deze interfaces kan worden ingedeeld in een van de twee subgroepen: asynchroon en synchroon.

Het synchrone protocol bevat altijd een kloklijn. Dit zorgt voor eenvoudigere (en vaak snellere) gegevensoverdracht, maar vereist ten minste één extra draad. Voorbeelden van synchrone interfaces zijn SPI en I2C.

Een asynchrone interface betekent dat gegevens worden verzonden zonder de ondersteuning van een extern kloksignaal.Deze overdrachtsmethode is ideaal om het aantal draden te minimaliseren, maar dat betekent, maar het kost extra inspanning om gegevens betrouwbaar te verzenden en ontvangen. De seriële interface, die we in dit artikel zullen bespreken, is de meest voorkomende en oude asynchrone en protocol. Het komt vaak voor dat wanneer een persoon "opeenvolgend" zegt, hij verwijst naar dit specifieke protocol.

De betreffende asynchrone seriële interface wordt veel gebruikt in embedded systemen. Als u GPS, Bluetooth, XBee, seriële LCD's of vele andere externe apparaten aan uw project wilt toevoegen, moet u waarschijnlijk een van de seriële interfaces tegenkomen.

Seriële interface regels.
Het Asynchronous Serial Protocol heeft een aantal ingebouwde regels - mechanismen die helpen zorgen voor een betrouwbare en foutloze overdracht van gegevens. Dit zijn de mechanismen waarmee gegevens kunnen worden verzonden zonder een extern kloksignaal te gebruiken:

databits
- Synchronisatiebits
- Pariteitsbits
- Transmissiesnelheid

Door de combinatie van deze regels - parameters is het protocol zeer flexibel. Voor een succesvolle communicatie moet u ervoor zorgen dat beide apparaten op de bus zijn geconfigureerd om dezelfde regels te gebruiken.

Transmissiesnelheid:

Deze parameter definieert de baudrate van de seriële lijn. Dit wordt meestal uitgedrukt in eenheden van bits per seconde (bps of baud). Als u deze baudparameter omkeert, krijgt u de tijd die nodig is om één bit te verzenden. Deze waarde bepaalt hoe lang de zender de seriële lijn hoog/laag houdt, of hoe lang het ontvangende apparaat zijn lijn bemonstert.

De overdrachtssnelheid kan binnen redelijke grenzen bijna alles zijn. De enige vereiste is dat beide apparaten op dezelfde snelheid werken. Een van de meest voorkomende baudrates, vooral voor eenvoudige toepassingen waarbij snelheid niet essentieel is, is 9600 bps. Andere "standaard" snelheden zijn 1200, 2400, 4800, 19200, 38400, 57600 en 115200.

Hoe hoger de baudrate, hoe sneller de verzending en ontvangst van gegevens. Maar er zijn fysieke beperkingen voor maximale snelheid. Meestal zie je in de praktijk geen snelheden hoger dan 115200. Voor de meeste microcontrollers is dit de maximale snelheid. Als u een te hoge snelheid kiest, verschijnen er onvermijdelijk fouten op
gastheer kant.

Gegevensframes

Elk gegevensblok (meestal een byte) wordt feitelijk verzonden in een pakket of bitframe. Frames worden gemaakt door synchronisatiebits en pariteitsbits toe te voegen aan databits.

Laten we elk deel van het frame eens nader bekijken.

Gegevensbrok

Het belangrijkste onderdeel van elk pakket is het gegevensblok, omdat dit blok het blok is dat nuttige informatie bevat. We noemen dit stuk bewust een stuk, omdat de grootte niet specifiek is gespecificeerd. De hoeveelheid gegevens in elk pakket kan op alles worden ingesteld - van 5 tot 9 bits. Natuurlijk is de standaard datagrootte onze belangrijkste 8-bit byte, maar er zijn ook andere formaten in gebruik. Een 7-bits gegevensblok kan efficiënter zijn dan een 8-bits blok, vooral als u alleen 7-bits ASCII-tekens (tekst) inpakt.

Nadat over de lengte van het symbool is onderhandeld, moeten beide apparaten op de seriële bus ook onderhandelen over de geldigheid van hun gegevens. Zijn de gegevens het meest significante bit (msb) het minst significant, of vice versa? Tenzij anders vermeld, nemen we over het algemeen aan dat de minst significante bit (lsb) het eerst wordt verzonden

Synchronisatiebits

Synchronisatiebits zijn twee of drie speciale bits die met elk stuk gegevens worden verzonden. Dit zijn start- en stopbits. Deze bits markeren het begin en het einde van het pakket. Er is altijd maar één startbit, maar het aantal stopbits is apart configureerbaar. Er kunnen een of twee stopbits zijn (meestal wordt er één gebruikt).

Het startbit wordt altijd bepaald door de datalijn bij zijn val (overgang van 1 naar 0), terwijl de stopbits worden bepaald door de lijn aan de rand, dat wil zeggen bij de overgang van 0 naar 1.

Pariteitsbits

Pariteit is een vorm van zeer eenvoudige foutcontrole op laag niveau. Er kunnen twee opties zijn voor een dergelijke controle: oneven of even. Om een ​​pariteitsbit te maken, worden alle 5-9 bits van het datablok opgeteld, en de pariteit van de som bepaalt of de pariteitsbit is ingesteld of niet. Laten we ons bijvoorbeeld voorstellen dat onze controle is ingesteld op pariteitsmodus. De databyte in binaire representatie is 01011101. We zien dat de byte een oneven aantal enen bevat (vijf enen). In dit geval wordt de pariteitsbit op 1 gezet. Als we de controlemodus op oneven zetten, wordt de controlebit respectievelijk op 0 gezet.

Voorbeeld van protocolinstelling: 9600 8N1

9600 8N1 - 9600 baud, 8 databits, geen pariteit en 1 stopbit is een van de meest gebruikte seriële protocolinstellingen. Dus hoe ziet een pakket of twee van 9600 8N1-gegevens eruit? Laten we een voorbeeld geven:


In feite worden voor elke byte overgedragen gegevens 10 bits verzonden: startbit, 8 databits en stopbit. Dus bij 9600 bps verzenden we in feite 9600 bps of 960 (9600/10) bytes per seconde.

Nu u weet hoe u sequentiële pakketten moet maken, kunnen we doorgaan naar de hardwaresectie.
We zullen zien hoe dit alles op signaalniveau zal worden geïmplementeerd.

Een seriële bus bestaat uit slechts twee draden: één voor het verzenden van gegevens en de andere voor het ontvangen. Seriële apparaten moeten dus twee opeenvolgende pinnen hebben: ontvanger, ( RX) en zender ( TX).

Het is belangrijk om te begrijpen dat de aanduidingen RX en TX verwijzen naar het apparaat zelf. Dus RXéén apparaat moet verbinding maken met: TX de andere, en omgekeerd. Dit lijkt misschien vreemd als u gewend bent om VCC met VCC, GND met GND, MOSI met MOSI, enz. te verbinden. Maar het is nog steeds logisch, aangezien de zender ( TX) moet met de ontvanger praten ( RX) in plaats van met een andere zender.

De seriële interface waarin beide apparaten gegevens kunnen verzenden en ontvangen, wordt genoemd: duplex of half duplex . duplex betekent dat beide apparaten tegelijkertijd kunnen verzenden en ontvangen. Half duplex communicatie betekent dat seriële apparaten om de beurt gegevens moeten verzenden en ontvangen.

Sommige seriële bussen kunnen functioneren met slechts één draad tussen het verzendende en ontvangende apparaat. Serie-LCD's zenden bijvoorbeeld eigenlijk geen gegevens terug naar het besturingsapparaat. Het heet simplex seriële communicatie. Alles wat je nodig hebt is een draad TX meester om te pinnen RX beheerd.

Hardware-implementatie

We hebben het asynchrone seriële protocol dus vanuit conceptueel oogpunt bekeken. We weten wat voor kabels we nodig hebben. Maar hoe verloopt seriële communicatie op signaalniveau? Sterker nog, op verschillende manieren. Er zijn allerlei normen. Laten we eens kijken naar een paar van de meest populaire seriële hardware-implementaties: logisch niveau (TTL) en RS-232.

Wanneer microcontrollers en andere low-level IC's met elkaar communiceren via een serieel protocol, doen ze dat meestal op TTL-niveau (transistor-transistor logic). Seriële TTL-signalen leven tussen het voedingsspanningsbereik van de microcontroller - meestal 0 tot 3,3 V of 5 V. Een signaal op VCC-niveau (3,3 V, 5 V, enz.) geeft aan dat het inactief is of dat het bit 1 data of stopbit is. Het 0 V-signaal (GND) is ofwel het startbit of het databit van de waarde 0.

De interface die op sommige oudere computers en randapparatuur wordt aangetroffen, is vergelijkbaar met gewone TTL-serie. Ze hebben alleen verschillende spanningsniveaus. Typisch variëren RS-232-signalen van -13 V tot + 13 V, hoewel de specificatie alles tussen +/- 3 V tot +/- 25 V toestaat. Lage spanning (-5 V, -13 V, enz.) ) geeft ofwel rust- of stopbit of databit met waarde 1. Hoog RS-232-signaal betekent ofwel startbit of 0 databit. Signaalpolariteit is het tegenovergestelde van seriële TTL.

In embedded circuits (binnen een enkel apparaat) is het veel gemakkelijker om TTL seriële signalen te gebruiken. Maar in het geval van lange datalijnen zijn lage TTL-niveaus veel gevoeliger voor verlies en interferentie. RS-232 of complexere standaarden zoals RS-485 zijn beter geschikt voor seriële transmissies over lange afstand.

Wanneer u twee seriële apparaten met elkaar verbindt, is het belangrijk om ervoor te zorgen dat hun signaalspanningen overeenkomen. U kunt een TTL-serieel apparaat niet rechtstreeks aansluiten op de RS-232-bus. U zult hun niveaus moeten converteren voor wederzijdse compatibiliteit.

UART

De Universal Asynchronous Receiver / Transmitter (UART) is een circuitblok dat verantwoordelijk is voor het implementeren van seriële communicatie. In wezen fungeert de UART als tussenpersoon tussen parallelle en seriële interfaces. Aan het ene uiteinde van de UART is er een bus van acht (of zo) datalijnen (plus enkele besturingspinnen), aan de andere kant zijn er twee seriële draden - RX en TX.

UART-interfaces bestaan ​​als afzonderlijke microschakelingen, maar zijn meestal ingebouwd in microcontrollers. Om erachter te komen of uw MK een UART-protocol heeft, moet u de datasheet van deze controller lezen. Sommige hebben er geen, sommige hebben, sommige hebben er meerdere. Zo heeft de Arduino Uno, gebaseerd op de goede oude ATmega328, maar één UART, terwijl de Arduino Mega - gebaseerd op de ATmega2560 - vier UART's heeft.

R en T in UART-terminologie zijn verantwoordelijk voor het verzenden en ontvangen van seriële gegevens. Aan de zendzijde moet de UART een datapakket maken - sync- en pariteitsbits toevoegen - en dit pakket over de TX-lijn verzenden volgens de ingestelde baudrate. Aan de ontvangstzijde moet de UART de RX-lijn testen met een baudrate die overeenkomt met de verwachte baudrate, synchronisatiebits selecteren en gegevens extraheren.

Aangezien ik UART ga gebruiken om blogapparaten met je projecten te verbinden, zal ik je een beetje vertellen hoe het werkt en hoe je het kunt gebruiken.

De universele asynchrone ontvanger/zender (UART) is een vrij oude en veel voorkomende interface. Tot voor kort was de COM-poortconnector (dezelfde UART, alleen de spanningsniveaus zijn anders) een verplicht attribuut van elke computer. Nu is de COM-poort stilaan aan het "sterven" en als het op "torens" nog niet ongewoon is, dan is het op laptops niet meer in zicht. Maar gezien de eenvoud en populariteit van de interface, heeft de overgrote meerderheid van microcontrollers een UART als onderdeel van hun randapparatuur. En als een UART van een personal computer niet meer voldoet vanwege de lage snelheid en de onmogelijkheid van uitbreiding, dan is de interface handig voor microcontrollers en zal het gebruik ervan worden voortgezet.
Aangezien de UART in veel microcontrollers zit, zullen we deze gebruiken als een van de communicatie-interfaces van de blog-apparaten met uw elektronische apparaten.
Beginnen een kleine theorie over hoe de interface werkt(zonder verdere details). Voor communicatie via de UART-interface worden twee controllerpoten gebruikt RXD- om berichten te ontvangen (Ontvanger) en TXD- om berichten te verzenden (zender). UART is een full-duplex interface. Dit betekent dat de ontvanger en zender onafhankelijk van elkaar werken. Bovendien kan de zender of ontvanger afzonderlijk worden uitgeschakeld door de voet van de controller vrij te maken voor andere behoeften. Verzending (respectievelijk en ontvangst) van berichten wordt uitgevoerd in vaste bitpakketten (een dergelijk pakket wordt een frame genoemd). Het frame bestaat uit: begin beetje(elk frame begint ermee), databits(kan 5 tot 9 bits zijn), pariteitsbit(controleren van de juistheid van de gegevensoverdracht) en een of twee stopbits(signaal over het einde van het frame).

waar:
INACTIEF- wachten op een uitwisseling - zou moeten zijn 1 ;
St- Start beat - altijd 0 ;
(N)- Gegevensbits - kunnen 5 tot 9 bits zijn;
P- Pariteitsbit;
Sp- Stop beat - altijd 1.

Als het pakket meer dan één byte bevat, wordt elke volgende byte in een apart frame verzonden. Datatransmissie (en ontvangst) gebeurt op bepaalde vaste frequenties (gemeten in Baud = bits/sec) van 600 tot 128.000 Baud. Voorwaarde voor een goede werking van de poort is het instellen van dezelfde parameters voor zowel de ontvanger als de zender (snelheid, aantal databits, pariteitsbits, aantal stopbits).

Laten we het eens worden over het frameformaat (UART-instellingen) voor blogapparaten:
Transmissiesnelheid - 9600 (dit is binnen een kilobyte per seconde);
Aantal databits - 8 (het is het handigst om te werken);
pariteitsbit - Ook al(pariteit wordt gecontroleerd);
Aantal stopbits - 1;
In verkorte vorm ziet het er als volgt uit:
Baudrate: 9600, 8 data, 1 stop, even pariteit

De UART kan ook in synchrone modus werken (hiervoor wordt nog een poot van de controller gebruikt) en ondersteunt de adressering van veel apparaten. Maar aangezien onze apparaten eenvoudig zijn en we deze functies niet nodig hebben, zullen we ze niet overwegen.

Als u extra functies nodig heeft, staat een volledige beschrijving van de UART in de datasheet van de microcontroller - raadpleeg deze.

Om het apparaat van de blog via de UART-interface met uw project te laten werken, hebt u het volgende nodig:
1 Sluit het blogapparaat aan op de bijbehorende pootjes van de microcontroller.
2 Configureer de UART-transceiver van uw controller. Schrijf hiervoor bepaalde waarden naar de bijbehorende I/O-poorten.
3 Zorg voor (schrijf)procedures voor het ontvangen/verzenden van berichten via UART in uw programma.

Laten we nu elk punt nader bekijken:


1 APPARATEN AANSLUITEN VIA UART.

Alles is hier eenvoudig:
- als zowel ontvangst als verzending zijn gepland - de apparaten zijn verbonden via twee lijnen - TX_device van RX_project en TX_project van RX_device (hierna, onder "apparaat" bedoel ik een apparaat uit een blog, en onder "project" - uw elektronische project);
- als alleen ontvangst nodig is (er worden bijvoorbeeld gegevens van het toetsenbord ontvangen) - TX_device van RX_project;
- als alleen verzending nodig is (bijvoorbeeld gegevens worden verzonden naar een weergaveapparaat) - TX_project van RX_device.


2 CONFIGURATIE VAN UART-ZENDER.

Zoals we hierboven hebben afgesproken, is het frameformaat voor onze apparaten:
Baudrate: 9600, 8 data, 1 stop, even pariteit
Om met dit frameformaat te werken, schrijft u in het apparaatinitialisatiegedeelte in uw programma de bijbehorende waarden naar de vereiste I / O-poorten van de controller. Open hiervoor het USART-gegevensbladgedeelte voor uw microcontroller en selecteer / bereken de vereiste waarden. Maar u kunt alles veel gemakkelijker maken - gebruik automatische randafstellingen - CodeWisards.
Neem bijvoorbeeld de Attiny2313-microcontroller (naar analogie kunt u elke microcontroller configureren) en configureer de UART in verschillende programmeertalen.

Om te beginnen - Algorithm Builder.
Alles is hier uiterst eenvoudig - we maken een project ( Bestand / Nieuw). We selecteren de microcontroller en de frequentie van de hoofdoscillator in Opties / Projectopties ...(ATtiny2313, interne 8MHz klok). Klik in de werkbalk op de knop "S"- customizer van controleregisters "select USART en vul in het venster dat opent alles in zoals op de afbeelding. Alles is daar ondertekend en begrijpelijk.


wij drukken op "OKE"... Klaar - UART is geïnitialiseerd en klaar om te werken.
Als je alleen een ontvanger of alleen een zender nodig hebt, plaats dan alleen het noodzakelijke selectievakje - een ongebruikte poot kan worden gebruikt als I / O-poort.

Aangezien interrupts in het programma worden ingeschakeld, moet u de stapelaanwijzer op het einde van het geheugen zetten voordat u de USART initialiseert ( "S"/ Stapelwijzer SP) en naar de bovenkant van het blok met het trefwoord " Resetten».


In monteur. Om eerlijk te zijn, weet ik niet of de assemblers voor AVR randafstellers hebben, maar zelfs als dat niet het geval is, is een eenvoudige oplossing om dezelfde Algorithm Builder te gebruiken. In het USART-instellingenvenster, aan de rechterkant, zijn er geheugensteuntjes (Operations) die de geselecteerde kenmerken leveren. Het is niet moeilijk om ze te vertalen naar assembly-code.

Wij vertalen in assembler commando's.

; USART-initialisatie Communicatieparameters: 8 gegevens, 1 stop, even pariteit; USART-ontvanger: aan; USART-zender: aan; USART-modus: asynchroon; USART-baudrate: 9600 uart_init: LDI R16, $ 00 OUT UBRRH, R16 LDI R16, $ 33 OUT UBRRL, R16 LDI R16, $ 26 OUT UCSRC, R16 LDI R16, $ 00 UIT UCSRA, R16 LDI R16, $ 98 UIT UCSRB, R16

; USART-initialisatie; Communicatieparameters: 8 gegevens, 1 stop, even pariteit; USART-ontvanger: aan; USART-zender: aan; USART-modus: asynchroon; USART-baudrate: 9600 uart_init: LDI R16, $ 00 OUT UBRRH, R16 LDI R16, $ 33 UIT UBRRL, R16 LDI R16, $ 26 UIT UCSRC, R16 LDI R16, $ 00 UIT UCSRA, R16 LDI R16, $ 98 UIT UCSRB, R16

CodeVision bevat zijn eigen perifere regelaar (CodeWisard), nog erger dan die van Algorithm Builder. Om UART-instellingen te genereren, klikt u op het tandwielpictogram ( CodeWisardAVR) op de werkbalk. Selecteer in het geopende venster eerst het tabblad Chip daarin selecteren we de microcontroller en stellen we de frequentie in waarmee de hoofdoscillator zal werken. Selecteer en vul vervolgens het tabblad in USART in overeenstemming met de vereiste kenmerken (als u alleen de ontvanger of alleen de zender nodig hebt, schakelt u het bijbehorende selectievakje in).

// USART-initialisatie // Communicatieparameters: // 8 gegevens, 1 stop, even pariteit// USART-ontvanger: aan // USART-zender: aan // USART-modus: asynchroon // USART-baudrate: 9600 UCSRA = 0x00; UCSRB = 0x98; UCSRC = 0x26; UBRRH = 0x00; UBRRL = 0x33;

// USART-initialisatie // Communicatieparameters: // 8 gegevens, 1 stop, even pariteit // USART-ontvanger: aan // USART-zender: aan // USART-modus: asynchroon // USART-baudrate: 9600 UCSRA = 0x00; UCSRB = 0x98; UCSRC = 0x26; UBRRH = 0x00; UBRRL = 0x33;

We slaan het gegenereerde project op ( Bestand \ Genereren, Opslaan en Afsluiten) - klaar. Een project gemaakt met alle benodigde instellingen voor de UART. Ook andere randapparatuur (vaak overbodig) wordt in het project geïnitialiseerd. Nadat u een project hebt gemaakt, kunt u het corrigeren - verwijder alles wat u niet nodig hebt.


3 PROCEDURES VOOR UART-BERICHTEN MAKEN.

Een kleine uitweiding.
Het werken met de UART kan op verschillende manieren worden georganiseerd. Bijvoorbeeld:
- wacht gewoon in de hoofdtekst van het programma wanneer een bericht binnenkomt en controleer constant het berichtontvangstbit;
- schakel de interrupt in en verwerk het bericht in de interrupt-body;
- maak een buffer waar berichten worden aangestuurd door interrupts, en lees al in de hoofdtekst van het programma, "door vrijheid", waarden uit de buffer;
- een heleboel opties - de keuze is aan jou.
Maar gebaseerd op het feit dat berichten van apparaten voor het grootste deel enkelvoudig (één byte) en niet te frequent zijn (neem bijvoorbeeld een toetsenbord - een paar klikken per seconde, niet meer), de beste optie in termen van om geheugen en verwerkingssnelheid te besparen, zal het UART-bericht in de interrupt-body worden verwerkt. Met verwerken bedoel ik het lezen van registers, het controleren op correcte ontvangst en het opslaan van de ontvangen byte in een globale variabele (een soort buffer van één byte). Als eenvoudige manipulaties met de ontvangen byte worden aangenomen, kunnen deze ook in de interrupt-body worden georganiseerd.

In de toekomst zal ik me concentreren op zo'n algoritme van werk, als een ander niet meer gerechtvaardigd is.

Algoritme bouwer.
Data ontvangen wordt uitgevoerd in de interruptafhandelingsroutine aan het einde van de byte (frame) ontvangst. De ontvangen byte wordt naar de globale variabele geschreven Van GCnDevice. In de hoofdtekst van het programma wordt de FromGCnDevice-waarde gecontroleerd als deze nul is, er wordt niets ontvangen.

Als het gemakkelijk is om met de ontvangen waarde te werken, kunt u dit rechtstreeks doen in de hoofdtekst van de interruptafhandeling.
Data overdracht uitgevoerd zonder het gebruik van interrupts en buffers (hardware van de UART-zender heeft een 2-byte buffer). Dit betekent dat alleen enkele bytes comfortabel worden overgedragen (wat we van plan zijn te doen). Laad je in één keer een datalijn, dan zal de microcontroller alleen deze lijn afhandelen.

Assembler.
De byte wordt ontvangen in een interrupt, het resultaat blijft in register r17 (indien nodig, sla het op in SRAM).

; Afhandeling onderbreken aan het einde van byte-ontvangst DRUK R16 IN R16, SREG DRUK R16 IN R16, UCSRA ; Status lezen van UCSRA IN R17, UDR ; Gegevens lezen uit UDR ANDI R16, $ 1C BREQ _END ; Controleer op fouten CLR R17 _END: ; in R17 is de ontvangen byte POP R16 UIT SREG, R16 POP R16 RETI

; Afhandeling onderbreken aan het einde van ontvangst van de byte PUSH R16 IN R16, SREG PUSH R16 IN R16, UCSRA; Status lezen van UCSRA IN R17, UDR; Gegevens lezen van UDR ANDI R16, $ 1C BREQ _END; Controleren op fouten CLR R17 _END:; in R17 is de ontvangen byte POP R16 OUT SREG, R16 POP R16 RETI

Byte-overdracht

LDI R16, SBIS-waarde UCSRA, UDRE RJMP PC-1; wachten op de gereedheid om de OUT UDR-byte, R16, te ontvangen; helmbyte


С - in het CodeVisionAVR-programma.
Alles is hier eenvoudig.CodeWizard creëert samen met UART-initialisatie procedures voor ontvangen en verzenden. Het enige dat u hier kunt doen, is de buffer voor ontvangen weggooien (als u interrupts voor ontvangen of verzenden inschakelt, wordt er automatisch een buffer gemaakt). Als deze buffer niet nodig is, kunnen de routine voor het afhandelen van byte-ontvangstonderbrekingen en de verzendroutine er als volgt uitzien:

// Globale variabele - ontvangen gegevens van het apparaat // If FromGCnDevice == 0 - niets ontvangen char VanGCnDevice; // Behandel het einde van de byte-ontvangstonderbreking interrupt [USART_RXC] void usart_rx_isr (void) (char status; // Verkrijg de status en databyte status = UCSRA; FromGCnDevice = UDR; // Als er een fout is opgetreden tijdens het ontvangen van een byte, dan is FromGCnDevice = 0 if ((status & amp; (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))! = 0) FromGCnDevice = 0; ) // Byte-overdrachtsprocedure void ToGCnDevice (char c) ( // We wachten op het einde van de overdracht van de vorige byte terwijl ((UCSRA & amp; DATA_REGISTER_EMPTY) == 0); // Transferbyte UDR = c; )

// Globale variabele - gegevens ontvangen van het apparaat // If FromGCnDevice == 0 - niets ontvangen char FromGCnDevice; // De interrupt afhandelen wanneer de byte wordt ontvangen interrupt void usart_rx_isr (void) (char status; // Ontvang de status en data byte status = UCSRA; FromGCnDevice = UDR; // Als er een fout is opgetreden tijdens het ontvangen van de byte, dan is FromGCnDevice = 0 if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))! = 0) FromGCnDevice = 0;) // Byteoverdrachtprocedure void ToGCnDevice (char c) (// Wacht op het einde van de vorige byteoverdracht terwijl ((UCSRA & DATA_REGISTER_EMPTY) == 0); // Overdracht byte UDR = c;)


In en alles over de UART. Dit zou voldoende moeten zijn om het apparaat met uw project te verbinden. Volgens de anologie van de bovenstaande voorbeelden kan alles eenvoudig worden gedaan voor andere AVR-microcontrollers.
Hieronder laat ik de archieven van programma's met voorbeelden van UART-werk voor ATtiny2313 achter.
- Een voorbeeld van een project dat automatisch is gemaakt door CodeWisionsAVR
- Een voorbeeldprogramma voor het werken met UART in de Algorithm Builder


PS Ik ken C en Asm nauwelijks, dus trappen en gooien met pantoffels mag! We zijn allemaal aan het leren.


Begonnen

(10 796 keer bezocht, 2 bezoeken vandaag)

Hysterie, er zijn veel vragen verschenen, hoe het bord op de computer aan te sluiten. En veel mensen begrijpen niet eens wat UART is. En ik besloot je hier te vertellen wat een krachtig hulpmiddel het is.

De router verandert in een computer als er een toetsenbord en beeldscherm op zijn aangesloten via UART

Van telegraaf naar COM-poort

Het UART-protocol (universele asynchrone ontvanger / zender) of, in het Russisch, UART (universele asynchrone ontvanger / zender) is het oudste en meest voorkomende protocol van vandaag fysiek protocol dataoverdracht. De meest bekende van de UART-familie is het RS-232-protocol (in de volksmond - de COM-poort, die op uw computer). Dit is waarschijnlijk de oudste computerinterface. Het is tot op de dag van vandaag bewaard gebleven en heeft zijn relevantie niet verloren.

Ik moet zeggen dat de UART-interface aanvankelijk in de Verenigde Staten verscheen als een middel om telegraafberichten te verzenden, en er waren vijf werkende bits (zoals in morsecode). Voor de transmissie werden mechanische apparaten gebruikt. Toen kwamen er computers en ASCII-codes waarvoor zeven bits nodig waren. In het begin van de jaren 60 kwam de bekende 8-bit ASCII-tabel in de plaats, en toen begon het transmissieformaat een volledige byte plus drie besturingsbits in beslag te nemen.

In 1971, toen de opkomst van microschakelingen al was begonnen, maakte Gordon Bell de WD1402A UART-microschakeling voor Western Digital PDP-computers. Rond het begin van de jaren 80 werd door National Semiconductor de 8520-chip gemaakt en in de jaren 90 werd een buffer naar de interface uitgevonden, die het mogelijk maakte om data met hogere snelheden over te dragen. Deze interface, die bijna geen veranderingen heeft ondergaan, is tot op de dag van vandaag bewaard gebleven.

Interface-fysica

Laten we, om te begrijpen wat verschillende UART-interfaces gerelateerd en verschillend maakt, het werkingsprincipe van het meest populaire en geliefde RS-232-protocol analyseren. Ik zal niet nauwgezet alle subtiliteiten van zijn werk beschrijven. Daar zijn nog geen dozijn megabytes aan artikelen over geschreven en als je weet hoe je Google moet gebruiken, kun je alle informatie die je nodig hebt gemakkelijk vinden. Maar ik zal je de basis vertellen, want met hen kun je al cool sturen naar iedereen, en allerlei soorten chips worden zeer zelden gebruikt.

Onze belangrijkste werklijnen zijn RXD en TXD, of gewoon RX en TX. De zendlijn is TXD (verzonden gegevens) en de RXD-poort (ontvangen gegevens) is de ontvangende lijn.
Deze COM-poortlijnen worden gebruikt voor verzending zonder hardwarestroomregeling. Extra interfacelijnen (DTS, RTS, enz.) zijn ook betrokken bij de hardwarestroom. De TX-uitgang van de zender is verbonden met de RX-ingang van de ontvanger en vice versa. Het elektrische principe van RS-232 is anders dan de standaard 5V TTL-logica. In dit protocol is logische nul respectievelijk van +3 tot +12 volt en één van -3 tot -12. Het bereik van -3 tot +3 volt wordt beschouwd als een zone van onzekerheid. Merk op dat alle spanningen relatief zijn ten opzichte van de computerbehuizing of aarde. Nu denk ik dat je begrijpt waarom er twee spanningen tegelijk in een computervoeding zitten: -12 en +12 volt. Ze zijn speciaal geïntroduceerd voor het werk van de COM-poort.


Signaalontvangst via RS-232 (overgenomen uit het boek van M. Guk "PC Hardware Interfaces")

Een dergelijke grote amplitude van bedrijfsspanningen, tot wel 24 volt, is in de eerste plaats nodig voor de ruisimmuniteit van communicatielijnen. Volgens de norm kan de lengte van de kabel waarlangs we gegevens laten lopen 15 m zijn. In de praktijk slaagden mensen er echter in om het zelfs op 25 m te laten werken. De elektrische parameters van RS-232 zijn het belangrijkste kenmerk dat zich onderscheidt het van andere protocollen van de UART-familie.

De volgende kenmerken - verzendformaat en baudrate - zijn volledig van toepassing op alle soorten UART en garanderen hun compatibiliteit via eenvoudige interfacecircuits.

Het standaardpakket duurt 10 bits. Maar deze regel is alleen van toepassing op de standaard COM-poortinstellingen. In principe kan het opnieuw worden geconfigureerd, zodat het zelfs de One-Wire-interface begrijpt. In de ruststand, wanneer er niets langs de lijn wordt verzonden, bevindt het zich in een staat van logische eenheid, of -12 volt. Het begin van de transmissie wordt aangegeven door de transmissie van een startbit, die altijd nul is. Dan is er de overdracht van acht databits. Het pariteitsbit en het stopbit zijn voltooid. De pariteitsbit controleert de verzonden gegevens. Het startbit vertelt ons dat de gegevensoverdracht is voltooid. Opgemerkt moet worden dat de STOP-bit 1, 1,5 en 2 bits lang kan zijn. Denk niet dat dit fractionele bits zijn, dit aantal spreekt alleen over de duur ervan. Het stopbit is, net als het startbit, nul.


UART-signaal op het oscilloscoopscherm. Startbit, data en stopbit zijn zichtbaar. Bedankt voor de foto

werk snelheid

Zelfs als je nog nooit eerder met de COM-poort hebt hoeven werken, zou je in het modem in ieder geval de nominale werksnelheden moeten kennen: 9600, 28800, 33600, 56000, enz. Hoeveel bits per seconde ontsnappen er uit onze poort? Kijk, laten we zeggen dat onze snelheid 9600 bits per seconde is. Dit betekent dat het overbrengen van één bit 1/9600 van een seconde duurt en het overbrengen van een byte 11/9600. En deze snelheid voor een byte is alleen correct als het stopbit één bit in beslag neemt. Als er twee stopbits nodig zijn, is de verzending 12/9600. Dit komt doordat naast de databits ook speciale bits worden verzonden: start-, stop- en pariteitsbit. Het bereik van COM-poortsnelheden is gestandaardiseerd. In de regel werken alle apparaten met drie standaardsnelheden: 9600, 19200, 115200. Maar er zijn ook andere opties mogelijk, zelfs het gebruik van niet-standaard snelheden of een snelheid die in de loop van de tijd verandert - dit kwam ik tegen bij de debriefing van het volgende apparaat.

Zo'n ander protocol

Er zijn veel soorten UART's. Ik zal hun namen niet noemen, want als je Engels spreekt, kun je zelf Googlen. Maar de belangrijkste kunnen niet worden genegeerd! Laat me u eraan herinneren dat het belangrijkste verschil tussen interfaces de omgeving en de methode van gegevensoverdracht is. Gegevens kunnen zelfs via glasvezel worden verzonden.

De tweede meest voorkomende interface na RS-232 is RS-485. Het is een industriële standaard en de transmissie wordt uitgevoerd via twisted pair, waardoor het een goede ruisimmuniteit heeft en een verhoogde transmissiesnelheid tot 4 megabits per seconde. De lengte van de draad kan hier oplopen tot 1 km. Meestal wordt het in fabrieken gebruikt om verschillende werktuigmachines te besturen.

Ik moet zeggen dat IRDA, of infraroodcommunicatie, die in de meeste telefoons en PDA's is ingebouwd, in wezen ook een UART is. Alleen gegevens worden niet via draden verzonden, maar met infraroodstraling.

SMART-kaarten (SIM, satelliet-tv, bankkaarten) - precies de apparaten waarvan elke zichzelf respecterende phreaker ervan droomt te stelen - gebruiken ook onze geliefde UART. Toegegeven, er is half-duplex gegevensoverdracht en de logica van het werk kan 1,8 / 3,3 en 5 volt zijn. Het lijkt erop dat RX aan het ene uiteinde en aan het andere is gesoldeerd met TX - als resultaat is de ene aan het zenden, de andere luistert op dit moment en vice versa. Dit wordt geregeld door de smartcard-standaard. We weten dus precies hoeveel bytes we zullen verzenden en hoeveel de kaart ons zal antwoorden. Het onderwerp is een apart artikel waard. Onthoud in het algemeen dat de UART bijna overal is.


Apparaten die een UART aan boord hebben, met de klok mee: een muis, een reader-emulator van SMART-cards, een Palm m105 PDA, een debug board voor een ATtiny2313 (of AT89C2051) microcontroller, een modem.

Interface-koppeling

Ik heb mijn ogen al versleten met verschillende interfaces, maar hoe ermee te werken? Nou, met gewone RS-232 is het duidelijk, maar bijvoorbeeld met een 5 volt uart, hoe zit het dan? Het is eenvoudig: er zijn verschillende kant-en-klare converter-microschakelingen. In de regel bevatten ze de cijfers "232" in de markering. Ik zag een mikruhu met deze figuren in het circuit - wees zeker: hoogstwaarschijnlijk is dit een converter. Via dergelijke microschakelingen met een kleine omsnoering zijn alle UART-interfaces met elkaar verbonden. Ik zal het niet hebben over industriële interfaces, maar ik zal vertellen over die converters die ons in de eerste plaats interesseren.

De bekendste interface-converter is een door MAXIM ontwikkelde microschakeling, die er een deel van zijn naam aan ontleent (max232). Het vereist vier condensatoren van 0,1 microfarad tot 4 microfarad en een voeding van 5 volt. Verrassend genoeg genereert dit 5 volt IC een negatieve spanning om de 5 volt UART te koppelen met RS-232.

Er zijn USB naar UART-interfacechips zoals de ft232rl-chip. Ubuntu heeft ingebouwde stuurprogramma's voor deze chip. Voor Windows moet u ze downloaden van de officiële site. Na het installeren van de stuurprogramma's verschijnt er een virtuele COM-poort in het systeem en kunt u er al verschillende apparaten mee aansturen. Ik raad u aan deze microschakelingen niet als de enig mogelijke te accepteren. Er zijn een groot aantal goedkopere en interessantere analogen, dus druk op Google en je zult begrijpen dat de wereld van UART cool is.

Over het algemeen zijn microschakelingen vrij duur en soms kom je wel uit met complexere, maar goedkopere schakelingen op een paar transistoren.

Wat levert het ons op?

Zoals u begrijpt, is de UART-interface aanwezig in veel apparaten waarin zich een processor of controller bevindt. Ik zal nog meer zeggen: als er een controller is, dan is de uart een complete (alleen deze kan niet altijd worden gebruikt). In de regel wordt deze interface gebruikt voor het instellen en controleren van de werking van het apparaat. Vaak zwijgt de fabrikant over de aanwezigheid van deze interface in het product, maar het is niet moeilijk om het te vinden: download gewoon de handleiding naar de processor en je weet waar de uart is. Nadat u fysieke toegang tot het stuk hardware hebt gekregen via onze interface, kunt u het naar eigen goeddunken aanpassen of zelfs laten werken, zoals u wilt, en niet zoals de fabrikant het bedoeld heeft. Over het algemeen om het maximale uit een bescheiden toestel te persen. Kennis van dit protocol maakt het ook mogelijk om af te luisteren wat er in de uitwisselingslijnen tussen verschillende processors gebeurt, aangezien fabrikanten vaak hele uart-netwerken in hun apparaat organiseren. Over het algemeen zijn er veel toepassingen, het belangrijkste is om intuïtief te begrijpen hoe het moet.

Router bijwerken

Onlangs kocht ik een wifi-router WL-520GU voor mezelf en na het lezen van Step's artikel "Level-up voor een toegangspunt" (] [# 106), installeerde ik daar met succes Linux. Maar ik heb problemen met het mounten van de swappartitie van mijn harde schijf. Het werd dus noodzakelijk om naar het opstartlogboek van het toegangspunt te kijken - of de partitie nu gemount was of niet - en, zoals ze zeggen, on-the-fly, om onmiddellijk de nodige wijzigingen aan te brengen. Met een zesde zintuig vermoedde ik dat er een UART in mijn router moest zitten. Ik pakte een kruiskopschroevendraaier en begon hem uit elkaar te halen. De zaak is triviaal, maar met een truc - de geheime schroeven bevinden zich onder de rubberen voetjes (als u besluit het te herhalen, onthoud dan dat u de garantie verliest wanneer u het analyseert). Ik zag een nogal saai bord, waar alles "chip-in-one" is: één centrale processor, die alles omvat, een externe medewerker, een flitser, een stroomomvormer en een rij connectoren met knoppen. Maar het bord had een niet-gesoldeerd contactkussen, of beter gezegd, gaten voor naalden. Het waren er vier. Hier is het UART, het is duidelijk! Op het bord, zelfs zonder een multimeter, kun je zien dat de extreme naalden +3,3 volt zijn en de tweede is aarde. De middelste pinnen zijn respectievelijk RX en TX. Welke dat is, wordt gemakkelijk vastgesteld door de wetenschappelijke poke-methode (het is zeer problematisch om de interface te verbranden).
Ik wil meteen opmerken dat de UART-interface in elke router er anders uitziet. In de meeste gevallen zijn dit geen gesoldeerde gaten op het bord. Toegegeven, in één ASUS-router kwam ik zelfs een volledig ondertekende connector tegen.

De omvormer monteren

Om de router op een computer aan te sluiten, moet u de RS-232-interfaces koppelen met de UART van de router. Kortom, u kunt verbinding maken met USB met behulp van de hierboven genoemde FT232RL-chip - wat ik deed toen ik de router voor het eerst controleerde. Maar deze microschakeling bevindt zich in een behuizing die vrij complex is om te solderen, daarom zullen we het hebben over eenvoudigere oplossingen. Namelijk de MAX232-microschakeling. Als je van stroom gaat worden voorzien door een router, dan zal er hoogstwaarschijnlijk 3,3 volt zijn, dus het is beter om de MAX3232 te gebruiken, die meestal in de PDA zit (het bedradingsschema is gemakkelijk te vinden op internet). Maar in mijn router zat een +5 volt voeding aan de ingang, en ik heb heel veel van deze microschakelingen, en ik stoorde me er niet aan. Voor de montage hebben we 0,1 uF condensatoren (4 stuks) en de microschakeling zelf nodig. We solderen alles volgens het traditionele schema en beginnen met experimenten.


Broncodes voor montage

Ik heb meteen een 9-polige mannelijke connector aan de uitgang gehangen zodat ik gemakkelijk een null-modem kabel kon aansluiten. Weet je nog, in de dagen van DOS werden dergelijke kabels gebruikt om een ​​raster van twee computers te maken en ze in Dyuknyuk te snijden. De draad voor onze doeleinden is eenvoudig te monteren. Toegegeven, het zal geen volledig nulmodem blijken te zijn en je zult er niet veel mee spelen, maar het zal precies zijn om het toegangspunt te besturen! Je hebt twee 9-pins vrouwelijke connectoren nodig, hoesjes daarvoor en een draad, bijvoorbeeld van een oude muis of toetsenbord (het belangrijkste is dat het drie draden heeft). Eerst verbinden we de aarde ¬- dit is het vijfde contact van de connectoren; neem gewoon een draad en soldeer deze aan beide kanten op de 5e pin. Maar met RX en TX moet je het slimmer doen. Van het ene uiteinde van de draad solderen we naar het 3e contact en van het andere - naar het 2e. Evenzo met de derde draad, alleen van het ene uiteinde solderen we naar het 2e contact, van het andere - naar het 3e. Het komt erop neer dat TX naar RX moet verzenden. We verbergen de gesoldeerde connectoren in de behuizing - en de nulmodemkabel is klaar!


Gesoldeerde pinnen op het routerbord.

Om de installatie te vergemakkelijken, heb ik de pinconnector in het moederbord van de router gesoldeerd en de omgekeerde connector in de montage met de MAX232 en het bord geplaatst, zoals in een sleuf. RX en TX van de router worden experimenteel geselecteerd.


Gemonteerd bord

Nu moet u de microschakeling van de converter van stroom voorzien. We hebben al een gemeenschappelijke draad in de connector op de moederrouter. Maar +5 volt zit precies bij de stroomingang van de router, op de plek waar de adapter is aangesloten. We bepalen de locatie van 5 volt met een voltmeter, waarbij we verschillende knooppunten meten ten opzichte van de grond van de router.
We sluiten de voeding aan. We schakelen in en starten onze kwaadaardige experimenten.


We branden een gat voor de uitvoer van draden


Niet-gesoldeerde COM-poort


Iedereen is hier. Houd er rekening mee dat de rode stroomdraad naar de adapterpoort van de router gaat. De knoop aan de binnenkant is gemaakt om de gesoldeerde draden los te trekken.

Terminal instellen

We moeten een terminalprogramma opzetten. In Windows is alles vrij eenvoudig: we starten de Hyper Terminal, schakelen de software- en hardwaregegevensverificatie uit, stellen de snelheid in op 115200 en één stopbit. Maar in Linux is de situatie een beetje lastiger. Ik heb Ubuntu en ik zal erover praten. Zoek eerst uit hoe de COM-poort in uw assembly wordt genoemd. In mijn geval was COM1 ttyS0 (als we bijvoorbeeld een FT232-microschakeling gebruiken, wordt deze ttyUSB0 genoemd). Om ermee te werken, gebruikte ik de minicom-softphone.

Voer het uit met de volgende parameters: minicom -l -8 -c op -s. Selecteer vervolgens "Seriële poortinstellingen":
Seriële poort / dev / ttyS0

* Baudrate / pariteit / bits 115200 8N1
* Hardware flow control - nee
* Software flow control - nee

We slaan de instellingen op. Softina zal proberen de modem te initialiseren - let niet op. Druk op . om het menu te openen ... Daar kunt u de instellingen wijzigen, bijvoorbeeld: echo inschakelen / uitschakelen - E.
Maatwerk

Ik raad af om een ​​converter-microschakeling op een router aan te sluiten om de functionaliteit ervan te testen. Het is alleen toegestaan ​​om er voedsel uit te halen. De controle is heel eenvoudig - u moet RX van TX doorverbinden. Eerst overbrug je het 2e en 3e contact in de COM-poort - je controleert de terminalinstellingen. Je schrijft iets op het toetsenbord: als de tekens worden geretourneerd, is alles in orde. Je controleert ook de kabel, dezelfde contacten. Vervolgens sluit je de microschakeling aan en zet je al een jumper aan de uitgang. Ik concentreer me hierop omdat ik bijvoorbeeld problemen had en niets werkte totdat ik alles controleerde en een fout vond.

Na alle instellingen kunt u zich veilig aan de router vastklampen en naar RX-TX op de router zoeken, waarbij u regelmatig de stroom eruit haalt. Als alles correct is gedaan, ziet u het opstartlogboek van de router wanneer u de stroom inschakelt. Gefeliciteerd, nu heb je een volledige hardware-root, alsof je achter een monitor zit met een routertoetsenbord.


Router boot log in minicom programma

Autonoom zeilen

Mee eens, om hetzelfde te doen via een terminalprogramma, wat handiger is om via SSH te doen - geen ijs. Ik wilde van de router een zelfstandige Linux-computer maken, met zijn eigen slimme architectuur. Om dit te doen, is het noodzakelijk dat gegevens van het toetsenbord via de UART worden verzonden en via deze op de monitor worden weergegeven. Het was lui om het apparaat te solderen en te ontwerpen. Het was toen dat het idee ontstond om de PDA, die stof en niets aan het verzamelen was, voor deze doeleinden te gebruiken. In feite zal de handheld de rol spelen van een toetsenbord en beeldschermcontroller en zal hij dienen als interface-interface.

Eerst probeerde ik de oudste Palm m100. Maar blijkbaar heeft hij een heel klein buffergeheugen, en de hoeveelheid data die van de router komt, gaf hem een ​​slecht gevoel. Ik nam een ​​andere - een industriële PDA, met een normale COM-poort en een terminal. Ik stopte hem in, stopte hem in het dock en als resultaat kreeg ik een kleine Linux-computer. In principe zijn in plaats van een dure industriële PDA de meeste handhelds die onder het WinCE-besturingssysteem werken geschikt, het belangrijkste is om geschikte terminalsoftware te vinden.


Linux-computer :)

resultaten

Dus ik liet een klein voorbeeld zien van het gebruik van UART. Als je een voorproefje hebt van dit protocol, geloof me dan, je wordt gewoon de meester van verschillende stukken ijzer. Het is bijna overal en je kunt er schijnbaar totaal verschillende dingen mee combineren. Op dezelfde router is bijvoorbeeld, met kleine instellingen, een mobiele telefoon verbonden via Uart, en deze distribueert het internet ervan. Over het algemeen zijn er veel toepassingen. Wees niet bang om te experimenteren, jezelf te onderwijzen en je ideeën te realiseren.

Dit bericht is een bewerkte versie van mijn artikel in Hacker # 05/09 "The main phreaker tool" voor habr.

Literatuur:
1. Mikhail Guk "PC-hardware-interfaces" - gewoon een studentenbijbel op een pc.