- Kas yra „I2C“ ryšio protokolas?
- Kaip veikia „I2C“ ryšys?
- Kur naudoti „I2C“ ryšį?
- I2C „Nuvoton N76E003“ - techninės įrangos reikalavimas
- Sąsaja AT24LC64 su „Nuvoton N76E003“ - grandinės schema
- „I2C“ kaiščiai „Nuvoton N76E003“
- „I2C“ ryšys N76E003
- N76E003 programavimas I2C ryšiui
- Mirksintis kodas ir išvestis
Didžiulėje įterptųjų programų sistemoje joks mikrovaldiklis negali pats atlikti visų veiksmų. Tam tikru laiko tarpsniu ji turi bendrauti su kitais įrenginiais, kad galėtų dalytis informacija, yra daug įvairių komunikacijos protokolų tipų , kad būtų galima dalytis šia informacija, tačiau dažniausiai naudojami yra USART, IIC, SPI ir CAN. Kiekvienas ryšio protokolas turi savo privalumų ir trūkumų. Dabar sutelkime dėmesį į IIC dalį, nes tai, ko mes mokysimės šioje pamokoje. Jei esate čia naujas, patikrinkite „Nuvoton“ mokymo programas, kuriose aptarėme kiekvieną „N76E003“ mikrovaldiklio periferinį įrenginį nuo pat pradžios pamokos. Jei norite sužinoti, kaip naudoti I2C su kitais mikrovaldikliais, galite patikrinti toliau pateiktas nuorodas.
- Kaip naudoti „I2C“ sistemoje „Arduino“: Ryšys tarp dviejų „Arduino“ plokščių
- „I2C“ ryšys su PIC mikrovaldikliu PIC16F877
- Sąsaja 16X2 LCD su ESP32 naudojant I2C
- „I2C“ ryšys su „MSP430 Launchpad“
- Sąsajos skystųjų kristalų ekranas su „NodeMCU“ nenaudojant „I2C“
- Kaip tvarkyti daugialypį ryšį (I2C SPI UART) vienoje „Arduino“ programoje
„I2C“ yra svarbus „Philips“ (dabar NXP) sukurtas ryšio protokolas. Naudojant šį I2C protokolą, MCU galima prijungti prie kelių įrenginių ir pradėti ryšį. „I2C“ veikia tik su dviem laidais, būtent su SDA ir SCL. Kur SDA reiškia serijinius duomenis, o SCL - serijinį laikrodį. Tačiau šiems dviem kaiščiams reikalingi prisitraukimo rezistoriai iki VCC įtampos lygio, o turint tinkamą prisitraukimo rezistorių, magistralė galėtų palaikyti 127 įrenginius, turinčius unikalų adresą.
Kas yra „I2C“ ryšio protokolas?
Terminas IIC reiškia „ Inter Integrated Circuits “. Kai kuriose vietose jis paprastai žymimas kaip I2C arba I kvadratas arba net kaip 2 laidų sąsajos protokolas (TWI), tačiau visa tai reiškia tą patį. „I2C“ yra sinchroninio ryšio protokolo reikšmė, abu prietaisai, kurie dalijasi informacija, turi turėti bendrą laikrodžio signalą. Ji turi tik du laidus dalytis informacija, iš kurių vienas naudojamas laikrodžio signalui, o kitas - duomenims siųsti ir priimti.
Kaip veikia „I2C“ ryšys?
Pirmą kartą „I2C“ ryšį pradėjo Phillipsas. Kaip minėta anksčiau, jis turi du laidus, šie du laidai bus sujungti per du įrenginius. Čia vienas įrenginys vadinamas pagrindiniu, o kitas - vergu. Bendravimas turėtų ir visada vyks tarp dviejų, šeimininko ir vergo. „I2C“ ryšio pranašumas yra tas, kad prie „Master“ galima prijungti daugiau nei vieną vergą.
Pilnas ryšys vyksta per šiuos du laidus, ty nuoseklųjį laikrodį (SCL) ir nuoseklius duomenis (SDA).
Serijinis laikrodis (SCL): dalijasi pagrindinio kompiuterio sukurtu laikrodžio signalu su vergu
Serijos duomenys (SDA): siunčia duomenis į pagrindinį ir pavaldinį ir iš jų.
Bet kuriuo metu tik kapitonas galės inicijuoti bendravimą. Kadangi magistralėje yra daugiau nei vienas vergas, kapitonas turi nurodyti kiekvieną vergą naudodamas kitą adresą. Kai kreipiamasi tik į tą konkretų adresą turintį kremą, atsakys informacija, o kiti tylės. Tokiu būdu mes galime naudoti tą pačią magistralę, kad galėtume bendrauti su keliais įrenginiais.
Kur naudoti „I2C“ ryšį?
I2C ryšys naudojamas tik trumpam atstumui. Tai tikrai tam tikru mastu, nes turi sinchronizuotą laikrodžio impulsą, kad būtų protingas. Šis protokolas daugiausia naudojamas ryšiui su jutikliu ar kitais prietaisais, kurie turi siųsti informaciją kapitonui. Labai patogu, kai mikrovaldiklis turi bendrauti su daugeliu kitų vergo modulių, naudodamas mažiausiai tik laidus. Jei ieškote ilgalaikio ryšio, turėtumėte išbandyti RS232, o jei norite patikimesnio ryšio, išbandykite SPI protokolą.
I2C „Nuvoton N76E003“ - techninės įrangos reikalavimas
Kadangi šio projekto reikalavimas yra išmokti I2C ryšį naudojant N76E003, naudosime EEPROM, kuris bus sujungtas su I2C duomenų linija. Kai kuriuos duomenis išsaugosime EEPROM, taip pat juos perskaitysime ir rodysime naudodami UART ekraną.
Kadangi išsaugota vertė bus atspausdinta UART, reikalingas bet koks USB į UART keitiklį. Taip pat galite sužinoti apie „UART“ su „Nuvoton“ pamoką, jei esate naujokas „UART“ komunikacijai N76E003. Savo programai naudosime CP2102 UART į USB keitiklį. Be pirmiau minėtų dalykų, mums taip pat reikalingi šie komponentai:
- EEPROM 24C02
- 2vnt 4.7k rezistoriai
Maža to, išskyrus aukščiau nurodytus komponentus, mums reikia N76E003 mikrovaldikliais paremtos kūrimo plokštės, taip pat „ Nu-Link“ programuotojo. Be to, norint prijungti visus komponentus, taip pat reikalingi duonos lentos ir prijungimo laidai.
Sąsaja AT24LC64 su „Nuvoton N76E003“ - grandinės schema
Kaip matome toliau pateiktoje schemoje, EEPROM yra prijungtas I2C linijoje kartu su dviem traukiamaisiais rezistoriais. Kairiajame kairiajame kampe rodomas programavimo sąsajos ryšys.
Aš naudojau skydą AT24LC64 IC ir sujungiau IC su mano nuvoton programuotojo plokšte, naudodamas trumpiklius. Žemiau parodyta mano aparatūros sąranka kartu su „nu-ink“ programuotoju.
„I2C“ kaiščiai „Nuvoton N76E003“
N76E003 kaiščių schemą galima pamatyti žemiau esančiame paveikslėlyje
Kaip matome, kiekvienas kaištis turi skirtingas specifikacijas ir kiekvienas kaištis gali būti naudojamas keliems tikslams. Tačiau kaištis 1.4 naudojamas kaip „I2C SDA“ kaištis, jis praras PWM ir kitas funkcijas. Bet tai nėra problema, nes šiam projektui nereikia kito funkcionalumo. Tas pats nutiks ir P1.3 atveju - I2C SCL kaištis.
Kadangi „I2C“ kaiščiai veikia kaip GPIO, jį reikia sukonfigūruoti. Visus GPIO kaiščius galima sukonfigūruoti žemiau aprašytu režimu.
Kaip nurodyta duomenų lape, PxM1.n ir PxM2. n yra du registrai, naudojami nustatant įvesties / išvesties prievado valdymo operaciją. Duomenų lape nurodoma, kad norint naudoti „I2C“ funkciją, įvesties / išvesties režimai turi būti naudojami kaip „Open-drain“ su I2C susijusiai komunikacijai.
„I2C“ ryšys N76E003
I2C išorinis įrenginys yra svarbus dalykas kiekvienam mikrovaldiklio blokui, palaikančiam I2C funkcijas. Daugybė skirtingų mikrovaldiklių tipų turi įmontuotą I2C periferinį įrenginį. Tačiau kai kuriais atvejais „I2C“ galima sukonfigūruoti rankiniu būdu naudojant programinės įrangos valdymą, kai negalima naudotis su „I2C“ susijusia aparatine įranga (pavyzdžiui, daugelis 8051 mikrovaldiklių). Tačiau „nuvoton N76E003“ yra su I2C periferiniu palaikymu.
„M76E003“ palaiko keturių tipų operacijas „I2C“ režimais - pagrindinį siųstuvą, pagrindinį imtuvą, vergo siųstuvą ir vergo imtuvą. Jis taip pat palaiko standartinį (100 kbps) ir greitą (iki 400 kbps) greitį I2C linijoje. I2C veikia su keliomis bendromis taisyklėmis SCL ir SDA signalo linijose.
Pradžios ir pabaigos sąlyga:
Tai svarbus dalykas I2C komunikacijoje. Kai duomenys perduodami į I2C liniją, jie prasideda pradžios sąlyga ir baigiasi sustabdymo sąlyga.
Pradžios sąlyga yra perėjimas nuo aukšto iki mažiausio SDA, kai SCL linija yra aukšta, o sustabdymo sąlyga - perėjimas nuo mažo iki aukšto SDA, kai SCL linija yra aukšta. Šias dvi sąlygas sukuria pagrindinis (MCU ar bet kas, kas valdo kitus vergo įrenginius). Autobuso linija lieka užimta šioje būsenoje, kai pradedama paleidimo sąlyga, ir vėl lieka laisva, kai pradedama stabdymo sąlyga.
Pradžios ir pabaigos sąlyga puikiai parodyta signalo perspektyvoje N76E003 duomenų lape.
7 bitų adresas su duomenų formatu:
N76E003 palaiko 7 bitų adresą ir duomenų formatą. Kai pradžios sąlyga yra inicijuojama, pagrindinis įrenginys turi siųsti duomenis į I2C liniją. Pirmieji duomenys yra svarbūs. Jei šie duomenys nėra tinkamai sukurti ar persiųsti, prijungtas įrenginys nebus atpažintas ir nebebus galima bendrauti.
Duomenis sudaro 7 bitų ilgas vergo adresas, žymimas kaip SLA. Šis 7 bitų ilgio adresas kiekvienam įrenginiui turi būti unikalus, jei magistralėje yra prijungti keli įrenginiai. Po 7 bitų adreso aštuntasis bitas yra duomenų krypties bitas. Tai reiškia, kad, priklausomai nuo 8-ojo bitų, pagrindinis asmuo siunčia vergo įrenginiui informaciją apie tai, ar duomenys bus įrašyti į vergo įrenginį, ar duomenys bus nuskaityti iš vergo įrenginio. Aštuntasis bitas yra R / W bitas, vadinamas skaitymo arba rašymo pranešėju. Kaip mes visi žinome, 8 bitų informacija gali būti 128 tipų, taigi palaikoma 128 įrenginių, tačiau „I2C“ palaiko 127 tipų įrenginius, esančius toje pačioje magistralėje, bet ne 128. Kadangi 0x00 adresas yra rezervuotas adresas, vadinamas bendruoju skambučio adresu. Jei kapitonas nori siųsti informaciją į visus įrenginius,jis bus nukreiptas į 0x00 ir kiekvienas įrenginys atkurs tokiu pačiu būdu, kaip ir pagal atskiras programinės įrangos konfigūracijas.
Taigi duomenų perdavimas atrodo žemiau-
Pripažinti:
Pirmiau pateiktame duomenų adreso vaizde 9-asis bitas, po kurio eina R / W, vadinamas patvirtinimo bitu. Tai svarbu, nes naudodamas šį bitą, pagrindinis arba pavaldusis reaguoja į duomenų siųstuvą, žemai traukdamas SDA liniją. Kad gautų patvirtinimo bitą, siųstuvas turi atleisti SDA liniją.
N76E003 programavimas I2C ryšiui
Visą šioje pamokoje naudojamą programą galite rasti šio puslapio apačioje. Svarbūs kodo segmentai paaiškinami taip:
Nustatykite kaiščius kaip „Open Drain“ ir sukonfigūruokite juos I2C:
Pirmiausia pradėkime nuo I2C kaiščių sekcijos. Kaip aprašyta anksčiau, I2C SCL ir SDA prievadus reikia sukonfigūruoti ir nustatyti kaip atvirojo nutekėjimo konfigūraciją. Norėdami tai padaryti, mes naudojame I2C.h antraštės failą kartu su I2C.c šaltinio failu . Kodo fragmentas atrodo taip-
atlikite {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;}, kol (0)
Aukščiau pateiktas kodas nustato P13 ir P14 kaip „Open-Drain“ kaiščius, o „ clr_I2CPX “ naudojamas pasirinkti P13 ir P14 kaip SCL kaiščius P1.3 ir SDA kaiščius P1.4.
Šis I2CPX yra 0- asis I2C valdymo registro I2CON bitas. Jei ši I2C_PX yra nustatyta kaip 1, kaiščiai keičiami į P0.2 kaip SCL ir P1.6 kaip SDA. Tačiau mes naudosime P13 ir P14. Alternatyvūs kaiščiai čia nenaudojami.
I2C valdymo registras I2CON:
I2C valdymo registras I2CON naudojamas valdyti I2C operacijas. Pirmasis bitas yra I2C kaiščių pasirinkimo bitas. Nustačius 0, I2C kaištis konfigūruojamas kaip P13 ir P14.
AA bitas yra patvirtinimo patvirtinimo vėliava, jei nustatoma AA vėliava, ACK bus grąžinta per SCL linijos patvirtinimo laikrodžio impulsą. Jei jis bus išvalytas, per patvirtintą SCL linijos impulsą bus grąžinta NACK (aukštas lygis SDA).
Kitas bitas yra SI, kuris yra I2C būsenos pertraukimas. Jei įjungtas „I2C Status Interrupt“, vartotojas turėtų patikrinti „I2STAT“ registrą, kad nustatytų, kuris žingsnis buvo atliktas, ir turėtų atlikti veiksmus.
STO yra STOP vėliava, nustatyta pagrindiniu režimu. Aptikus STOP sąlygą, aparatūra automatiškai išvalo STO.
Kitas bitas yra STA bitai. Jei ši vėliava yra nustatyta, tada I2C sukuria START sąlygą, jei magistralė yra laisva. Jei magistralė yra užimta, I2C laukia STOP sąlygos ir sukuria START sąlygą. Jei STA nustatoma, kai I2C jau yra pagrindiniame režime ir vienas ar daugiau baitų buvo persiųsti arba priimti, I2C sukuria pakartotinę START sąlygą. Programinę įrangą reikia rankiniu būdu išvalyti STA.
Paskutinis I2CEN yra I2C magistralės įgalinimo arba išjungimo bitas.
EEPROM 24C02:
Dabar, artėjant prie 24C02. N76E003 plokštės palaikymo paketas turi ILC kodą 24LC64 ir gali būti lengvai modifikuojamas. Tačiau mes naudosime paprastą metodą, kad suprastume I2C funkciją.
Jei kas nors nori naudoti išsamią sąsają su EEPROM 24C02, tada galima naudoti EEPROM programą BSP.
24C02 sujungsime tik I2C, kur N76E003 bus pagrindinis, o EEPROM - vergas. Taigi bet kokius duomenis įrašysime į EEPROM adresą ir perskaitysime tuos pačius duomenis.
24C02 EEPROM kištukas parodytas žemiau-
A0, A1 ir A2 yra trys adreso pasirinkimo kaiščiai. WP kaiščiai yra rašymo apsaugos kaiščiai ir turi būti prijungti prie VSS, kad būtų galima rašyti į EEPROM.
Baitų rašymo funkcija rodoma žemiau esančiame paveikslėlyje.
Visas rašymo ciklas vyksta su pradiniu bitu. Po to reikia pateikti kontrolės baitą. Kontroliniame baite reikalingi šie dalykai:
Po pradžios bitų susideda iš vergo adreso. 1010 yra statinis, o A0, A1 ir A2 yra aparatūros ryšiu pagrįstas adresas. Jei trys kaiščiai yra prijungti prie GND arba VSS tiekimo, tai bus skaitoma kaip 0. Priešingu atveju, jei prijungtas prie VCC, jis bus skaitomas kaip 1. Mūsų atveju visi A0, A1 ir A2 yra prijungti prie VSS. Taigi visa tai bus 0.
Išlaidos skaitymo ar rašymo sąlygai. Adreso vertė su skaitymo ar rašymo bitais bus - 0xA0, jei norite rašyti, ir 0xA1, jei norite skaityti. Kitas yra „Acknowledge“ bitas, o po to bus perduotas 8 bitų adresas, kur reikia saugoti duomenis, ir galiausiai duomenys, kurie bus saugomi atitinkamoje vietoje. Šie dalykai atliekami žingsnis po žingsnio formatu pagrindinėje funkcijoje.
Pagrindinė funkcija ir ciklo metu:
negaliojantis pagrindinis (negaliojantis) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Svarbu, funkcija „prinft“ turi nustatyti TI = 1; I2C_init (); o (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n perskaityta reikšmė yra% x", c & 0xff); }; }
Pagrindinė funkcija yra paprasta, ji nuolat rašo reikšmes EEPROM 1 adresu ir skaito duomenis. Tada duomenys spausdinami naudojant funkciją printf. „Printf“ spausdina vertę šešiakampėmis.
EEPROM rašymo funkcija susideda iš šių dalykų, kurie buvo aprašyti EEPROM skyriuje:
negaliojantis EEPROM_write (nepasirašytas char adresas, nepasirašyta char reikšmė) {I2C_start (); I2C_write (0xA0); I2C_write (adresas); I2C_write (reikšmė); I2C_stop (); }
„I2C“ paleidimo funkciją sudaro šie dalykai:
void I2C_start (void) {pasirašytas int laikas = skirtasis laikas; set_STA; clr_SI; while ((SI == 0) && (laikas> 0)) {laikas--; }; }
Šioje funkcijoje tikrinama SI būsena kartu su iš anksto nustatytu skirtingu laiku (apibrėžta I2C.h, kur iš anksto nustatytas laikas yra 1000). Pradžios funkcija prasideda nustatant STA ir išvalius SI.
void I2C_stop (void) {pasirašytas int laikas = skirtasis laikas; clr_SI; nustatyti_STO; while ((STO == 1) && (laikas> 0)) {laikas--; }; }
Ta pati kaip ir „Start, stop“ funkcija. Stotelė funkcija inicijuoja steigti sto po kliringo SI. Žemiau funkcija yra I2C skaitymo funkcija-
nepasirašyta char I2C_read (nepasirašyta char ack_mode) {pasirašytas int laikas = skirtasis laikas; nepasirašytos simbolio reikšmė = 0x00; nustatyti_AA; clr_SI; while ((SI == 0) && (t> 0)) {laikas--; }; vertė = I2DAT; jei (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; while ((SI == 0) && (t> 0)) {laikas--; }; } grąžos vertė; }
„ Ack_mode“ ir „ I2C_NACK “ I2C antraštės faile atitinkamai apibrėžiami kaip 0 ir 1.
Panašiai sukuriama rašymo funkcija-
void I2C_write (nepasirašyta char reikšmė) {pasirašytas int laikas = skirtasis laikas; I2DAT = reikšmė; clr_STA; clr_SI; while ((SI == 0) && (laikas> 0)) {laikas--; }; }
Mirksintis kodas ir išvestis
Kodas pateikė 0 įspėjimų ir 0 klaidų ir buvo mirksintis naudojant numatytąjį „Keil“ mirksėjimo metodą. Jei esate naujas, patikrinkite, kaip pradėti naudotis „nuvoton“ mokymo programa, kad suprastumėte, kaip įkelti kodą. Kompiliavimo informaciją apie kodą galite rasti žemiau.
Sukurkite tikslą „I2C_EEPROM“, sudarantį I2C_EEPROM.c… sudarantį I2C.c… susiejant… Programos dydis: duomenys = 59,2 xdata = 0 kodas = 2409, kuriant šešioliktainį failą iš „. \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 klaida (-os), 0 įspėjimas (-ai). Baigtas komponavimo laikas: 00:00:04 Paketo sudarymo suvestinė: 1 pavyko, 0 nepavyko, 0 praleista - praėjo laikas: 00:00:04
Aparatūra yra montuojama ant duonos lentos ir veikia taip, kaip tikėtasi. Kaip matote žemiau esančiame paveikslėlyje, mes galėjome įrašyti vertę į EEPROM ir perskaityti ją iš atminties ir parodyti serijiniame monitoriuje.
Peržiūrėkite toliau pateiktą vaizdo įrašą, kad galėtumėte visiškai parodyti, kaip lenta veikia pagal šį kodą. Tikiuosi, kad jums patiko pamoka ir sužinojote ką nors naudingo, jei turite klausimų, palikite juos toliau pateiktame komentarų skyriuje. Taip pat galite naudoti mūsų forumus kitiems techniniams klausimams pateikti.