- Kas yra „I2C“ ryšio protokolas?
- Kaip veikia „I2C Communication“?
- Kur naudoti I2C ryšį?
- I2C su PIC16F877a, naudojant „XC8 Compiler“
- Programavimas naudojant I2C antraštės failus:
- „Proteus“ modeliavimas:
„PIC“ mikrovaldikliai yra galinga mikroschemos teikiama platforma įterptiesiems projektams, dėl savo universalaus pobūdžio ji leido ieškoti būdų daugybei programų, o etapas vis dar vyksta. Jei stebėjote mūsų PIC mokymo programas, pastebėjote, kad mes jau apėmėme daugybę PIC mikrovaldiklio pamokų, pradedant nuo pačių pagrindų. Nuo šiol apžvelgėme pagrindinius dalykus, kuriuos galime rasti įdomesniuose dalykuose, pavyzdžiui, komunikacijos portale.
Didžiulėje įterptųjų programų sistemoje joks mikrovaldiklis negali pats atlikti visų veiksmų. Tam tikru metu ji turi bendrauti su kitais įrenginiais, kad galėtų dalytis informacija. Yra daug įvairių ryšio protokolų, kuriais 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.
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 gaidžio signalui, o kitas - duomenims siųsti ir priimti.
Kaip veikia „I2C Communication“?
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 - kaip vergas. Bendravimas turėtų ir visada vyks tarp dviejų šeimininkų ir vergų. „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 pradėti ryšį. Kadangi magistralėje yra daugiau nei vienas vergas, kapitonas turi nurodyti kiekvieną vergą naudodamas kitą adresą. Kai kreipiamasi, tik atsakymas su tuo konkrečiu adresu atsakys atgal į informaciją, o kiti toliau mesti. 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 bendrauti su jutikliais 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 tolimojo ryšio, turėtumėte išbandyti RS232, o jei norite patikimesnio ryšio, išbandykite SPI protokolą.
I2C su PIC16F877a, naudojant „XC8 Compiler“
Užtenka įvadų, leidžiama patekti į jį ir sužinoti, kaip mes galime naudoti mikrovaldiklį I2C komunikacijai atlikti. Prieš pradėdami aiškiai parodykite, kad šioje pamokoje kalbama tik apie I2C sistemoje PIC16F877a naudojant XC8 kompiliatorių, procesas bus tas pats ir kitiems mikrovaldikliams, tačiau gali reikėti šiek tiek pakeisti. Taip pat atminkite, kad pažangiems mikrovaldikliams, tokiems kaip PIC18F serija, pats kompiliatorius gali turėti tam tikrą biblioteką, kad būtų galima naudoti „I2C“ funkcijas, tačiau „PIC16F877A“ nieko panašaus nėra, todėl kurkime patys. Čia paaiškinta biblioteka bus pateikta kaip antraštės failas, kurį galėsite atsisiųsti apačioje ir kuris gali būti naudojamas PIC16F877A bendraujant su kitais I2C įrenginiais.
Kaip visada geriausia pradėti viską yra mūsų duomenų lapas. Išsamios informacijos apie I2C ieškokite duomenų lape ir patikrinkite, kurie registrai turi būti sukonfigūruoti. Aš neketinu paaiškinti išsamiau, nes duomenų lapas jau tai padarė jums. Toliau paaiškinsiu įvairias antraštės faile esančias funkcijas ir jų atsakomybę programoje.
anuliuoti I2C_Initialize ()
Inicializavimo funkcija naudojama mikrovaldikliui pasakyti, kad mes naudosime I2C protokolą. Tai galima padaryti nustatant reikiamus bitus SSPCON ir SSPCON2 registre. Pirmasis žingsnis būtų paskelbti IIC kaiščius kaip įvesties kaiščius, čia I2C ryšiui turėtų būti naudojami kaiščiai RC3 ir RC4, todėl mes juos deklaruojame kaip įvesties kaiščius. Tada turėtume nustatyti SSPCON ir SSPCON2, kurie yra MSSP valdymo registrai. Mes valdome PIC IIC pagrindiniu režimu, laikrodžio dažniu FOSC / (4 * (SSPADD + 1)). Norėdami suprasti, kodėl tas konkretus registras nustatytas taip, žiūrėkite toliau pateiktose komentarų eilutėse nurodytų duomenų lapų puslapių numerius.
Taigi mes turime nustatyti laikrodžio dažnį, skirtingų programų laikrodžio dažnis gali skirtis, taigi mes gauname pasirinkimą iš vartotojo per kintamąjį feq_k ir naudojame jį savo formulėse nustatydami SSPADD registrą.
void I2C_Initialize (const unsigned long feq_K) // Pradėti IIC kaip pagrindinį { TRISC3 = 1; TRISC4 = 1; // Nustatykite SDA ir SCL kaiščius kaip įvesties kaiščius SSPCON = 0b00101000; // pg84 / 234 SSPCON2 = 0b00000000; // pg85 / 234 SSPADD = (_XTAL_FREQ / (4 * feq_K * 100)) - 1; // Laikrodžio greičio nustatymas pg99 / 234 SSPSTAT = 0b00000000; // pg83 / 234 }
Negalioja I2C_Hold ()
Kita svarbi funkcija yra „ I2C_hold“ funkcija, naudojama palaikyti įrenginio vykdymą, kol bus baigta dabartinė I2C operacija. Prieš pradėdami naują operaciją, turėtume patikrinti, ar I2C operacijos turi būti vykdomos. Tai galima padaryti patikrinus registrą SSPSTAT ir SSPCON2. SSPSTAT yra informacija apie I2C magistralės būseną.
Programa gali atrodyti šiek tiek sudėtinga, nes joje yra „ir“ ir „arba“ operatorius. Kai sulaužysi kaip
SSPSTAT ir 0b00000100 SSPCON2 ir 0b00011111
A
Tai reiškia, kad mes užtikriname, kad 2 -asis SSPSTAT bitas yra lygus nuliui ir panašiai bitai nuo 0 iki 4 yra lygūs nuliui SSPCON2. Tada mes sujungsime visus šiuos dalykus ir patikrinsime, ar rezultatas yra lygus nuliui. Jei rezultatas yra lygus nuliui, programa tęsis, jei ne, ji laikysis ten, kol gaus nulį, nes ji naudojama tam tikrą laiką .
negaliojantis I2C_Hold () { while ((SSPCON2 & 0b00011111) - (SSPSTAT & 0b00000100)); // patikrinkite tai registruose, kad įsitikintumėte, jog IIC nevyksta }
Negalioja I2C_Begin () ir negalioja I2C_End ()
Kiekvieną kartą, kai rašome ar skaitome bet kokius duomenis naudodamiesi I2C magistrale, turėtume pradėti ir baigti I2C ryšį. Norėdami pradėti I2C ryšį, turime nustatyti SEN bitą ir užbaigti ryšį - nustatyti PEN būsenos bitą. Prieš perjungdami bet kurį iš šių bitų, taip pat turėtume patikrinti, ar I2C magistralė yra užimta, naudodamiesi funkcija I2C_Hold, kaip aptarta aukščiau.
negaliojantis I2C_Begin () { I2C_Hold (); // Laikykite programą, kai I2C yra užimta SEN = 1; // Pradžia IIC pg85 / 234 } negalioja I2C_End () { I2C_Hold (); // Laikykite programą, kai I2C yra užimta PEN = 1; // Pabaiga IIC pg85 / 234 }
Negalima I2C_Write ()
Rašymo funkcija naudojama norint siųsti bet kokius duomenis iš pagrindinio modulio į „salve“ modulį. Ši funkcija paprastai naudojama po I2C pradžios funkcijos, o po jos - I2C End funkcija. Duomenys, kuriuos reikia įrašyti į IIC magistralę, perduodami per kintamuosius duomenis. Tada šie duomenys įkeliami į SSPBUF buferio registrą, kad būtų siunčiami per I2C magistralę.
Paprastai prieš rašant duomenis, bus parašytas adresas, todėl turėsite naudoti rašymo funkciją du kartus, vieną kartą nustatydami adresą, o kitą kartą - faktiniams duomenims siųsti.
negaliojantis I2C_Write (nepasirašyti duomenys) { I2C_Hold (); // Laikykite programą, kai I2C yra užimta SSPBUF = duomenys; // pg82 / 234 }
nepasirašytas trumpas I2C_Read ()
Paskutinė funkcija, apie kurią turime žinoti, yra funkcija „ I2C_Read“ . Ši funkcija naudojama duomenims, kurie šiuo metu yra I2C magistralėje, nuskaityti. Jis naudojamas paprašius vergo, kad autobusui parašytų kokią nors vertę. Gaunama vertė bus SSPBUF, kurią galime perkelti į bet kurį mūsų operacijos kintamąjį.
I2C ryšio metu vergas, išsiųsdamas magistro prašomus duomenis, išsiųs kitą bitą, kuris yra patvirtinimo bitas. Šį bitą taip pat turėtų patikrinti pagrindinis, norėdamas įsitikinti, kad ryšys buvo sėkmingas. Patikrinus ACKDT bitą, ar nėra patvirtinimo, jis turėtų būti įjungtas nustatant ACKEN bitą.
nepasirašytas trumpas I2C_Read (nepasirašytas trumpas pranešimas) { nepasirašytas trumpas gaunamas; I2C_Hold (); RCEN = 1; I2C_Hold (); gaunamas = SSPBUF; // gauti duomenis, išsaugotus SSPBUF I2C_Hold (); ACKDT = (ack) 0 0: 1; // patikrinkite, ar gautas ack bitas ACKEN = 1; // p. 85/234 grąžinti gaunamus; }
Tai yra, šių funkcijų turėtų pakakti norint nustatyti I2C ryšį ir įrašyti ar skaityti duomenis iš įrenginio. Taip pat atkreipkite dėmesį, kad yra daugybė kitų funkcijų, kurias I2C komunikacija gali atlikti, tačiau dėl paprastumo mes jų čia neaptariame. Visada galite kreiptis į duomenų lapą, kad sužinotumėte, koks yra visas
Visą PIC16F877A I2C ryšio kodą su antraštės failu galima atsisiųsti iš nuorodos.
Programavimas naudojant I2C antraštės failus:
Sužinoję, kaip veikia „I2C“ ryšys ir kaip galime naudoti jam sukurtą antraštės failą, sukurkime paprastą programą, kurioje naudosime antraštės failą ir įrašysime kai kurias reikšmes į „I2C“ eilutes. Tada imituosime šią programą ir patikrinsime, ar šios vertės rašomos į magistralę.
Kaip visada, programa pradedama konfigūracijos bitų nustatymu ir laikrodžio dažnio nustatymu į 20 MHz, kaip parodyta žemiau
#pragma config FOSC = HS // Oscilatoriaus pasirinkimo bitai (HS osciliatorius) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT išjungtas) #pragma config PWRTE = ON // Power-up Timer Enable bit (įjungtas PWRT) # pragmos konfigūracija BOREN = ĮJUNGTA // Išjungta iš naujo Įgalinti bitą (įjungta BOR) #pragma konfigūracija LVP = IŠJUNGTA // Žemos įtampos (vieno maitinimo) grandinės nuosekliojo programavimo įgalinimo bitas (RB3 yra skaitmeninis įvesties / išvesties įjungimas, įjungtas HV Programavimui reikia naudoti MCLR) #pragma config CPD = OFF // duomenų EEPROM atminties kodo apsaugos bitas (duomenų EEPROM kodo apsauga išjungta) #pragma config WRT = OFF // „Flash“ programos atminties įrašymas Įgalinti bitus (nurašymo apsauga; visa programos atmintis gali būti parašyta EECON kontrolė) #pragma config CP = OFF // „Flash“ programos atminties kodo apsaugos bitas (kodo apsauga išjungta) #define _XTAL_FREQ 20000000
Kitas žingsnis būtų pridėti antraštės failą, apie kurį ką tik aptarėme. Antraštės failas pavadintas PIC16F877a_I2C.h ir jį galima atsisiųsti iš pirmiau aptartos nuorodos. Įsitikinkite, kad antraštės failas yra įtrauktas į jūsų projektų sąrašo antraštės failą. Jūsų projekto failo struktūra turėtų atrodyti taip
Įsitikinę, kad antraštės failas pridėtas prie jūsų projekto failo, įtraukite antraštės failą į pagrindinį C failą
# įtraukti
Viduje Nors kilpa mes pradėsime I2C komunikacijos rašyti keletą atsitiktinių dydžių su I2C magistralės ir tada baikite I2C komunikacijos. Pasirinktos atsitiktinės vertės yra D0, 88 ir FF. Galite įvesti bet kokias norimas reikšmes. Tačiau prisiminkite tas vertybes, kai jas patikrinsime savo modeliavime.
o (1) { I2C_Begin (); I2C_Write (0xD0); I2C_Write (0x88); I2C_Write (0xFF); I2C_End (); __delay_ms (1000); }
Visa programa, galima rasti puslapio apačioje galite naudoti, kad arba atsisiųsti pilną zip failą programoje iš čia. Gavę programą, ją sukompiliuokite ir pasiruoškite simuliacijai.
„Proteus“ modeliavimas:
„Proteus“ turi gražų instrumentą, vadinamą I2C derintuvu, kurį galima naudoti I2C magistralės duomenims nuskaityti, todėl sukursime jį naudodami grandinę ir patikrinkime, ar duomenys sėkmingai rašomi. Visa grandinės schema parodyta žemiau
Įkelkite „hex“ failą, kurį sugeneravo mūsų programa, dukart spustelėdami mikrovaldiklį. Tada imituokite programą. Pastebėsite langą, kuriame bus rodoma visa informacija apie I2C magistralę. Žemiau parodytas mūsų programos langas.
Atidžiai pažvelgę į rašomus duomenis galite pastebėti, kad jie yra tokie patys, kokius rašėme savo programoje. Vertės yra D0, 88 ir FF. Reikšmės rašomos kas 1 sek., Todėl laikas taip pat atnaujinamas, kaip parodyta žemiau. Mėlyna rodyklė rodo, kad parašyta iš šeimininko į vergą, kad ji būtų nukreipta į priešingą pusę, jei kitaip. Išsamiau siunčiamus duomenis galite pamatyti žemiau.
Tai tik žvilgsnis į tai, ką gali „I2C“, jis taip pat gali skaityti ir rašyti duomenis į kelis įrenginius. Aptarsime daugiau apie „I2C“ mūsų būsimose mokymo programose, susiesdami įvairius modulius, kurie veikia su „I2C“ protokolu.
Tikiuosi, kad supratote projektą ir iš jo sužinojote ką nors naudingo. Jei turite kokių nors abejonių, paskelbkite juos žemiau esančiame komentarų skyriuje arba naudokite forumus techninei pagalbai.
Pilnas kodas pateiktas žemiau; iš čia galite atsisiųsti antraštės failus su visu kodu.