Start bit. Utforska UART-serieporten

Det finns en underbar mikrokrets - FT2232D. Det är en USB till UARTx2-omvandlare. Bekvämt när du behöver få två UART-svansar från en USB-kabel. Men det här är frön jämfört med det faktum att kraftfullt hårdvarustöd för MPSSE (Multi-Protocol Synchronous Serial Engine) introducerades i denna FTDI mikruhu, som låter dig implementera en massa olika gränssnitt som SPI eller JTAG enbart på denna mikruh.
Det ger bara det bredaste utrymmet för konstruktion av programmerare av olika kaliber för vad som helst. För tillfället har jag sett kretsar för firmware AVR, ARM, Altera och gud vet vad mer.

Teoretiskt sett kan den användas för att flasha vad som helst, det skulle finnas mjukvarustöd och ett öppet och dokumenterat protokoll.

Därför, för en så fin touch, bröt jag inte av och gjorde en universell halsduk, som senare, med hjälp av en baldakin av mezzanine-halsdukar, kommer att förvandlas till olika blinkare och debuggers.

Det färdiga programmet måste stoppas in i styrenheten på något sätt. Det finns många sätt att göra detta.

JTAG / SWD adapter
Eftersom JTAG ofta används för felsökning under ARM är denna metod förmodligen den mest populära. En adapter används för detta ändamål. Till exempel använder jag så att jag ska visa på hans exempel. Allt är enkelt där - du ansluter adaptern till kontrollern med en vanlig SWD- eller JTAG-kabel. Via NRST / TDI / TDO / TCK / TMS-linjer för JTAG eller SWO / SWOCLK / SWDIO / NRST för SWD-läge. På adaptern till min version av CoLinkEX är båda dessa kontakter förda ut till ett block, så att det är som om både JTAG och SWD-anslutning erhålls på en gång. Och där behöver du det och väljer. Det är inte mycket av en felsökning / firmware skillnad mellan de två.

Eller med hjälp av CoFlash-verktyget från CooCox.com

En av de fantastiska sakerna med AVR-kontroller är det vilda antalet avbrott. Faktum är att varje kringutrustning har en vektor, om inte en. Så på avbrott kan du smutsa ner en massa parallella processer. Att arbeta med avbrott är ett sätt att skapa en pseudo multitasking-miljö.

Idealisk för dataöverföring och långtidsbehandling.

Som ett exempel kommer jag att visa den buffrade USART-datautmatningen vid avbrott.

I de tidigare exemplen fanns kod så här:

// Skickar en sträng void SendStr (char * string) (medan (* string! = "\ 0") (SendByte (* string); string ++;)) // Skickar ett tecken void SendByte (char byte) (medan (! ( UCSRA & (1<

Denna metod är uppenbarligen helt ineffektiv. Faktum är att vi har de dummaste förväntningarna på ett evenemang här - höjningen av USART-beredskapsflaggan. Och detta beror först och främst på dataöverföringshastigheten. Till exempel, med en hastighet på 600 baud, kommer överföringen av cirka 600 tecken att ta 9 sekunder, vilket blockerar driften av hela programmet, som inte klättrar in i någon grind.

En gång behövde jag en enhet som kan ansluta till en fjärrserver och överföra bytes. Naturligtvis kan en dator användas för dessa ändamål, men det är besvärligt och obekvämt, och tillförlitligheten hos ett sådant system lämnar mycket att önska - det är en för komplex enhet. En annan sak är en mikrokontroller, till exempel Microchip PIC, MSC-51 eller Atmel AVR - enkel, pålitlig, förbrukar ett minimum av energi och kan på ett tillförlitligt sätt utföra ett snävt utbud av uppgifter. Till exempel larmövervakning över Internet eller Ethernet-nätverk. Allt skulle vara bra, men ett annat problem dyker upp här - TCP / IP-protokollet. Att implementera TCP/IP-protokollstacken på en AVR eller PIC är en genomförbar uppgift, men det tar tid, och tid är som du vet pengar. Det var nödvändigt omgående och med minimala hemorrojder. Och här kom Ethernet-gränssnittsmodulen - RS232 till min räddning. Uppgiften är standard, så det finns gott om färdiga moduler på marknaden, men du ska inte skynda dig. Det finns ett antal subtiliteter relaterade till särdragen i driften av dessa enheter. Till exempel kan de allra flesta moduler enbart fungera i rollen som en server, vilket kräver en dedikerad IP-adress. Klientenheten fungerar endast med specialiserad programvara, vanligtvis under Windows, och öppnar en virtuell COM-port som ansluts till fjärrsystemet (UART - Ethernet-modul) och tillhandahåller datautbyte. Inte det mest bekväma alternativet. För min uppgift var denna design helt olämplig. Så jag började leta vidare, och snart upptäcktes en underbar modul EG-SR-7100, och sedan dess nyare modifiering WIZ100SR... Jag läste egenskaperna - det är det! Allt för att lösa mitt problem!

Jag köpte mig ett par moduler HM-TR433... Så plåga. Det finns en sådan glädje för närvarande cirka 800 rubel. Detta är en transceiver, det vill säga den kan både ta emot och sända. Dessutom finns det en styrenhet som själv kodar informationen, driver in den i radiokanalen och avkodar det som fångas. Det vill säga, i själva verket får vi en UART-förlängningskabel och alla möjliga problem som brus efter förlusten av bäraren, som fanns i bunten HM-T433 / HM-R433 vi bryr oss inte längre. En nackdel är att kanalen är halvduplex, det vill säga synkron mottagning och sändning är omöjlig, bara en efter en. Men det här är inget stort problem – halvduplex räcker ofta för ögonen.


Det finns två modifieringar av denna modul. Den ena har TTL-terminering, den andra är RS232. Den enda skillnaden ligger i nivåerna och i det faktum att kineserna först glömde att löda MAX232 och kondensatorbandet, men satte byglar. Så med raka händer och rätt verktyg kan du göra RS232 från TTL och vice versa. Men till ett pris går de en slant till en slant.

Tax, för att arbeta med ett kommersiellt projekt (och fråga inte vilket - jag ska inte berätta det), som åt all min lediga tid med en enorm taggig sked, lyste upp radiomodulerna till själva askan HopeRF HM-R433 / HM-T433... Idag satte jag ihop ett halvduplexschema på fyra moduler och genomförde en långdistansmottagnings- och överföringssession.

Så, hur såg installationen ut:

Block A:

  • Sändare: HM-T433
  • Mottagare: HM-R433
  • Blockplats: 5:e våningen, på bordet. Vid norra väggen.
  • Strömförsörjning: 5 volt.
  • Baudhastighet: 4800 baud.
  • Datapaketlängd: 10 byte.

Block B:

  • Sändare: HM-T433
  • Mottagare: HM-R433
  • Sändarantenn: En bit MGTF-tråd 17 cm lång (1/4 av 433MHz-signalvåglängden) böjd ändå.
  • Mottagarantenn: samma skitsnack.
  • Modulernas placering: parallellt med varandra, på ett avstånd av 2 cm, är antennantenner utspridda i olika riktningar, på samma sätt som kackerlackor.
  • Blockplats: I mina händer, på marken. Från södra sidan av huset (se diagram)
  • Strömförsörjning: 5 volt.
  • Baudhastighet: 4800 baud.
  • Datapaketlängd: 10 byte.

Överföringsvillkor:
Block B ger ett tio-byte-paket till block A, som, efter att ha säkerställt att paketet tagits emot utan distorsion, skickar en bekräftelse tillbaka till block B, samma tio byte. Block B, efter att ha fått bekräftelse, lyser en grön diod. Överföring utförs med en bäraravstängning. De där. efter att ha skickat paketet är sändaren helt avskuren.


Under de inledande testerna visade järnbiten sig från sin bästa sida, men i praktiken kom inte bara insekter ut utan jättemördarkackerlackor. Det verkar, varför är det fel att jobba där? Och, som det visade sig, finns det något. Mer exakt är detta inte buggar, utan funktioner som tillverkaren mest vidrigt höll tyst om i databladen. Hade jag känt till dem skulle jag ha funderat på om jag skulle köpa dem. Så:

Bärare
Mottagaren fångar ändringen i bärvågen som genereras av sändaren. Och om det inte finns någon sändare, vad kommer mottagaren att fånga? I teorin borde det inte fånga något, men vad i praktiken? Och i praktiken en vild skit!!! Naturligt vitt brus över hela området från 0 till 255. Verkar som en bugg, eller hur? Men okej, åt helvete med det här vita bruset, i slutändan kan du filtrera det, spåra närvaron av något rimligt i det och först då börja ta det.

Vänteläge
Sändaren, till min förvåning, liksom ett antal uppmärksamma läsare, har ingen ingång till min förvåning. Gör det möjligt. Mottagaren har alltså. Sällsynt delirium, särskilt sedan efter 70 mS stillestånd på DATA-linjen går sändaren i viloläge och ... det stämmer, skär av bäraren - vid utgången av mottagaren börjar en fruktansvärd skit i detta ögonblick. Så antingen kom data i en kontinuerlig ström, eller så fanns det ett identifieringspaket före varje sändning. Och glöm inte att varna mottagaren att överföringen är över och att det inte finns något att fånga.

Samarbete
Allt är enkelt här, två sändare kan inte fungera samtidigt. Från ordet överhuvudtaget. Antingen separat eller inte alls. Detta var förväntat och bör beaktas.

Överför buggar
Men det som avbröt mig mest var insekterna. Om de tre första punkterna kan tas med i beräkningen och bearbetas programmatiskt utan onödiga problem, är allt mycket roligare med de senare.

Jag fick bland annat förutom en ultraljudsavståndsmätare radiomoduler i ett paket från Terra. Hoppas HM-T433 och Hoppas HM-R433 För sändning respektive mottagning. Modulen i sig är en liten halsduk 15x25 mm med en kontakt som sticker ut ur den. Sändaren har en trepolig kontakt - GND, DATA och Vcc mottagaren har en annan ingång GÖR DET MÖJLIGT vid ansökan till vilken mottagning på hög nivå är tillåten.

Jag hade ett behov av att ge mig själv en enhet så att jag kunde använda den för att distribuera bytes över i 2 c och UART, och även ta emot bytes med samma protokoll och visa dem på skärmen. Både en i taget och i buntar. En sorts debugger.

Tja, cho, det sägs gjort. Fastnat ATMega8535- den första som dök upp under armen på de mångbenta. Jag tog med allt som var möjligt utanför, la till en liten 4x4 tangentbordsmatris och LCD-skärm... Liten skärm WH0802A 8x2 symboler, men vad det var. Jag har inte träffat andra på rea, men under beställningen är den för lat att bära. Och jag tror att det inte behövs längre.

Och sedan en sådan sprit började tog jag fram ett par kanaler till högen PWM, ja ett par ingångar ADC... Väl SPI samtidigt - att gå så. Du kan också Dallas 1-tråd ett protokoll för att organisera, fästa en frekvensmätare, en signalindikator, en voltmeter och i allmänhet kan du göra en massa saker, det skulle finnas en önskan. Återigen, det finns många in-/utgångslinjer, så du kan göra en huvudenhet till ett smart hem eller en styrenhet av något av den.

Byggnaden tog en gratis, PAC-TEC Den "ovskiy one" som trasslade till för ungefär två år sedan. Så lådan kommer väl till pass :) Jag måste säga, PAC-TEC gör fantastiska lådor. Inte som skiten som säljs i våra radiobutiker. De knarrar inte, leker inte, de slås hårt ner, de är välskurna och ser coola ut. Var skulle de annars säljas hos oss.

Än så länge är det bara styrelsen som har skilt sig, vissa detaljer saknas fortfarande. En av dessa dagar ska jag etsa tavlan, montera och programmera. Då får du exempel på live-kod och en detaljerad beskrivning. SPI, i2c, UART, tangentbord och LCD... Lägg förresten märke till hur lätt det är att matrisera vanliga taktknappar. Och allt tack vare att de har fyra stift kopplade i par.

Under tiden, eftersom det fortfarande är i form av en ritning, släng i kommentarerna dina idéer om funktionerna i den framtida enheten.

Medan jag skrev en artikel om UART, kom en pervers idé till mig - på basis av UART kan du organisera den mest naturliga lågupplösta PWM!

Det räcker att bara skapa en variabel någonstans i minnet, där vi kommer att trycka ett nummer med en given arbetscykel av nollor och ettor, och vid avbrott av buffertunderkörningen, trycka tillbaka detta nummer in i UDRE-registret. Således kommer PWM-generering att vara spontan, utan onödiga gester. Visserligen kan du bara få 10 olika PWM-värden, men gratis då!!!

För de som inte förstod hur, kommer jag att ge de nummer som kommer att behöva skickas kontinuerligt via UART:
vi får två extra värden på grund av start- och stoppbitarna.

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

Och där kan du få frekvenser som inte är fikon!
Skönhet! =)))))

Nästan varje mikrokontroller har ett universellt seriellt gränssnitt ombord - UART. AVR detta är inget undantag och stöder detta protokoll fullt ut, helt i hårdvara. I strukturen är det normalt asynkron ett seriellt protokoll, det vill säga den sändande sidan avger i sin tur 0 och 1 till linjen, och den mottagande sidan övervakar och lagrar dem. Synkronisering sker i tid - mottagaren och sändaren kommer i förväg överens om vilken frekvens utbytet ska ske. Detta är en mycket viktig punkt! Om hastigheten på sändaren och mottagaren inte stämmer överens kan det hända att det inte blir någon överföring alls, eller så kommer fel data att läsas.

Protokoll
Först kastar sändaren linjen till en låg nivå - detta är startbiten... När mottagaren känner av att linjen har lagt sig väntar mottagaren på T1-intervallet och läser den första biten, sedan plockas resten av bitarna ut med T2-intervallen. Den sista biten är stopp bit... Indikerar att överföringen av denna byte är klar. Detta är i det enklaste fallet.

I slutet av byten, före stoppbiten, kan det finnas en paritetsbit. Vilket erhålls om man korsar alla bitar sinsemellan för att kontrollera kvaliteten på överföringen. Det kan också finnas två stopp, igen för tillförlitligheten. Bits kanske inte är 8, utan 9. Alla dessa parametrar förhandlas på stranden, innan överföringen börjar. Den mest populära är 8 bitar, en start ett stopp, ingen paritet.

Och du behöver inte bry dig om själva protokollet - allt är implementerat i hårdvara. Om du inte vill starta en andra UART måste du göra det programmatiskt.

Datorns COM-port fungerar enligt samma protokoll, skillnaden ligger bara i skillnaden i spänningar, därför kommer jag att använda detta protokoll för att kommunicera mikrokontrollern med datorn. En RS232-TTL-omvandlare kan användas för att omvandla spänningar. COM-port. Men det finns ett problem här - faktum är att datorn RS232 han tar för logiska nivåer +/- 12 volt och UART fungerar på fem voltsnivåer. Hur kombinerar man dem? För detta finns det flera alternativ för nivåomvandlarkretsar, men det mest populära är fortfarande på en speciell omvandlare. RS232-TTL... Detta är en mikrokrets MAX232 och dess analoger.
Nästan varje företag gör sin egen omvandlare, så här kommer den att passa och ST232, och ADM232, och HIN232... Kretsen är så enkel som tre kopek - ingång, utgång, strömförsörjning och bandning av fem kondensatorer. Kondensatorer är vanligtvis installerade 1uF elektrolyter, men i vissa modifieringar 0,1 uF keramik. Jag lödde överallt 0,1 uF keramik och oftast räckte det. :) Fungerar som en klocka. Om det misslyckas vid höga hastigheter, kommer det att vara nödvändigt att öka kapaciteten.


Det finns förresten också MAX3232 det är samma, men uteffekten är inte 5 volt TTL, utan 3,3 volt TTL. Den används för lågspänningsregulatorer.

Jag gjorde mig själv en sådan universalsladd så att det var bekvämt att hålla fast vid kontrollerna. UART... För total kompakthet trycktes hela kretsen rakt in i kontakten, eftersom jag hade ST232 i soic corpus. Näsduken visade sig inte vara större än ett rubelmynt. Eftersom det inte fanns några små SMD-kondensatorer till hands var jag tvungen att löda ledarna ovanifrån, vem på vilket sätt. Huvudsaken fungerar, även om det inte blev särskilt snyggt.


Om du tvivlar på att du kommer att få en så liten installation, så lägger jag kortet i ett vanligt PDIP-fodral. Den blir lika stor som en tändsticksask, men du behöver inte slipa den.


Efter montering är kontrollen enkel:
Sticks in i kontakten COM hamn. 5 volt ström tillförs kretsen, och sedan stänger du RxTx(Jag har gröna och gula ledningar).

Sedan öppnar du vilken terminal som helst Hyperterminal, klamrar du dig fast vid porten och börjar skicka bytes, bör de returneras omedelbart. Om detta inte händer, kontrollera kretsen, där det finns en jamb.

Om det fungerar är allt enkelt. Tråden som går från ben 9 på mikrokretsen MAX232 detta är sänder ut, få honom på fötter RxD kontroller. Och den med ett ben 10 - tar emot, satte djärvt honom på slutsatsen TxD kontroller.


Skivan gjordes med LUT-metoden, på ett ställe, i mitt förbiseende visade sig släppningstjockleken vara 0,05 mm, den etsades, men med spikar var jag tvungen att repa. Men i allmänhet, från första försöket och inga problem. Jag ville genast göra något litet, litet, fyllt fyllt :)

3.1 Seriellt asynkront UART-gränssnitt

Det seriella gränssnittet använder en enda signallinje för dataöverföring, över vilken informationsbitar sänds en efter en i serie. Seriell överföring minskar antalet signallinjer, vilket förenklar kabeldragningen av kretskortet, minskar storleken på enheten och möjliggör mer störningsfria gränssnitt. Under seriell överföring måste varje informationsbit åtföljas av en synkroniseringspuls - en strobe. Om synkroniseringspulser sänds från en enhet till en annan via en dedikerad linje, kallas ett sådant gränssnitt synkront, i detta fall är synkroniseringsgeneratorn placerad på sidan av enheten som initierar överföringen. Om mottagaren och sändaren innehåller var sin egen klockgenerator som arbetar med samma frekvens, kallas ett sådant gränssnitt asynkront. Det visar sig att informationsmottagaren själv genererar synkpulser.

En typisk representant för ett asynkront seriellt gränssnitt är UART(Universell asynkron mottagare-sändare).

Vid sändning över UART-gränssnittet föregås varje databyte av en START bit signalerar till mottagaren om början av sändningen, START-biten följs av databitarna. Kompletterar paketet STOPP bit, vilket garanterar en paus mellan meddelanden. START-biten för nästa byte sänds när som helst efter STOP-biten, det vill säga det kan finnas pauser av godtycklig längd mellan sändningarna. START-biten tillhandahåller en enkel mekanism för att synkronisera mottagaren med signalen från sändaren. Mottagarens interna klocka använder en referensfrekvensdelarräknare, som återställs när starten av START-biten tas emot. Denna räknare genererar interna strober som mottagaren låser på till efterföljande mottagna bitar.

3.2 Funktioner hos UART mikrokontroller ADuC842

I ADuC842-mikrokontrollern är UART-serieporten full duplex- låter dig skicka och ta emot data samtidigt. I den betraktade mikrokontrollern är mottagning via serieporten buffrad: porten kan börja ta emot en databyte redan innan den föregående byten läses från mottagarens buffertregister. Men om den tidigare byten inte läses från bufferten före slutet av mottagningen, kommer den att gå förlorad: den nya mottagna byten kommer att skriva över den gamla.

Data tas emot och sänds över olika linjer, överföring sker via utgång TxD mikrokontroller (Sändardata - datasändare), mottagning - genom RxD(Mottagardata). Fysiska slutsatser RxD och TxD i linje med stiften på den tredje parallellporten P3.0 och P3.1 respektive.

Programvaruinteraktion med UART seriell port utförs genom specialfunktionsregister (SFR) SBUF och SCON... Tvärs över SBUF(Serial buffer) kommer åt serieportens mottagar- och sändarregister. När du programmatiskt skriver till SBUF, sedan laddas data in i sändarregistret, när programmet läser SBUF, sedan öppnas mottagarregistret. Rent fysiskt är mottagar- och sändarregistren separata. SFR-adress - 0x99.

SCON- registrera för konfiguration och kontroll av mikrokontrollerns seriella port.
SFR adress - 0x98.
0x00.
Registret är bitadresserbart.

Tabell 1 - Syftet med SCON-registerbitarna

rum mnemonics beskrivning
7 SM0 SM1, SM0 bitarna bestämmer driftsläget för den seriella porten.
SM0 SM1 Valt läge
0 0 läge 0: synkront läge med fast hastighet f kärna / 2.
0 1 läge 1: 8-bitars asynkront läge med konfigurerbar överföringshastighet.
1 0 läge 2: 9-bitars asynkront läge med fast hastighet f kärna / 32 eller f kärna / 16.
1 1 läge 3: 9-bitars asynkront läge med konfigurerbar överföringshastighet.
6 SM1
5 SM2 Transceiver mode kontrollbit. Den är inställd av programvara för att förbjuda mottagning av ett meddelande där den nionde biten har värdet "0". Detta läge används när ett nätverksprotokoll implementeras i ett multiprocessorsystem.
4 REN Seriella data tar emot aktiveringsbit. Ställs in av programvaran för att möjliggöra mottagning.
3 TB8 Den nionde serieportens sändarbit. Data som laddas in i TB8 överförs med den nionde biten. Detta är relevant för UART-läge 2 och 3.
2 RB8 Den nionde serieportens mottagarebit. I driftlägena 2 och 3 laddas den mottagna nionde databiten in i denna bit. I läge 1 lagrar denna bit STOP-biten.
1 TI Seriell port sändaravbrottsflagga. Ställs in av hårdvara i slutet av en byteöverföring. Flaggan måste rensas (skriv "0") programmatiskt.
0 RI Seriell port mottagare avbrottsflagga. Ställs in av hårdvara i slutet av en bytemottagning. Flaggan måste rensas (skriv "0") programmatiskt.

Driftläge 0: 8-bitars skiftregisterläge. För att välja detta driftsätt bör det vara i bitar SM0 och SM1 skriv logiska nollor ( SM1 = 1 och SM0 = 0). I detta läge sänds och mottas data sekventiellt via stift RxD... Produktion TxD används för att applicera klockpulser. Överföringen initieras av varje instruktion som skriver data till ett register. SBUF... Databyteöverföringen börjar med den minst signifikanta biten. Mottagning startar när mottagningsaktiveringsbiten är inställd på ett ( REN = 1), och mottagaravbrottsflaggan nollställs ( RI = 0). Således, i det här fallet, fungerar den seriella porten i ett synkront läge, därför, för vissa familjer av mikrokontroller, kallas en sådan serieport inte UART, utan USART(Universell Synchronous-Asynchronous Receiver-Transmitter).

Driftläge 1: asynkront 8-bitars läge med konfigurerbar hastighet. För att välja det första läget bör vara i bit SM0 skriv en, och i bitar SM1- noll ( SM1 = 0 och SM0 = 1). Spånstift TxD används för att överföra information, output RxD- för mottagningen.

Sändningen av en informationsbyte börjar med sändningen av en START-bit, följt av åtta informationsbitar, och överföringen slutar med en STOPP-bit. Således används 10 bitar för att överföra varje byte med information. Bildandet av en START-bit och en STOP-bit sker automatiskt.

Baudraten kan ställas in av Timer 1 eller Timer 2, eller en kombination av båda, en för sändning och en för mottagning. Användningen av timer 1 och 2 är typisk för hela MCS-51/52-familjen, även om Timer 2 bara finns i äldre modeller, men i ADuC842-mikrokontrollern är det möjligt att synkronisera UART-sändtagaren från en speciell Timer 3, vilket frigör allmänna timers för att utföra andra funktioner.

Dataöverföringen startar när registret SBUF det överförda numret skrivs i programvaran. Uppgifterna överförs så länge som TxD STOP-biten kommer inte att tas emot, varefter sändarens avbrottsflagga ( TI) kommer att ställas in på ett, som visas i bilden nedan:

Figur 1 - Byteöverföringsdiagram

För att möjliggöra mottagning av data via serieporten i bitar REN den logiska enheten ska skrivas. Mottagningen av databyten börjar med ankomsten till linjen RxD START-bit: övergång av linjen från en hög logisk nivå till låg. I slutet av mottagningen av hela byten avbryter mottagaren flaggan RIär satt till ett, och den mottagna byten kan läsas programmatiskt från buffertregistret SBUF.

Driftläge 2: asynkront 9-bitars läge med fast hastighet. Standardöverföringshastigheten är f core / 32, men om den är skriven i bitar SMOD Registrera PCON logisk enhet, då kommer baudhastigheten att fördubblas: f kärna / 16. För att välja det andra läget bör vara i bit SM0 skriv logisk noll, och i bit SM1- enhet ( SM1 = 1 och SM0 = 0).

I detta läge består varje sänt eller mottaget meddelande av elva bitar: START-bit, åtta informationsbitar, den nionde programmerbara biten och en STOP-bit. Den nionde biten används ofta som paritetsbit för paritet, även om den kan användas för vilket annat syfte som helst.

Mottagning och sändning i den andra moden utförs på liknande sätt som den första moden. Den nionde biten under överföring skrivs programmatiskt till biten TB8 Registrera SCON, när mottagandet av den nionde biten är in RB8 Registrera SCON.

Driftläge 3: asynkront 9-bitars läge med konfigurerbar hastighet. För att välja det tredje läget, gå till bits SM0 och SM1 skriv logiska enheter ( SM1 = 1 och SM0 = 1). I detta läge fungerar UART-serieporten på samma sätt som i läge 2, endast hastigheten ställs in av timer 1, 2 eller 3, precis som i läge 1.

I alla fyra lägena börjar dataöverföringen med vilken instruktion som helst som skriver till registret SBUF siffra. I läge 0 startar mottagningen på villkor RI = 0 och REN = 1... I alla andra lägen börjar mottagningen med ankomsten av en START-bit, förutsatt att i bit REN logisk enhet skrivs ( REN = 1).

3.3 Beräkning av UART-tidsparametrar

Som standard är den seriella ADuC842-porten konfigurerad att klocka från Timer 1. UART-baudhastigheten bestäms av timerns överflödestid:

där T T är timerns drifttid.

Timern måste konfigureras för att fungera i automatiskt omladdningsläge (läge 2). För att ställa in detta läge i de övre 4 bitarna i registret TMOD du bör skriva den binära kombinationen 0010b. I det här fallet kommer dataöverföringshastigheten att bestämmas av formeln:

där: f kärna är frekvensen för mikroprocessorkärnan, TH1 är innehållet i dataregistret TH1.

Från formel 2 är det lätt att hitta registervärdet TH1 tillhandahåller den nödvändiga hastigheten:

Beräkningsresultatet måste avrundas till närmaste heltal.

Att använda Timer 1 för att synkronisera UART är inte alltid möjligt för att erhålla den erforderliga frekvensen med tillräcklig noggrannhet. Till exempel, med en mikroprocessorkärnklocka på 2097 kHz (standard för ADuC842), vill du ha en överföringshastighet på 19,2 kbps. Med formel 3 hittar vi värdet på TH1:

Med detta TH1-värde beräknar vi den verkliga baudhastigheten för UART:

Den faktiska hastigheten är 14 % lägre än den som krävs, vilket innebär att dataöverföring är omöjlig. Problemet löstes genom att lägga till en dedikerad timer 3, specialiserad för UART-timing med hög precision över ett brett frekvensområde. Genom att använda en dedikerad timer frigörs dessutom timers för allmänna ändamål för olika andra ändamål.

Timer 3 är faktiskt en uppsättning konfigurerbara delare av kärnklockfrekvensen, blockschemat för timern visas i figuren nedan:


Figur 2 - Blockschema för Timer 3

Timer 3 styrs av två register med specialfunktioner - T3CON och T3FD... Registrera T3CON innehåller lite T3EN, när en logisk enhet skrivs till den, kommer UART att synkroniseras från Timer 3, annars - från Timer 1. De nedre tre bitarna i registret T3CON bestäm den binära divisorn DIV... Bråkdelningsfaktor justerbar med register T3FD.

T3CON- konfigurationsregister av Timer 3.
SFR adress - 0x9E.
Värde efter påslagning 0x00.

Tabell 2 - Tilldelning av bitar av register T3CON

rum mnemonics beskrivning
7 T3EN Timerupplösning 3.
När biten är inställd ( T3EN = 1) Synkronisering av serieportsmottagaren och sändaren kommer från Timer 3.
När biten är rensad ( T3EN = 0) - synkronisering från Timer 1.
6 Inte använd
5
4
3
2 DIV2 Heltalsavdelare 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 adress - 0x9D.
Värde efter påslagning 0x00.
Registret har ingen bitvis adressering.

Med hjälp av Timer 3-blockdiagrammet är det lätt att skriva ett analytiskt uttryck för att beräkna den resulterande serieportens hastighet:

där f kärna är frekvensen för mikrokontrollerns kärna.

Delningsvärde DIV kan bestämmas med formel 5, bör det resulterande värdet avrundas nedåt till närmaste heltal.

Bråkdelare T3FD kan hittas med formel 6, det resulterande värdet ska avrundas till närmaste heltal.

Låt oss beräkna konfigurationsparametrarna för Timer 3, för det tidigare exemplet: med en mikroprocessorkärnklockfrekvens på 2097 kHz måste du få en överföringshastighet på 19,2 kbps.

Således är ränteinställningsfelet endast 0,2 %.

3.4 Funktioner i presentationen av textinformation

Olika operativsystem använder speciella teckenuppsättningar för att representera textinformation. Som regel presenteras en sådan uppsättning i form av en tabell, där varje tecken motsvarar en binär sekvens av en eller flera byte. I litteraturen kallas en sådan symboltabell ofta för en "kodning". Den i särklass vanligaste koden är ASCII(American Standard Code for Information Interchange - American Standard Code for Information Interchange), som används för intern representation av symbolisk information i MS DOS-operativsystemet, i Windows Notepad, samt för att koda textfiler på Internet.

Eftersom ASCII ursprungligen var avsedd för utbyte av information, använder den förutom informationssymboler kommandosymboler för att styra kommunikationen. I följande tabell visas sådana tecken med ellips.

Tabell 3 - ASCII-tabell

.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
0. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2. ! " # $ % & " ( ) * + , - . /
3. 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4. @ A B C D E F G H jag J K L M N O
5. P F R S T U V W X Y Z [ \ ] ^ _
6. ` a b c d e f g h i j k l m n o
7. sid q r s t u v w x y z { | } ~ ...

Kodtabellen innehåller 8 kolumner och 16 rader, varje rad och kolumn numrerade i hexadecimal notation. Den hexadecimala representationen av ASCII-koden består av kolumnnumret och radnumret där tecknet finns, med radnumret som utgör den första siffran (mest signifikanta fyra bitar) och kolumnnumret som bildar den andra siffran (minst signifikanta 4) bitar). Så till exempel är ASCII-koden för tecknet "E" numret 0x45, och tecknet "\" är 0x5C.

Det är lätt att se att tabellen nedan innehåller 128 tecken, medan ett tecken är kodat av en byte - åtta bitar. Faktum är att de övre värdena (128-255) kan upptas av olika ytterligare tecken, till exempel uppsättningen av det ryska alfabetet, det beror på den specifika typen av kodning.

3.5 Sätt för mjukvaruimplementering av UART

Innan den första åtkomsten till UART-transceivern måste den seriella porten konfigureras: driftsläget bestäms, klockkällan väljs och konfigureras. UART-driftsläget ställs in av bitar SM0 och SM1 Registrera SCON... Eftersom registret har både byte- och bitadressering kan inställningen göras på olika sätt: skriv till registret SCONönskat antal eller ställ in varje bit separat. Synkkällan bestäms av biten T3EN Registrera T3CON: om en logisk etta skrivs till denna bit, kommer synkroniseringen att ske från Timer 3, om inget skrivs (som standard T3EN = 0), sedan synkronisering från Timer 1.

När du använder Timer 1 måste du konfigurera den för att fungera i läge 2 (frigående timer med auto-reload), för detta i de övre fyra bitarna i registret SMOD den binära kombinationen 0010b ska skrivas. Motregister TH1 bestämmer överföringshastigheten för information på UART, bör dess värde beräknas med formeln 3. Efter inspelning TH1 timern måste startas, detta görs genom att skriva till lite TR1 Registrera TMOD logisk enhet.

Vid synkronisering från Timer 3 beräknas divisorerna med formlerna 5 och 6 DIV och T3FD... Om divisorposten T3FD göras direkt i registret T3FD, sedan divisorn DIV bestäms av de minst signifikanta tre bitarna i registret T3CON, medan den är i den viktigaste delen av detta register ( T3EN) måste en logisk enhet skrivas. Timern startar automatiskt.

Att skicka data via UART börjar med vilket kommando som helst, vars resultat skrivs till registret SBUF:

SBUF = 0x45; // skicka tecknet "E"

Du behöver inte använda ASCII-tabellen för att bestämma teckenkoden varje gång, C-språket har ett bekvämt verktyg för detta: ta bara det önskade tecknet i apostroferna, kompilatorn tolkar detta som en teckenkod.

SBUF = "E"; // skicka tecknet "E"

Om du behöver skicka mer än ett tecken, så innan nästa kod skrivs till SBUF, bör du vänta tills det föregående tecknet skickas. Slutet på sändningen signaleras av en flagga TI Registrera TCON när överföringen är klar, i bitar TI en logisk enhet skrivs i hårdvara. Du kan programmera en check i en loop TI att vara lika med noll, och skicka nästa byte endast när TI kommer att vara lika med en:

SBUF = 0x45; // skicka tecknet "E" medan (! TI); // medan TI är noll, gör en tom loop TI = 0; // rensa flaggan för nästa överföring

Mottagningen av en byte utförs på samma sätt. Den mottagna byten kan läsas från buffertregistret endast när den sista biten och mottagarflaggan har tagits emot. RI installerat.

medan (!RI); // vänta på att bytemottagningen är klar cmd = SBUF; // läs in den mottagna byten i cmd-variabeln RI = 0; // återställ mottagarflaggan

I applikationer där exekveringstiden är kritisk är det oacceptabelt att spendera mycket tid under överföringen och vänta på att byten ska skickas och bufferten är ledig, i detta fall, utan att vänta på att hela byten ska skickas, fortsätt till exekveringen av det ytterligare programmet, men innan du skickar nästa byte måste du se till att bufferten är ledig och att sändaren är klar att användas. Den del av programmet som skickar databyten kan ändras enligt följande:

medan (! TI); // vänta tills överföringsbufferten är ledig (om upptagen) SBUF = 0x45; // fyll bufferten och starta överföringen TI = 0; // återställ överföringsflaggan till noll

Denna implementering eliminerar programexekveringspauser mellan överföringar av enskilda bytes.

Figur 3 nedan visar adresserna till de register över specialfunktioner som används i arbetet.


Figur 3 - Adresser till register över specialfunktioner

När du skriver ett program, kom ihåg att programmet för mikrokontrollern måste köras innan enheten stängs av och inte kan slutföras. Därför måste programmet innehålla en oändlig loop.

3.6 Interaktion mellan mikrokontrollern och en persondator

LESO1 pedagogiska laboratorieställ är anslutet till en persondator via en USB-UART-gränssnittsomvandlarmikrokrets. För kommunikation med mikrokontrollern är en terminal implementerad i nwFlash bootloader-programmet. Terminalen låter dig skicka information via den seriella porten till mikrokontrollern, ta emot och visa information som tas emot från mikrokontrollern. Terminalen konfigureras i huvudmenyn "Terminalalternativ". Terminalalternativ tillåter:

  1. välj datavisningsläge: text eller hexadecimal, medan typen av data som skickas också ändras;
  2. välj kodning ANSI(Windows-1251) eller ASCII(DOS-866);
  3. aktivera och inaktivera automatisk textrullningsläge;
  4. rensa terminalfönstret;
  5. spara informationen som tas emot från mikrokontrollern till en fil:
    • som det kom - menyalternativet "Spara";
    • som den visas i terminalen - menyalternativet "Spara som text".

Figur 4 visar fliken för huvudmenyn "Terminalalternativ".


Figur 4 - Konfigurera terminalalternativ Figur 5 - Inställning av hastigheten för UART

När du utbyter data med träningsstället är det nödvändigt att ställa in den erforderliga anslutningshastigheten. Detta kan göras i menyn "anslutning", som visas i figur 5.

4 Uppgift för arbete i laboratoriet

4.1 Utmatning av information via serieporten

  1. Utveckla en algoritm för ett program som överför data via en UART seriell port till en persondator - namnet på en student. Dataöverföringshastigheten måste motsvara alternativet (tabell 5). UART-klockkällan (Timer 1 eller Timer 3) avtalas med läraren. Interaktionen mellan mikrokontrollern och datorn utförs genom terminalen för bootloader-programmet - nwFlash.
  2. Se tabellen Special Function Register (SFR) för att fastställa kontrollregisteradresser och serieportinställningar.
  3. Bestäm värdet på inställningsregistren för serieporten och timern som används för synkronisering.
  4. Beräkna värdena för registren för timern som används för synkronisering.
  5. Gå in i Keil-C integrerade programmeringsmiljö. Bygg och konfigurera projektet efter behov.
  6. Utveckla och skriv in texten i programmet i enlighet med den skapade algoritmen.
  7. Översätt programmet och korrigera syntaxfelen.
  8. Justera UART-överföringshastigheten för nwFlash-programterminalen enligt jobbet.
  9. Ladda ner det mottagna * .hex fil till LESO1 laboratoriebänken.
  10. Se till att elevens efternamn visas i terminalfönstret.

4.2 Mikrokontrollerkontroll via seriell port (tillval)

  1. Ändra programmet så att data från mikrokontrollern endast skickas av ett kommando som skickas från datorn. Kommandot sänds via nwFlash-terminalen.
  2. Ladda ner det mottagna * .hex fil till LESO1 laboratoriebänken.
  3. Se till att programmet fungerar som förväntat.

Tabell 5 - Alternativ för uppgifter

alternativnummer UART hastighet
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 Instruktioner för rapportering

Rapporten bör innehålla:

  1. Syftet med arbetet.
  2. Seriell kommunikationsdiagram.
  3. Beräkning av synkroniseringsparametrar (timerinställningar).
  4. Ett grafiskt diagram över programmets algoritm.
  5. Källkoden för programmet.
  6. Innehållet i listningsfilen för programvaruprojektet.
  7. Slutsatser om utförda laborationer.

Planerna, liksom rapporten som helhet, utförs i enlighet med ESKD-standarderna.

De flesta inbyggda designers vet vad en UART är: Universal Asynchronous Receiver / Transmitter. Det är en kringutrustning för mikrokontroller som omvandlar inkommande och utgående bytes till en seriell dataström. En startbit initierar starten av överföringen av bitströmmen, och en stoppbit (eller två) avslutar dataordet. Dessutom, för att upptäcka fel under dataöverföring, kan UART infoga en kontrollbit i strömmen. Figur 1 visar ett typiskt exempel på vad ingenjörer förväntar sig att se när de överför data över en UART.

USART - Universal Synchronous / Asynchronous Receiver / Transmitter är en kringutrustning för mikrokontroller som omvandlar inkommande och utgående bytes till en seriell dataström. HM. Definitionen av USART skiljer sig inte från UART, förutom ett tillagt ord "synkron". Men det måste finnas några mer betydande skillnader? Annars skulle USART helt enkelt kallas UART.

Ja, det finns skillnader, och mycket betydande. Den första skillnaden mellan USART och UART är hur seriella data kan synkroniseras. UART-klocksignalerna genereras internt i mikrokontrollern och synkroniseras med dataströmmen vid startbitövergången. Det finns inga datarelaterade inkommande synkroniseringssignaler, så mottagaren måste veta i förväg vad baudhastigheten kommer att vara för att kunna bearbeta den mottagna datan korrekt.

Däremot kan USART konfigureras för att fungera i synkront läge. I detta läge genererar den datasändande periferin en synkroniseringssignal, som kan extraheras från dataströmmen av periferin på mottagningssidan utan föregående information om överföringshastigheten. Ett annat alternativ är också möjligt när en separat linje är allokerad för synkroniseringssignalen. Genom att använda en extern klocksignal kan USART arbeta i hastigheter upp till 4 Mbps - ouppnåeligt med standard UART.

En annan viktig skillnad mellan USART och UART är antalet perifera protokoll som stöds. UART är enkel och kan bara erbjuda små variationer i grundformatet - antalet stoppbitar och hur felen kontrolleras (udda eller jämnt). USART är mycket mer komplex och kan generera dataströmmar som är kompatibla med många standardprotokoll; IrDA, LIN, Smart Card, Driver Enable för RS-485 och Modbus är bara några av dem. Samtidigt kan USART, liksom UART, arbeta i asynkront läge, vilket gör att den kan generera exakt samma typer av seriella data som visas i figur 1.

USART- och UART-kringutrustningen har definitivt olika möjligheter och kan vara användbara i olika situationer, så i en standardmikrokontroller kan utvecklaren upptäcka båda gränssnitten. Ta till exempel STM32-mikrokontroller som främst används i mikrokrafttillämpningar. Bland de perifera enheterna på chips av dessa enheter finns både USART och UART. USART är designad för att utföra det "hårda arbetet" med seriell kommunikation under perioder med "hög" strömförbrukning. När mikrokontrollern är i viloläge eller lågeffektläge används en UART som kan utföra låghastighetskommunikation utan att gå över den tillåtna effektgränsen.

Så kan vi säga att USART och UART är en och samma? Det tekniskt korrekta svaret är nej. USART är i allmänhet mer funktionsrik än UART och kan hantera synkroniserade dataströmmar med hastigheter många gånger snabbare än UART. Faktum är att USART kan utföra alla funktioner i en UART, och kanske är det därför i många applikationer, utvecklare, med USART:s fulla kraft i sina händer, använder dem som enkla UARTs, och ignorerar fördelarna med synkron klockning. Föga överraskande använder så många människor dessa termer som om de vore synonyma.

Hysteri, många frågor har dykt upp, hur man ansluter kortet till datorn. Och många människor förstår inte ens vad UART är. Och jag bestämde mig för att berätta här vilket kraftfullt verktyg det är.

Routern förvandlas till en dator om ett tangentbord och bildskärm är anslutna till den via UART

Från telegraf till COM-port

UART (Universal asynchronous receiver / transmitter)-protokollet eller, på ryska, UART (universal asynchronous receiver / transmitter) är det äldsta och mest utbredda protokollet idag fysiskt protokoll dataöverföring. Den mest kända av UART-familjen är RS-232-protokollet (populärt - COM-porten, den som finns på din dator). Detta är förmodligen det äldsta datorgränssnittet. Den har överlevt till denna dag och har inte förlorat sin relevans.

Jag måste säga att UART-gränssnittet ursprungligen dök upp i USA som ett sätt att överföra telegrafmeddelanden, och det fanns fem arbetsbitar (som i morsekod). Mekaniska anordningar användes för överföring. Sedan kom datorer och ASCII-koder som krävde sju bitar. I början av 60-talet kom den välkända 8-bitars ASCII-tabellen att ersätta och sedan började överföringsformatet uppta en hel byte, plus tre kontrollbitar.

1971, när mikrokretsboomen redan hade börjat, tillverkade Gordon Bell mikrokretsen WD1402A UART för Western Digital PDP-datorer. Runt början av 80-talet skapades chippet 8520 av National Semiconductor. På 90-talet uppfanns en buffert till gränssnittet som gjorde det möjligt att överföra data i högre hastigheter. Detta gränssnitt, som nästan inte har genomgått några förändringar, har överlevt till denna dag.

Gränssnittsfysik

För att förstå vad som gör olika UART-gränssnitt relaterade och annorlunda, låt oss analysera funktionsprincipen för det mest populära och älskade RS-232-protokollet. Jag kommer inte noggrant att beskriva alla finesser i hans arbete. Det har inte skrivits ett enda dussin megabyte med artiklar om detta, och om du vet hur du använder Google kan du enkelt hitta all information du behöver. Men jag ska berätta grunderna, eftersom med dem kan du redan styra coolt till alla, och alla typer av marker används mycket sällan.

Våra huvudsakliga arbetslinjer är RXD och TXD, eller bara RX och TX. Sändningslinjen är TXD (Transmitted Data), och RXD (Received Data)-porten är den mottagande.
Dessa COM-portlinjer används för överföring utan hårdvaruflödeskontroll. Ytterligare gränssnittslinjer (DTS, RTS, etc.) är också involverade i hårdvaruströmmen. Sändarens TX-utgång är ansluten till mottagarens RX-ingång och vice versa. Den elektriska principen för RS-232 skiljer sig från standard 5V TTL-logik. I detta protokoll är den logiska nollan från +3 till +12 volt, och en är från -3 till -12, respektive. Området från -3 till +3 volt anses vara en osäkerhetszon. Observera att alla spänningar är relativa till datorhöljet eller jord. Nu tror jag att du förstår varför det finns två spänningar i en datorströmkälla samtidigt: -12 och +12 volt. De introducerades specifikt för COM-portens arbete.


Signalmottagning via RS-232 (tagen från boken av M. Guk "PC Hardware Interfaces")

En sådan stor amplitud av driftspänningar, så mycket som 24 volt, behövs främst för brusimmuniteten hos kommunikationslinjer. Enligt standarden kan längden på kabeln längs med vilken vi har data löpande vara 15 m. Även om människor i praktiken lyckades få den att fungera även vid 25 m. De elektriska parametrarna för RS-232 är den huvudsakliga egenskapen som skiljer den från andra protokoll i UART-familjen.

Följande egenskaper - sändningsformat och baudhastighet - är fullt tillämpliga på alla typer av UART och säkerställer deras kompatibilitet genom enkla gränssnittskretsar.

Standardpaketet tar 10 bitar. Men denna regel gäller bara för standardinställningarna för COM-porten. I princip kan den konfigureras om så att den till och med förstår One-Wire-gränssnittet. I viloläge, när ingenting sänds längs linjen, är den i ett tillstånd av logisk enhet, eller -12 volt. Början av sändningen indikeras av sändningen av en startbit, som alltid är noll. Sedan är det överföring av åtta databitar. Paritetsbiten och stoppbiten är klara. Paritetsbiten kontrollerar den överförda datan. Startbiten talar om för oss att dataöverföringen är klar. Det bör noteras att STOP-biten kan vara 1, 1,5 och 2 bitar lång. Tro inte att det här är bråkdelar, detta nummer talar bara om dess varaktighet. Stoppbiten, liksom startbiten, är noll.


UART-signal på oscilloskopskärmen. Startbit, data och stoppbit är synliga. Tack för bilden

Arbetshastighet

Även om du aldrig har behövt arbeta med COM-porten tidigare, åtminstone i modemet bör du känna till de nominella driftshastigheterna: 9600, 28800, 33600, 56000, etc. Hur många bitar per sekund kommer ut från vår hamn? Titta, låt oss säga att vår hastighet är 9600 bitar per sekund. Detta innebär att överföring av en bit tar 1/9600 av en sekund och att överföra en byte tar 11/9600. Och denna hastighet för en byte är korrekt endast om stoppbiten kommer att uppta en bit. Om det krävs två stoppbitar blir överföringen 12/9600. Detta beror på det faktum att tillsammans med databitarna sänds även speciella bitar: start, stopp och paritetsbit. Utbudet av COM-porthastigheter är standardiserat. Som regel fungerar alla enheter med tre standardhastigheter: 9600, 19200, 115200. Men andra alternativ är möjliga, till och med användningen av icke-standardiserade hastigheter eller hastigheter som ändras över tiden - jag stötte på detta när jag debriefade nästa enhet.

Så annorlunda protokoll

Det finns många typer av UART. Jag kommer inte att lista deras namn, för om du pratar engelska kommer du att kunna googla dig själv. Men de viktigaste kan inte ignoreras! Låt mig påminna dig om att den största skillnaden mellan gränssnitt ligger i miljön och metoden för dataöverföring. Data kan till och med överföras via fiberoptik.

Det näst vanligaste gränssnittet efter RS-232 är RS-485. Det är en industriell standard och överföringen i den utförs över tvinnat par, vilket ger den bra brusimmunitet och en ökad överföringshastighet på upp till 4 megabit per sekund. Längden på tråden här kan vara upp till 1 km. Vanligtvis används det i fabriker för att styra olika verktygsmaskiner.

Jag måste säga att IRDA, eller infraröd kommunikation, som är inbyggd i de flesta telefoner och handdatorer, också i huvudsak är en UART. Endast data överförs inte via ledningar, utan med hjälp av infraröd strålning.

SMART-kort (SIM, satellit-TV, bankkort) - just de enheter som varje phreaker med självrespekt drömmer om att stjäla - använder också vår älskade UART. Det är sant att det finns halvduplex dataöverföring, och arbetslogiken kan vara 1,8 / 3,3 och 5 volt. Det ser ut som att RX är lödd med TX i ena änden och i den andra - som ett resultat sänder en, den andra lyssnar i detta ögonblick och vice versa. Detta regleras av smartkortsstandarden. Så vi vet exakt hur många byte vi kommer att skicka och hur mycket kortet kommer att svara oss. Ämnet är värt en separat artikel. I allmänhet, kom ihåg att UART är nästan överallt.


Enheter som har en UART ombord, medurs: en mus, en läsaremulator av SMART-kort, en Palm m105 PDA, ett felsökningskort för en ATtiny2313 (eller AT89C2051) mikrokontroller, ett modem.

Gränssnittsparning

Jag har redan slitit ut mina ögon med olika gränssnitt, men hur arbetar man med dem? Jo, det är klart med vanlig RS-232, men till exempel med en 5-volts uart, hur är det? Det är enkelt: det finns olika färdiga omvandlarmikrokretsar. Som regel innehåller de siffrorna "232" i märkningen. Jag såg en mikruhu med dessa siffror i kretsen - var säker: troligtvis är detta en omvandlare. Genom sådana mikrokretsar med ett litet band är alla UART-gränssnitt sammankopplade. Jag kommer inte att prata om industriella gränssnitt, men jag kommer att berätta om de omvandlare som intresserar oss i första hand.

Den mest kända gränssnittsomvandlaren är en mikrokrets utvecklad av MAXIM, som fick en del av sitt namn från den (max232). Den kräver fyra kondensatorer från 0,1 mikrofarad till 4 mikrofarad och en 5 volt matning. Överraskande nog genererar denna 5 volts IC negativ spänning för att koppla ihop 5 volts UART med RS-232.

Det finns USB till UART-gränssnittschips som ft232rl-chippet. Ubuntu har inbyggda drivrutiner för detta chip. För Windows måste du ladda ner dem från den officiella webbplatsen. Efter installation av drivrutinerna kommer en virtuell COM-port att dyka upp i systemet, och du kan redan köra olika enheter med den. Jag råder dig att inte acceptera dessa mikrokretsar som de enda möjliga. Det finns ett stort antal billigare och mer intressanta analoger, tryck därför på Google och du kommer att förstå att UART-världen är cool.

Generellt sett är mikrokretsar ganska dyra och ibland kan man klara sig med mer komplexa men billigare kretsar på ett par transistorer.

Vad ger det oss?

Som du förstår finns UART-gränssnittet i många enheter där det finns en processor eller styrenhet. Jag kommer att säga ännu mer: om det finns en kontroller där, så är uart en komplett (endast den kan inte alltid användas). Som regel används detta gränssnitt för att ställa in och kontrollera enhetens funktionsduglighet. Ofta är tillverkaren tyst om närvaron av detta gränssnitt i produkten, men det är inte svårt att hitta det: ladda bara ner manualen till processorn så vet du var uart är. Efter att du har fått fysisk åtkomst till hårdvaran via vårt gränssnitt kan du anpassa den efter eget gottfinnande eller till och med få den att fungera, som du behöver, och inte som tillverkaren avsett. I allmänhet, för att pressa ut det maximala ur en blygsam enhet. Kunskap om detta protokoll gör det också möjligt att avlyssna vad som händer i utbyteslinjerna mellan olika processorer, eftersom tillverkare ofta organiserar hela uart-nätverk i sin enhet. I allmänhet finns det många applikationer, det viktigaste är att intuitivt förstå hur man gör det.

Uppdatera routern

Häromdagen skaffade jag mig en WiFi-router WL-520GU och efter att ha läst Steps artikel "Nivå upp för en åtkomstpunkt" (] [# 106), installerade jag Linux där. Men jag har problem med att montera swap-partitionen på min hårddisk. Så det blev nödvändigt att titta på startloggen för åtkomstpunkten - om partitionen var monterad eller inte - och, som de säger, i farten, för att omedelbart göra de nödvändiga ändringarna. Med ett sjätte sinne misstänkte jag att det måste finnas en UART i min router. Jag tog upp en stjärnskruvmejsel och började plocka isär den. Saken är trivial, men med ett trick - de hemliga skruvarna är under gummifötterna (om du bestämmer dig för att upprepa det, kom ihåg att när du analyserar det, förlorar du garantin). Jag såg ett ganska tråkigt kort, där allt är "chip-in-one": en central processor, som innehåller allt, en extern operatör, en flash-enhet, en strömomvandlare och en rad kontakter med knappar. Men brädan hade en olödd kontaktdyna, eller snarare, hål för nålar. Det var fyra av dem. Här är det UART, det är uppenbart! På tavlan, även utan multimeter, kan du se att de extrema nålarna är +3,3 volt och den andra är jordad. Mittstiften är RX respektive TX. Vilken är det, är lätt att fastställa med den vetenskapliga poke-metoden (det är mycket problematiskt att bränna gränssnittet).
Jag vill genast notera att UART-gränssnittet i varje router ser annorlunda ut. I de flesta fall är dessa inte lödda hål på brädan. Det är sant att jag i en ASUS-router till och med stötte på en fullt signerad kontakt.

Montering av omvandlaren

För att ansluta routern till en dator måste du para ihop RS-232-gränssnitten med routerns UART. I grund och botten kan du ansluta till USB med FT232RL-chippet som nämns ovan - vilket jag gjorde när jag först kollade routern. Men denna mikrokrets är i ett fall som är ganska komplext för lödning, därför kommer vi att prata om enklare lösningar. Nämligen mikrokretsen MAX232. Om du ska drivas av en router så blir det med största sannolikhet 3,3 volt, så det är bättre att använda MAX3232 som vanligtvis finns i handdatorn (kopplingsschemat är lätt att hitta på internet). Men i min router fanns en +5 volts strömförsörjning vid ingången, och jag har väldigt många av dessa mikrokretsar, och jag brydde mig inte om det. För montering behöver vi 0,1 uF kondensatorer (4 stycken) och själva mikrokretsen. Vi löder allt enligt det traditionella schemat och börjar experiment.


Källkoder för montering

Jag hängde omedelbart en 9-stifts hankontakt på utgången så att jag enkelt kunde ansluta en nollmodemkabel. Om du kommer ihåg, under DOS-dagarna användes sådana kablar för att göra ett rutnät av två datorer och skar dem i Dyuknyuk. Tråden för våra ändamål är lätt att montera. Visserligen kommer det inte att visa sig vara ett komplett nollmodem och du kommer inte att spela mycket genom det, men det kommer att vara själva grejen att styra åtkomstpunkten! Du behöver två 9-stifts honkontakter, fodral för dem och en tråd, till exempel från en gammal mus eller tangentbord (huvudsaken är att den har tre ledningar). Först ansluter vi jorden ¬- detta är den femte kontakten på kontakterna; ta bara vilken tråd som helst och löd den till det 5:e stiftet på båda sidor. Men med RX och TX måste du göra det mer listigt. Från ena änden av tråden löder vi till den tredje kontakten och från den andra - till den andra. På samma sätt med den tredje tråden, bara från ena änden löder vi till den andra kontakten, från den andra - till den tredje. Summan av kardemumman är att TX måste sända till RX. Vi gömmer de lödda kontakterna i fodralet - och nollmodemkabeln är klar!


Löda stift på routerkortet.

För att underlätta installationen lödde jag fast stiftkontakten i routerns moderkort och den omvända kontakten i monteringen med MAX232 och satte in kortet, som i en kortplats. RX och TX för routern väljs experimentellt.


Monterad bräda

Nu måste du driva omvandlarens mikrokrets. Vi har redan en gemensam ledning direkt i kontakten på routerns mamma. Men + 5 volt ligger precis vid strömingången på routern, på den plats där adaptern är ansluten. Vi bestämmer platsen för 5 volt med en voltmeter, och mäter olika noder i förhållande till routerns jord.
Vi ansluter strömförsörjningen. Vi slår på och startar våra skadliga experiment.


Vi bränner ett hål för utmatning av ledningar


Olödd COM-port


Alla är här. Observera att den röda strömkabeln går till adapterporten på routern. Knuten inuti är gjord för att rycka loss de lödda trådarna.

Terminalinställning

Vi måste sätta upp ett terminalprogram. I Windows är allt ganska enkelt: vi startar Hyper Terminal, stänger av programvaran och hårdvarudataverifieringen, ställer in hastigheten till 115200 och en stoppbit. Men i Linux är situationen lite knepigare. Jag har Ubuntu och jag ska prata om det. Ta först reda på hur COM-porten kallas i din assembly. I mitt fall var COM1 ttyS0 (om vi till exempel använder en FT232-mikrokrets kommer den att heta ttyUSB0). För att arbeta med det använde jag minicom-mjukvaran.

Kör den med följande parametrar: minicom -l -8 -c på -s. Välj sedan "Serial Port Settings":
Seriell port / dev / ttyS0

* Baudhastighet / paritet / bitar 115200 8N1
* Hårdvaruflödeskontroll - nr
* Programvaruflödeskontroll - nr

Vi sparar inställningarna. Softina kommer att försöka initiera modemet - var inte uppmärksam. Tryck på för att ta fram menyn ... Där kan du ändra inställningarna, till exempel: aktivera/avaktivera eko - E.
Anpassning

Jag rekommenderar inte att ansluta en omvandlarmikrokrets till en router för att testa dess funktionalitet. Det är bara tillåtet att ta mat från den. Kontrollen är mycket enkel - du måste byta RX från TX. Först överbryggar du den 2:a och 3:e kontakten i COM-porten - du kontrollerar terminalinställningarna. Du skriver något på tangentbordet: om tecknen returneras är allt OK. Du kollar även kabeln, samma kontakter. Sedan ansluter du mikrokretsen och sätter redan en bygel vid dess utgång. Jag fokuserar på detta eftersom jag till exempel hade problem och ingenting fungerade förrän jag kollade allt och hittade ett fel.

Efter alla inställningar kan du säkert hålla fast vid routern och leta efter RX-TX på routern och med jämna mellanrum dra ut strömmen från den. Om allt är gjort korrekt, när du slår på strömmen, kommer du att se routerns startlogg. Grattis, nu har du en full hårdvarorot, som om du satt vid en bildskärm med ett routertangentbord.


Router boot logga in i minicom-programmet

Autonom segling

Håller med, att göra samma sak genom ett terminalprogram, vilket är bekvämare att göra genom SSH - ingen is. Jag ville förvandla routern till en fristående Linux-dator, med sin egen smarta arkitektur. För att göra detta är det nödvändigt att data från tangentbordet överförs via UART, och via den visas de på monitorn. Det var lat att löda och designa enheten. Det var då idén kom att använda handdatorn, som samlade damm och ingenting, för dessa ändamål. Faktum är att handdatorn kommer att spela rollen som ett tangentbord och en skärmkontroller och kommer att fungera som gränssnitt.

Först provade jag den äldsta Palm m100. Men uppenbarligen har han ett väldigt litet buffertminne, och mängden data som går från routern fick honom att må dåligt. Jag tog en annan - en industriell PDA, med en normal COM-port och en terminal. Jag kopplade in den, satte den i dockan och som ett resultat fick jag en liten Linux-dator. I princip, istället för en dyr industriell PDA, är de flesta handdatorer som arbetar under WinCE-operativsystemet lämpliga, det viktigaste är att hitta en lämplig terminalprogramvara.


Linux dator :)

Resultat

Så jag visade ett litet exempel på att använda UART. Om du tar en smak av detta protokoll, tro mig, du kommer helt enkelt att bli mästare på olika järnbitar. Det finns det nästan överallt, och genom det kan man kombinera till synes helt olika saker. Till samma router, med små inställningar, ansluts till exempel en mobiltelefon via Uart, och den distribuerar internet från den. I allmänhet finns det många applikationer. Var inte rädd för att experimentera, utbilda dig själv och förverkliga dina idéer.

Det här inlägget är en redigerad version av min artikel i Hacker # 05/09 "The main phreaker tool" för habr.

Litteratur:
1. Mikhail Guk "PC Hardware Interfaces" - bara en elevs bibel på en persondator.

»Jag beskrev vad det betyder seriell universalport och vad är dess arbetslogik. Jag märkte att många blandar ihop begrepp UART, RS-232, COM etc. I detta inlägg vill jag förtydliga lite.



UART beskriver logiskt arbete, här det logiska 1-aär menat som hög signalnivå och logiskt 0-l, hur låg signalnivå... Fysiskt ... vad är kort och hög signalnivån beror på tekniker som är byggd på chipTTL, CMOS etc.

Eftersom majoritet mikrokretsarär TTL, sedan under logisk enhet och noll in UARTär förstådd 0V och + 5V som tidigare nämnts. Men att överföra data till distans, dvs. utanför styrelsen går det inte längre att använda sådana nivåer, pga dålig bullerimmunitet... Därför, det följande fysiska UART-nivåer:

  • RS-232(alias COM-port);
  • RS-422
  • RS-423(används för industriell automation);
  • RS-485(används för industriell automation);
  • IrDA(UART använder infrarött ljusvågsområde, annorlunda infrarött)

RS-232 tidigare använt i hemdatorer under namnet COM-port och serveras för ansluta möss, modem, skrivare... Vi kan säga - det här är mest allmänning från fysiska UART-nivåer... Namnet är byggt från frasen " Rekommenderad standard 232 ", Standarden utvecklades" Electronic Industries Association (EIA)"Tillbaka 1962.

Standarden har utvecklats över tiden:

  • RS-232C(1968);
  • EIA-232D(1987) - sedan 1986 började EIA istället för RS använda förkortningen EIA;
  • TIA / EIA 232-E (1991);
  • ANSI / TIA / EIA-232-F(1997).

Faktum är att när man pratar om RS-232 har i regel några av dessa standarder.

RS-232 var så framgångsrik vad står på den grund skapades identisk hur inhemsk så och utländska standarder:

  • (2000);
  • (1993);
  • GOST 18145-81
  • GOST R 50668-94

etc. Hela tricket är att det inte går att ladda ner 232-seriens standarder gratis ... du kan bara hitta ovanstående standarder och använda dem som originalkälla för studier RS-232 och UART.

(Om du fortfarande behöver originalstandarderna kan du köpa dem på TIAs (US Telecommunications Industry Association) webbplats)

Som kontakt för RS-232 Använd av 25 stift och 9-stift typ av kontakter D-sub som har en förkortad notation DB25 och DB9(kallas ibland KANON 25 och KANON 9).

Kontakter har slagit rot mer DB9.

Varför så många kontakter om för seriell universalport (UART) två datatrådar räcker TX och RX och tråd GND?

Poängen är att i standarden RS-232 utöver ovanstående används även servicesignaler, som " terminal beredskap«, « skicka förfrågan«, « beredskap att ta emot" etc. Nu används inte alltid servicesignaler i utrustning, det är möjligt att de bara är begränsade TX, RX och GND som i "ren" UART.

Det är viktigt att notera att i RS-232 som en logisk nivå enheter sortimentet är från -3V innan -12V och logiskt noll- från + 3V innan +12 .

(bilden lånad från "Guk M. PC Hardware Interfaces")

Från -3V innan + 3V, räknas osäkerhetszon.

Standard RS-232 manipulerar två typer av utrustning

  • DTE- "Utrustning för datainmatning", som regel en dator
  • DCE- "terminalutrustning för kommunikationslinjen", detta är vanligtvis modem / mus / skrivare etc.

För DTE kontakter på " pappa", för " DCE"Anslutningar av" Mor". Om du har på din dator COM hamn, titta ... du kommer att se kontakt med stift, dvs. "pappa".

Varför pratar jag om detta? Poängen är att för för enhetsanslutningar med COM det finns en hamn hetero och returkabel... Att ansluta DTE och DCE(t.ex. dator och modem) direkt koppla alla ben och kontakter, detta betyder att benet är ansvarigt för dataöverföring ( RxD) ingår i kontakten med samma namn ( RxD). En sådan koppling kallas direkt och kabeln hetero eller " modem«.

Det finns tillfällen då du behöver ansluta två DTE(till exempel två datorer) använd sedan omvänd anslutning kallas " nollmodem"Kabel. I det här fallet med RxD 1:a dator ansluter till TxD 2:a och TxD 1:a med RxD 2:a.

Om du vill lära dig mer om RS-232, Jag rekommenderar läsning standardöversikt på plats .

Du kommer att vara intresserad av: