- Kaj je komunikacijski protokol I2C?
- Kako deluje komunikacija I2C?
- Kje uporabiti komunikacijo I2C?
- I2C na Nuvoton N76E003 - Zahteva glede strojne opreme
- Povezava AT24LC64 z Nuvoton N76E003 - vezalni diagram
- I2C zatiči na Nuvoton N76E003
- Komunikacija I2C v N76E003
- Programiranje N76E003 za komunikacijo I2C
- Utripanje kode in izhoda
V obsežnem sistemu vdelanih aplikacij noben mikrokrmilnik ne more sam izvajati vseh dejavnosti. V določeni fazi časa mora komunicirati z drugimi napravami za izmenjavo informacij, obstaja veliko različnih vrst komunikacijskih protokolov za skupno rabo teh informacij, vendar so najpogosteje uporabljeni USART, IIC, SPI in CAN. Vsak komunikacijski protokol ima svojo prednost in slabost. Zaenkrat se osredotočimo na del IIC, saj se bomo tega naučili v tej vadnici. Če ste tu novi, si oglejte vadnice Nuvoton, kjer smo že od same osnovne vaje o uvodu razpravljali o vseh zunanjih napravah mikrokrmilnika N76E003. Če se želite naučiti, kako uporabljati I2C z drugimi mikrokrmilniki, si oglejte spodnje povezave.
- Kako uporabljati I2C v Arduinu: Komunikacija med dvema ploščama Arduino
- I2C Komunikacija z mikrokrmilnikom PIC PIC16F877
- Povezava 16X2 LCD z ESP32 z uporabo I2C
- I2C komunikacija z MSP430 Launchpad
- Povezava LCD-ja z NodeMCU brez uporabe I2C
- Kako ravnati z več komunikacijami (I2C SPI UART) v enem programu Arduino
I2C je pomemben komunikacijski protokol, ki ga je razvil Philips (zdaj NXP). S pomočjo tega protokola I2C lahko MCU povežete z več napravami in začnete komunikacijo. I2C deluje samo z dvema žicama, in sicer s SDA in SCL. Kjer SDA pomeni Serijski podatki, SCL pa Serijska ura. Vendar ta dva zatiča zahtevata vlečne upore do nivoja napetosti VCC in z ustreznim uporovnim uporom lahko vodilo podpira 127 naprav z edinstvenim naslovom.
Kaj je komunikacijski protokol I2C?
Izraz IIC pomeni " Inter integrirana vezja ". Običajno je označen kot I2C ali I na kvadrat C ali celo kot dvožični vmesniški protokol (TWI), ponekod pa vseeno pomeni enako. I2C je sinhroni komunikacijski protokol, kar pomeni, da morata obe napravi, ki si delita informacije, deliti skupen signal ure. Ima le dve žici za izmenjavo informacij, od katerih se ena uporablja za signal ure, druga pa za pošiljanje in sprejemanje podatkov.
Kako deluje komunikacija I2C?
Komunikacijo I2C je prvi predstavil Phillips. Kot že rečeno, ima dve žici, ti dve žici bosta povezani med dvema napravama. Tu se ena naprava imenuje master, druga pa slave. Komunikacija bi se morala in bo vedno potekala med dvema, gospodarjem in sužnjem. Prednost komunikacije I2C je v tem, da je na glavno enoto mogoče povezati več kot eno pomožno enoto.
Popolna komunikacija poteka prek teh dveh žic, in sicer serijske ure (SCL) in serijskih podatkov (SDA).
Serijska ura (SCL): deli urni signal, ki ga generira poveljnik, s pomožnim
Zaporedni podatki (SDA): pošlje podatke med glavno in pomožno enoto in med njimi.
Kadar koli bo samo poveljnik lahko sprožil komunikacijo. Ker je v vodilu več podrejenih naprav, se mora poveljnik sklicevati na vsakega podrejenega z drugim naslovom. Na naslov bo odgovoril le salve s tem naslovom, drugi pa bodo molčali. Na ta način lahko z istim vodilom komuniciramo z več napravami.
Kje uporabiti komunikacijo I2C?
Komunikacija I2C se uporablja samo za komunikacijo na kratke razdalje. Vsekakor je zanesljiv do neke mere, saj ima sinhroniziran urni impulz, da postane pameten. Ta protokol se v glavnem uporablja za komunikacijo s senzorjem ali drugimi napravami, ki morajo podatke pošiljati glavnemu vodilu. Zelo priročno je, kadar mora mikrokrmilnik komunicirati s številnimi drugimi pomožnimi moduli z najmanj samo žicami. Če iščete komunikacijo na dolge razdalje, poskusite RS232, če želite zanesljivejšo komunikacijo, pa protokol SPI.
I2C na Nuvoton N76E003 - Zahteva glede strojne opreme
Ker je zahteva tega projekta, da se naučimo komunikacije I2C z uporabo N76E003, bomo uporabili EEPROM, ki bo povezan s podatkovno linijo I2C. Nekaj podatkov bomo shranili v EEPROM in jih tudi prebrali ter prikazali na zaslonu UART.
Ker bo shranjena vrednost natisnjena v UART, je potreben kakršen koli pretvornik USB v UART. Če ste nov v komunikaciji UART na N76E003, si lahko ogledate tudi vadnico o UART z Nuvotonom. Za našo aplikacijo bomo uporabili pretvornik CP2102 UART v USB. Poleg zgoraj navedenega potrebujemo tudi naslednje komponente -
- EEPROM 24C02
- 2pcs 4.7k upori
Da ne omenjam, razen zgornjih delov, potrebujemo temelji N76E003 mikrokrmilniška razvojni svet kot tudi Nu-Link programer. Poleg tega so za povezavo vseh komponent potrebne tudi žice za pritrditev in priključne žice.
Povezava AT24LC64 z Nuvoton N76E003 - vezalni diagram
Kot lahko vidimo na spodnji shemi, je EEPROM povezan z linijo I2C skupaj z dvema upognima uporoma. Skrajno levo je prikazana povezava s programskim vmesnikom.
Uporabil sem ploščo za AT24LC64 IC in z mostičnimi žicami priključil IC na ploščo programerja nuvoton. Moja nastavitev strojne opreme skupaj s programatorjem nu-ink je prikazana spodaj.
I2C zatiči na Nuvoton N76E003
Shemo pinov N76E003 lahko vidite na spodnji sliki-
Kot lahko vidimo, ima vsak zatič različne specifikacije in ga je mogoče uporabiti za več namenov. Vendar se pin 1.4 uporablja kot I2C SDA pin, izgubil bo PWM in druge funkcije. Toda to ni problem, saj za ta projekt ni potrebna druga funkcionalnost. Enako se bo zgodilo za P1.3 je zatič SCL I2C.
Ker zatiči I2C delujejo kot GPIO, ga je treba konfigurirati. Vse zatiče GPIO je mogoče konfigurirati v spodaj opisanem načinu.
Glede na podatkovni list PxM1.n in PxM2. n sta dva registra, ki se uporabljata za določanje nadzornega delovanja V / I vrat. V obrazcu je navedeno, da je treba za uporabo I2C funkcionalnosti V / I načine uporabljati kot odprti odtok za komunikacije, povezane z I2C.
Komunikacija I2C v N76E003
Periferna enota I2C je pomembna za katero koli mikrokrmilniško enoto, ki podpira funkcije I2C. Številni tipi različnih mikrokrmilnikov imajo vgrajeno periferno enoto I2C. Vendar je v nekaterih primerih mogoče I2C ročno konfigurirati s programskim upravljanjem, kjer strojna podpora, povezana z I2C, ni na voljo (na primer veliko 8051 mikrokrmilnikov). Nuvoton N76E003 pa ima periferno podporo I2C.
M76E003 podpira štiri vrste operacij v načinu I2C - glavni oddajnik, glavni sprejemnik, podrejeni oddajnik in podrejeni sprejemnik. Podpira tudi standardno (100kbps) in hitro (do 400kbps) hitrost za linijo I2C. I2C deluje z nekaj splošnimi pravili v signalnih linijah SCL in SDA.
Pogoj za zagon in zaustavitev:
To je pomembna stvar v komunikaciji I2C. Ko se podatki prenesejo v vrstico I2C, se začnejo s pogojem začetka in končajo s pogojem zaustavitve.
Pogoj zagona je prehod med visokimi in najnižjimi vrednostmi na SDA, ko je linija SCL visoka, pogoj za zaustavitev pa je prehod med nizkimi in visokimi vrednostmi na SDA, ko je linija SCL visoka. Ta dva pogoja generira glavni (MCU ali karkoli, kar nadzoruje druge pomožne naprave). Avtobusna linija ostane zasedena v tem stanju, ko se sproži pogoj zagona, in ostane spet prosta, ko se sproži pogoj zaustavitve.
Pogoj za zagon in zaustavitev je odlično prikazan v perspektivi signala v obrazcu N76E003 -
7-bitni naslov s formatom podatkov:
N76E003 podpira 7-bitno obliko naslova in podatkov. Po zagonu pogoja zagona mora glavna naprava poslati podatke v linijo I2C. Prvi podatki so pomembni. Če se ti podatki ne ustvarijo ali prenesejo pravilno, priključena naprava ne bo prepoznana in nadaljnje komunikacije ni mogoče vzpostaviti.
Podatki so sestavljeni iz 7-bitnega podrejenega naslova, označenega kot SLA. Ta 7-bitni dolg naslov mora biti enoličen za vsako napravo, če je na vodilo priključenih več naprav. Po 7-bitnem naslovu je 8. bit bit smeri podatkov. To pomeni, da poveljnik, odvisno od 8. bita, pošlje podrejeni napravi podatke o tem, ali bodo podatki zapisani v podrejeno napravo ali bodo podatki prebrani iz podrejene naprave. 8. bit je R / W bit, ki se imenuje prijavitelj branja ali pisanja. Kot vsi vemo, so lahko 8-bitne informacije 128 vrst, s čimer podpirajo 128 naprav, vendar I2C podpira 127 vrst naprav na istem vodilu, ne pa 128. Ker je naslov 0x00 rezerviran naslov, ki se imenuje splošni klicni naslov. Če poveljnik želi informacije poslati vsem napravam,naslovil bo 0x00 in vsaka naprava se bo predvajala na enak način kot v posameznih konfiguracijah programske opreme.
Tako je prenos podatkov videti spodaj -
Potrdite:
Na zgornji sliki podatkovnega naslova se 9. bit, ki mu sledi R / W bit, imenuje potrditveni bit. Pomemben je, ker se z uporabo tega bita glavni ali podrejeni odzove na oddajnik podatkov tako, da nizko povleče SDA. Če želite dobiti potrditveni bit, mora oddajnik spustiti linijo SDA.
Programiranje N76E003 za komunikacijo I2C
Celoten program, uporabljen v tej vadnici, najdete na dnu te strani. Razlaga pomembnih segmentov kode je naslednja:
Nastavite zatiče kot odprti odtok in jih konfigurirajte za I2C:
Najprej začnimo z odsekom I2C pin. Kot je opisano prej, je treba vrata I2C SCL in SDA konfigurirati in nastaviti kot konfiguracijo odprtega odtoka. Da bi to naredili, smo z uporabo I2C.h header datoteko skupaj z izvorno datoteko I2C.c . Delček kode je videti takole -
naredite {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} medtem ko (0)
Zgornja koda nastavlja P13 in P14 kot zatič z odprtim odtokom, clr_I2CPX pa se uporablja za izbiro P13 in P14 kot zatiča SCL na P1.3 in SDA na P1.4.
Ta I2CPX je 0. bit nadzornega registra I2C I2CON. Če je ta I2C_PX nastavljen na 1, se zatiči spremenijo v P0.2 kot SCL in P1.6 kot SDA. Vendar bomo uporabili P13 in P14. Tukaj se ne uporabljajo alternativni zatiči.
Nadzorni register I2C I2CON:
Nadzorni register I2C I2CON se uporablja za nadzor operacij I2C. Prvi bit je bit za izbiro zatiča I2C. Če ga nastavite na 0, I2C pin nastavite na P13 in P14.
AA bit je oznaka za potrditev potrditve, če je zastavica AA nastavljena, bo ACK vrnjen med impulzom ure za potrditev linije SCL. Če je odstranjen, bo med potrjenim urnim impulzom linije SCL vrnjen NACK (visoka raven na SDA).
Naslednji bit je SI, ki je prekinitev stanja I2C. Če je omogočena prekinitev stanja I2C, mora uporabnik preveriti register I2STAT, da ugotovi, kateri korak je bil opravljen, in naj ukrepa.
STO je zastavica STOP, ki se nastavi v glavnem načinu. Ko je stanje STOP zaznano, strojna oprema samodejno izbriše STO.
Naslednji bit je STA bit. Če je ta zastavica nastavljena, potem I2C ustvari pogoj START, če je vodilo prosto. Če je avtobus zaseden, I2C počaka na stanje STOP in nato ustvari stanje START. Če je nastavljena STA, medtem ko je I2C že v glavnem načinu in je bil en ali več bajtov poslanih ali prejetih, I2C generira ponovljeni pogoj START. Programsko opremo je treba STA ročno počistiti.
Zadnji, I2CEN, je bit za omogočanje ali onemogočanje vodila I2C.
EEPROM 24C02:
Zdaj pa prihajamo do 24C02. Paket podpore plošče N76E003 ima kodo I2C za 24LC64 in jo je mogoče enostavno spremeniti. Za razumevanje funkcije I2C pa bomo uporabili preprosto metodo.
Če želi kdo uporabiti podrobno povezovanje z EEPROM 24C02, lahko uporabi program EEPROM v BSP.
24C02 bomo povezali samo v I2C, kjer bo N76E003 glavni in EEPROM podrejen. Tako bomo na naslov EEPROM zapisali vse podatke in jih prebrali.
24C02 EEPROM izhod je prikazan spodaj -
A0, A1 in A2 so trije zatiči za izbiro naslova. Zatiči WP so zatiči za zaščito pred pisanjem in jih je treba povezati z VSS, da omogočite pisanje v EEPROM.
Funkcija Byte Write je prikazana na spodnji sliki -
Celoten cikel pisanja se zgodi z začetnim bitom. Po tem je treba predložiti kontrolni bajt. V kontrolnem bajtu so potrebne naslednje stvari -
Po začetnem bitu je sestavljen iz podrejenega naslova. 1010 je statični, A0, A1 in A2 pa naslov, ki temelji na povezavi s strojno opremo. Če so trije zatiči povezani z napajanjem GND ali VSS, se to bere kot 0. V nasprotnem primeru se, če je povezan z VCC, bere kot 1. V našem primeru so vsi A0, A1 in A2 povezani z VSS. Tako bo vse to 0.
Poraba za pogoje branja ali pisanja. Vrednost naslova z branjem branja ali pisanja bo - 0xA0 za zapisovanje in 0xA1 za branje. Naslednji je potrditveni bit, nato pa bo poslan 8-bitni naslov, kamor je treba shraniti podatke, in nazadnje še podatke, ki bodo shranjeni na ustreznem mestu. Te stvari se izvajajo v postopni obliki v glavni funkciji.
Glavna funkcija in zanka:
void main (void) {char c = 0x00; Začetni UART0_Timer3 (115200); TI = 1; // Pomembno: uporaba funkcije prinft mora nastaviti TI = 1; I2C_init (); medtem ko (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n Prebrana vrednost je% x", c & 0xff); }; }
Glavna funkcija je preprosta, neprekinjeno zapisuje vrednosti v EEPROM na naslov 1 in bere podatke. Podatki se nato natisnejo s funkcijo printf. Printf tiska vrednost v šestnajstiškem znaku.
Funkcija zapisovanja EEPROM je sestavljena iz naslednjih stvari, ki so bile opisane v poglavju EEPROM-
void EEPROM_write (nepodpisan naslov char, nepodpisana vrednost char) {I2C_start (); I2C_write (0xA0); I2C_write (naslov); I2C_write (vrednost); I2C_stop (); }
Funkcija zagona I2C je sestavljena iz naslednjih stvari -
void I2C_start (void) {podpisan int time = timeout; set_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
V tej funkciji se preverja status SI skupaj z vnaprej določenim časom izteka (definiranim v I2C.h, kjer je vnaprej določen čas 1000). Funkcija zagona se začne z nastavitvijo STA in brisanjem SI.
void I2C_stop (void) {podpisan int time = timeout; clr_SI; set_STO; while ((STO == 1) && (time> 0)) {time--; }; }
Enako kot funkcija Start, Stop se uporablja. Funkcija zaustavitve se sproži z nastavitvijo STO, ki ji sledi brisanje SI. Spodnja funkcija je funkcija branja I2C -
nepodpisani znak I2C_read (nepodpisan znak ack_mode) {podpisan int time = timeout; nepodpisana vrednost znaka = 0x00; set_AA; clr_SI; while ((SI == 0) && (t> 0)) {time--; }; vrednost = I2DAT; if (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; while ((SI == 0) && (t> 0)) {time--; }; } vrnjena vrednost; }
Ack_mode in I2C_NACK , oba sta definirana v glavi datoteki I2C kot 0 in 1 oz.
Podobno se ustvari funkcija pisanja -
void I2C_write (nepodpisana vrednost znaka) {podpisan int time = timeout; I2DAT = vrednost; clr_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
Utripanje kode in izhoda
Koda je vrnila 0 opozoril in 0 napak in jo je Keil utripal s privzeto utripajočo metodo. Če ste novi, si oglejte uvod v vadnico nuvoton, da boste razumeli, kako naložiti kodo. Informacije o zbiranju kode najdete spodaj.
Zgradite cilj 'I2C_EEPROM', ki prevaja I2C_EEPROM.c… sestavlja I2C.c… povezuje… Velikost programa: data = 59,2 xdata = 0 code = 2409 ustvarjanje šestnajstiške datoteke iz ". \ Output \ I2C_EEPROM"… ". \ Izhod \ I2C_EEPROM "- 0 Napake, 0 Opozorila. Čas gradnje potekel: 00:00:04 Povzetek serijske gradnje: 1 je uspel, 0 ni uspel, 0 je bil preskočen - čas potekel: 00:00:04
Strojna oprema je postavljena na plošči in deluje po pričakovanjih. Kot lahko vidite na spodnji sliki, smo lahko na EEPROM zapisali vrednost in jo prebrali nazaj iz pomnilnika ter prikazali na serijskem monitorju.
Oglejte si spodnji video za popoln prikaz delovanja plošče za to kodo. Upam, da ste uživali v vadnici in se naučili kaj koristnega, če imate kakršna koli vprašanja, jih pustite v spodnjem oddelku za komentarje. Na naših forumih lahko objavite tudi druga tehnična vprašanja.