- UART komunikacijos pagrindai
- Aparatinės įrangos reikalavimas ir sąranka
- „Nuvoton N76E003“ UART ryšio grandinės schema
- UART „Nuvoton N76E003“ mikrovaldiklio kaiščiai
- UART registruojasi „Nuvoton N76E003“ mikrovaldiklyje
- UART veikimo režimai N76E003
- Nuvoton N76E003 programavimas UART ryšiui
UART reiškia universalų asinchroninį imtuvą / siųstuvą ir tai yra naudinga bet kurio mikrovaldiklio bloko aparatinės įrangos funkcija. Mikrovaldiklis turi gauti duomenis, juos apdoroti ir siųsti į kitus įrenginius. Mikrovaldiklyje yra įvairių tipų ryšio protokolų, tačiau UART yra dažniausiai naudojamas tarp kitų ryšio protokolų, tokių kaip SPI ir I2C. Jei kam nors reikia gauti arba perduoti duomenis nuosekliai, UART visada yra paprasčiausias ir įprastas variantas. UART pranašumas yra tai, kad norint perduoti duomenis tarp įrenginių reikia tik dviejų laidų. Tęsdami mūsų „Nuvoton“ mikrovaldiklių pamoką, šiame straipsnyje sužinosime, kaip atlikti nuoseklųjį ryšį naudojant „N76E003“ mikrovaldiklį.
UART komunikacijos pagrindai
Dabar, kai žinome, kas yra UART, svarbu žinoti susijusius UART parametrus.
Du UART įrenginiai duomenis priima ir perduoda tuo pačiu dažniu. Kai priimantis UART įrenginys aptinka pradinį bitą, jis pradeda skaityti gaunamus bitus tam tikru dažniu, vadinamu duomenų perdavimo greičiu. Duomenų perdavimo sparta yra svarbus dalykas UART ryšiui ir jis naudojamas duomenų perdavimo greičiui matuoti bitais per sekundę (bps). Šis perdavimo greitis, norint perduoti ir priimti, turi būti toks pat. Siunčiant ir priimant UART perdavimo spartos greičio skirtumas gali būti tik apie 10%, kol bitų laikas nebus per toli. Populiariausi perdavimo spartos greičiai yra 4800, 9600, 115200 bps ir kt. Anksčiau mes naudojome UART ryšį daugelyje kitų mikrovaldiklių, kurie išvardyti toliau.
- UART „ATmega8“ ir „Arduino Uno“ ryšys
- UART Ryšys tarp dviejų mikrovaldiklių „ATmega8“
- UART ryšys naudojant PIC mikrovaldiklius
- UART komunikacija apie STM8S mikrovaldiklį
N76E003 turi dvi UART - UART0 ir UART1. Šioje pamokoje naudosime N76E003 mikrovaldiklio bloko UART periferinį įrenginį. Negaišdami daug laiko, įvertinkime, kokios aparatinės įrangos sąrankos mums reikia šiai programai.
Aparatinės įrangos reikalavimas ir sąranka
Pagrindinis šio projekto komponentas yra USB į UART arba TTL keitiklio modulis, kuris sudarys sąsają tarp kompiuterio ar nešiojamojo kompiuterio su mikrovaldiklio moduliu. Šiam projektui naudosime CP2102 pagrįstą USB į UART modulį, kuris parodytas žemiau.
Maža to, išskyrus pirmiau minėtą komponentą, mums reikia N76E003 mikrovaldikliais paremtos kūrimo plokštės, taip pat „ Nu-Link Programmer“. Gali prireikti papildomo 5 V maitinimo bloko, jei programuotojas nenaudojamas kaip maitinimo šaltinis.
„Nuvoton N76E003“ UART ryšio grandinės schema
Kaip matome žemiau esančioje kūrimo plokštės schemoje, 2 ir 3 mikrovaldiklio bloko kaiščiai naudojami atitinkamai kaip UART0 Tx ir Rx. Kairiajame kairiajame kampe rodomas programavimo sąsajos ryšys.
UART „Nuvoton N76E003“ mikrovaldiklio kaiščiai
N76E003 turi 20 kontaktų, iš kurių 4 kontaktus galima naudoti UART ryšiui. Žemiau esančiame paveikslėlyje rodomi UART kaiščiai, paryškinti raudoname kvadrato laukelyje (Rx) ir mėlynos spalvos kvadrato laukelyje (Tx).
Naudojant UART0, 2 ir 3 kontaktai naudojami UART ryšiui, o UART1 - 8 ir 18 kontaktai.
UART registruojasi „Nuvoton N76E003“ mikrovaldiklyje
N76E003 turi du patobulintus dvipusius UART su automatiniu adresų atpažinimu ir kadravimo klaidų aptikimu - UART0 ir UART1. Šie du UART valdomi naudojant registrus, suskirstytus į du skirtingus UART. N76E003 yra dvi RX ir TX kaiščių poros UART operacijoms. Taigi pirmiausia reikia pasirinkti norimą UART prievadą operacijoms.
Šioje pamokoje mes naudosime UART0, taigi konfigūracija bus rodoma tik UART0. UART1 konfigūracija bus ta pati, tačiau registrai bus skirtingi.
Pasirinkus vieną UART (šiuo atveju UART0), įvesties ir išvesties konfigūraciją reikia nustatyti įvesties / išvesties kaiščiams, kurie turi būti naudojami RX ir TX ryšiams. UART0 RX kaištis yra mikrovaldiklio 3 kaištis, kuris yra 0.7 prievadas. Kadangi tai yra nuoseklaus prievado priėmimo kaištis, reikia įvesti prievadą 0.7. Kita vertus, prievadas 0.6, kuris yra antrasis mikrovaldiklio kaištis, yra perdavimo kaištis arba išvesties kaištis. Jį reikia nustatyti kaip beveik dvikryptį režimą. Juos galima pasirinkti naudojant PxM1 ir PxM2 registrą. Šie du registrai nustato įvesties / išjungimo režimus, kur x reiškia prievado numerį (pvz., Prievadas P1.0 registras bus P1M1 ir P1M2, P3.0 - P3M1 ir P3M2 ir kt.) matyti žemiau esančiame paveikslėlyje-
UART veikimo režimai N76E003
Tada kitas žingsnis yra nustatyti UART operacijų režimą. Du UART gali veikti 4 režimais. Režimai yra
Kaip matome, SM0 ir SM1 (7 ir 6 SCON registro bitai) pasirenka UART operacijų režimą. 0 režimas yra sinchroninis veiksmas, o kiti trys režimai yra asinchroniniai veiksmai. Tačiau perdavimo spartos generatorius ir „ Frame“ bitai skiriasi kiekviename nuoseklaus prievado režime. Bet kurį iš režimų galima pasirinkti pagal programos reikalavimus, ir tai yra tas pats UART1. Šioje pamokoje naudojama 10 bitų operacija su 3 laikmačio perpildymo greičiu, padalyta iš 32 arba 16.
Dabar atėjo laikas gauti informacijos ir sukonfigūruoti UART0 SCON registrą (SCON_1 UART1).
6 ir 7 bitai nustatys UART režimą, kaip aptarta anksčiau. 5 bitas naudojamas nustatyti kelių procesorių ryšio režimą, kad būtų įjungtos parinktys. Tačiau procesas priklauso nuo to, kuris UART režimas yra pasirinktas. Išskyrus šiuos, REN bitai bus nustatyti į 1, kad būtų galima priimti, o TI vėliava bus nustatyta į 1, jei norite naudoti funkciją printf vietoj pasirinktinės UART0 perdavimo funkcijos.
Kitas svarbus registras yra „ Power control register“ (PCON) registras („Timer 3 bit 7 and 6 for UART1“). Jei jūs dar nesinaudojote laikmačiais, peržiūrėkite „Nuvoton N76E003 Timer“ mokymo programą, kad suprastumėte, kaip naudoti laikmačius „N76E003“ mikrovaldiklyje.
SMOD bitai yra svarbūs norint pasirinkti dvigubą duomenų perdavimo greitį UART0 režimu 1. Dabar, kai mes naudojame laikmatį 3, reikia sukonfigūruoti laikmačio 3 valdymo registrą T3CON. Tačiau 7 ir 6 bitai yra rezervuoti dvigubo duomenų perdavimo spartos nustatymui UART1.
„Timer 3“ priešskalerio vertė -
5-asis bitų BRCK nustatys „Timer 3“ kaip „UART1“ duomenų perdavimo spartos šaltinį. Dabar „N76E003“ duomenų lape pateikiama formulė, skirta apskaičiuoti norimą perdavimo spartą, taip pat „Timer 3“ (16 bitų) aukštų ir žemų registrų pavyzdžių rinkinio vertė.
16 Mhz laikrodžio šaltinio pavyzdinė vertė -
Taigi duomenų perdavimo greitį reikia sukonfigūruoti „Timer 3“ registre pagal aukščiau pateiktą formulę. Mūsų atveju tai bus „Formulė 4.“. Po to, paleidus laikmatį 3 nustatant TR3 registrą į 1, bus baigtas UART0 inicijavimo laikmatis 3. Norėdami gauti ir išsiųsti UART0 duomenis, naudokitės toliau pateiktu registru.
SBUF Registruotis automatiškai gauna sukonfigūruotas priimti ir perduoti. Norėdami gauti duomenis iš UART, palaukite, kol RI vėliava nustatys 1, perskaitykite SBUF registrą ir išsiųskite duomenis į UART0, nusiųskite duomenis į SBUF ir palaukite, kol TI vėliava gaus 1, kad patvirtintų sėkmingą duomenų perdavimą.
Nuvoton N76E003 programavimas UART ryšiui
Kodavimo dalis yra paprasta, o visą mokomąjį kodą galite rasti šio puslapio apačioje. Kodas paaiškinamas taip: UART0 inicijuojamas 9600 baudos greičiu, naudojant pagrindinės funkcijos sakinį-
InitialUART0_Timer3 (9600);
Aukščiau funkcija yra apibrėžta common.c failą ir jį konfigūruoti UART0 su laikmačiu 3, Baud norma šaltinio, 1 režimas, ir su Baud norma 9600. Ši funkcija apibrėžimas yra tokie-
void InitialUART0_Timer3 (UINT32 u32Baudrate) // naudoti laikmatį3 kaip Baudrate generatorių { P06_Quasi_Mode; // UART kaiščio nustatymas kaip kvazio režimas perdavimui P07_Input_Mode; // UART kaiščio nustatymas kaip įvesties režimas gaunant SCON = 0x50; // UART0 Mode1, REN = 1, TI = 1 set_SMOD; // UART0 dvigubo tarifo įgalinimas T3CON & = 0xF8; // T3PS2 = 0, T3PS1 = 0, T3PS0 = 0 (Prescale = 1) rinkinys_BRCK; // UART0 perdavimo spartos laikrodžio šaltinis = Timer3 #ifdef FOSC_160000 RH3 = HIBYTE (65536 - (1000000 / u32Baudrate) -1); / * 16 MHz * / RL3 = LOBYTE (65536 - (1000000 / u32Baudrate) -1); / * 16 MHz * / endif # ifdef FOSC_166000 RH3 = HiByte (65536 - (1037500 / u32Baudrate)); /*16,6 MHz * / RL3 = LOBYTE (65536 - (1037500 / u32Baudrate)); / 16,6 MHz * / endif set_TR3; // Suaktyvinimo laikmatis3 rinkinys_TI; // Jei funkcija „printf“ turi nustatyti TI = 1 }
Deklaravimas atliekamas žingsnis po žingsnio, kaip aptarta anksčiau, ir registrai yra atitinkamai sukonfigūruoti. Tačiau N76E003 BSP bibliotekoje yra klaida, kuri yra vietoj P07_Input_Mode; yra P07_Quasi_Mode . Dėl šios priežasties UART gavimo funkcija neveiks.
Perdavimo greitis taip pat sukonfigūruojamas pagal duomenų perdavimo spartą ir naudojant duomenų lape pateiktą formulę. Dabar pagrindinėje funkcijoje arba „ while“ cikle naudojama funkcija printf. Norint naudoti „ printf“ funkciją, TI reikia nustatyti kaip 1. Išskyrus tai, „ while“ cikle naudojamas jungiklio atvejis ir pagal gautus UART duomenis spausdinama vertė.
while (1) { printf ("\ r \ nPaspauskite 1 arba paspauskite 2 arba paspauskite 3 arba paspauskite 4"); oper = gauti_duomenis_iš_UART0 (); jungiklis (oper) { atvejis '1': printf ("\ r \ n1 paspaustas"); pertrauka; atvejis '2': printf ("\ r \ n2 paspaustas"); pertrauka; atvejis '3': printf ("\ r \ n3 paspaustas"); pertrauka; atvejis '4': printf ("\ r \ n4 paspaustas"); pertrauka; numatytasis: printf ("\ r \ n Neteisingas mygtukas paspaustas"); } Laikmatis0_Delay1ms (300); } }
Na, už UART0 gaukite Receive_Data_From_UART0 (); naudojama funkcija. Jis taip pat apibrėžtas common.c bibliotekoje.
UINT8 gauti_duomenis_iš_UART0 (niekinis) { UINT8 c; o (! RI); c = SBUF; RI = 0; grįžimas (c); }
Ji lauks, kol RI vėliava gaus 1, ir grąžins gautus duomenis naudodamas kintamąjį c.
Mirksintis kodas ir išvestis
Kodas grąžino 0 įspėjimo ir 0 klaidų ir mirksėjo naudojant numatytąjį „Keil“ mirksėjimo metodą. Jei nesate tikri, kaip sukompiliuoti ir įkelti kodą, peržiūrėkite straipsnį „nuvoton“. Žemiau pateiktos eilutės patvirtina, kad mūsų kodas sėkmingai įkeltas.
Pradėta atstatyti: Projektas: printf_UART0 Atkurti tikslą „GPIO“, rengiant PUTCHAR.C… kompiliuojant Print_UART0.C… kompiliuojant Delay.c… kompiliuojant Common.c… surinkiant STARTUP.A51… susiejant… Programos dydis: duomenys = 54,2 xdata = 0 kodas = 2341 kuriant šešioliktainį failą iš „. \ Output \ Printf_UART1"… ". \ Output \ Printf_UART1" - 0 klaidų, 0 įspėjimas (-ai). Praėjęs sukūrimo laikas: 00:00:02 Įkelti „G: \\ n76E003 \\ programinę įrangą \ N76E003_BSP_Keil_C51_V1.0.6 \ Sample_Code \\ UART0_Printf \\ Output \ Printf_UART1“ „ Flash Erase Done“. „Flash Write Done“: užprogramuoti 2341 baitai. „Flash“ patvirtinimas atliktas: patvirtinta 2341 baitas. „Flash“ apkrova baigta 15:48:08
Kūrimo plokštė yra prijungta prie maitinimo šaltinio per programuotoją ir nešiojamąjį kompiuterį naudojant USB į UART modulį. Norint rodyti arba siųsti UART duomenis, reikalinga serijinio monitoriaus programinė įranga. Šiam procesui naudoju tera terminą.
Kaip matote žemiau esančiame paveikslėlyje, aš galėjau parodyti eilutes, atsiųstas iš mūsų nuvoton valdiklio, ir parodyti serijinio monitoriaus programinėje įrangoje. Taip pat sugebėjo nuskaityti vertes iš nuoseklaus monitoriaus.
Norėdami išsamią šios pamokos demonstraciją, galite peržiūrėti žemiau pateiktą vaizdo įrašą. Tikiuosi, kad jums patiko straipsnis ir sužinojote ką nors naudingo. Jei turite klausimų, galite juos palikti komentarų skiltyje žemiau arba naudoti mūsų forumus kitiems techniniams klausimams skelbti.