- Što je I2C komunikacijski protokol?
- Kako I2C Komunikacija radi?
- Gdje koristiti I2C komunikaciju?
- I2C s PIC16F877a pomoću XC8 Compilera
- Programiranje pomoću datoteka zaglavlja I2C:
- Simulacija proteja:
PIC mikrokontroleri moćna su platforma koju mikročip pruža za ugrađene projekte, a njegova je svestrana priroda pronalaženje mnogih aplikacija, a faza još uvijek traje. Ako ste slijedili naše PIC tutorijale, tada biste primijetili da smo već pokrivali širok spektar tutorijala o PIC mikrokontroleru, počevši od samih osnova. Od sada smo pokrili osnove kako bismo mogli ući u zanimljivije stvari poput komunikacijskog portala.
U velikom sustavu ugrađenih aplikacija niti jedan mikrokontroler ne može sam obavljati sve aktivnosti. U nekoj fazi vremena mora komunicirati s drugim uređajima za razmjenu informacija, postoji mnogo različitih vrsta komunikacijskih protokola za dijeljenje tih podataka, ali najčešće korišteni su USART, IIC, SPI i CAN. Svaki komunikacijski protokol ima svoju prednost i nedostatak. Usredotočimo se zasad na IIC dio jer ćemo to naučiti u ovom vodiču.
Što je I2C komunikacijski protokol?
Izraz IIC označava " Inter integrirani krugovi ". Obično se na nekim mjestima označava kao I2C ili I na kvadrat C ili čak kao protokol dvožilnog sučelja (TWI), ali sve to znači isto. I2C je sinkroni komunikacijski protokol što znači da oba uređaja koji dijele informacije moraju dijeliti zajednički signal sata. Ima samo dvije žice za razmjenu informacija od kojih se jedna koristi za signal pijetla, a druga za slanje i primanje podataka.
Kako I2C Komunikacija radi?
I2C komunikaciju prvi je predstavio Phillips. Kao što je ranije rečeno, ima dvije žice, te dvije žice bit će povezane preko dva uređaja. Ovdje se jedan uređaj naziva master, a drugi uređaj slave. Komunikacija bi se trebala i uvijek će se odvijati između dvoje Učitelja i Roba. Prednost I2C komunikacije je u tome što se na Master može povezati više od jednog slave.

Kompletna komunikacija odvija se kroz ove dvije žice, naime, serijski sat (SCL) i serijski podatak (SDA).
Serijski sat (SCL): Dijeli signal sata koji generira master s podređenim uređajem
Serijski podaci (SDA): šalje podatke glavnom i pomoćnom uređaju i iz njega.
U bilo kojem trenutku samo će zapovjednik moći započeti komunikaciju. Budući da je u sabirnici više od jednog podređenog uređaja, master mora uputiti svakog podređenog koristeći drugu adresu. Kad im se obrati, samo će salve s tom adresom odgovoriti s informacijama, dok će ostali nastaviti s prestankom. Na taj način možemo koristiti istu sabirnicu za komunikaciju s više uređaja.
Gdje koristiti I2C komunikaciju?
I2C komunikacija koristi se samo za kratku udaljenost. Svakako je pouzdan u određenoj mjeri jer ima sinkronizirani impuls sata koji ga čini pametnim. Ovaj se protokol uglavnom koristi za komunikaciju sa senzorom ili drugim uređajima koji moraju slati informacije glavnom računaru. Vrlo je zgodno kada mikrokontroler mora komunicirati s mnogim drugim pomoćnim modulima koristeći najmanje samo žice. Ako tražite komunikaciju na daljinu, probajte RS232, a ako tražite pouzdaniju komunikaciju isprobajte SPI protokol.
I2C s PIC16F877a pomoću XC8 Compilera
Dovoljno je uvodnih tekstova, uđimo u to i naučimo kako možemo koristiti mikrokontroler za obavljanje I2C komunikacije. Prije nego što počnemo jasno staviti do znanja da ovaj vodič govori samo o I2C u PIC16F877a pomoću XC8 kompajlera, postupak će biti isti i za druge mikrokontrolere, ali možda će biti potrebne male promjene. Također imajte na umu da za napredne mikrokontrolere poput serije PIC18F sam kompajler može imati ugrađenu biblioteku za upotrebu I2C značajki, ali za PIC16F877A ništa takvo ne postoji, pa napravimo ga sami. Ovdje objašnjena knjižnica bit će dana kao datoteka zaglavlja za preuzimanje na dnu koja se može koristiti za PIC16F877A za komunikaciju s drugim I2C uređajima.
Kao i uvijek najbolje mjesto za započinjanje bilo čega je naša tablica podataka. Potražite detalje o I2C u tehničkom listu i provjerite koji registri moraju biti konfigurirani. Neću detaljno objašnjavati jer je tablica podataka to već učinila za vas. Dalje u nastavku objasnit ću različite funkcije prisutne u zaglavnoj datoteci i njihovu odgovornost u programu.
void I2C_Initialize ()
Funkcija inicijalizacije koristi se kako bi mikrokontroleru rekla da ćemo koristiti I2C protokol. To se može učiniti postavljanjem potrebnih bitova na registru SSPCON i SSPCON2. Prvi korak bio bi proglašavanje IIC pinova ulaznim pinovima, ovdje bi se pinovi RC3 i RC4 trebali koristiti za I2C komunikaciju pa ih deklariramo kao ulazne pinove. Dalje bismo trebali postaviti SSPCON i SSPCON2 koji je MSSP kontrolni registar. PIC radimo u IIC master načinu rada s taktom FOSC / (4 * (SSPADD + 1)). Pogledajte brojeve stranica tablice spomenute u donjim retcima komentara kako biste razumjeli zašto je taj registar postavljen na taj način.
Dakle, sljedeće moramo postaviti frekvenciju takta, frekvencija takta za različite aplikacije može se razlikovati, stoga od korisnika dobivamo izbor putem varijable feq_k i koristimo ga u našim formulama za postavljanje SSPADD registra.
void I2C_Initialize (const unsigned long feq_K) // Započni IIC kao master { TRISC3 = 1; TRISC4 = 1; // Postavi SDA i SCL pinove kao ulazne pinove SSPCON = 0b00101000; // pg84 / 234 SSPCON2 = 0b00000000; // pg85 / 234 SSPADD = (_XTAL_FREQ / (4 * feq_K * 100)) - 1; // Postavljanje brzine takta pg99 / 234 SSPSTAT = 0b00000000; // pg83 / 234 }
Praznina I2C_Hold ()
Sljedeća važna funkcija je funkcija I2C_hold koja se koristi za zadržavanje izvršenja uređaja dok se trenutna operacija I2C ne dovrši. Morali bismo provjeriti moraju li se I2C operacije održati prije započinjanja bilo koje nove operacije. To se može učiniti provjerom registra SSPSTAT i SSPCON2. SSPSTAT sadrži informacije o statusu I2C sabirnice.
Program se može činiti pomalo složenim jer uključuje operatore "i" i "ili". Kad ga razbiješ kao
SSPSTAT & 0b00000100 SSPCON2 & 0b00011111
U
To znači da smo sigurni da 2 nd malo na SSPSTAT je nula, i slično, bitovi 0-4 nula na SSPCON2. Zatim kombiniramo sve ove kako bismo provjerili je li rezultat nula. Ako je rezultat nula, program će nastaviti ako ne, tamo će se držati dok ne dobije nulu, jer se koristi u while petlji.
void I2C_Hold () { while ((SSPCON2 & 0b00011111) - (SSPSTAT & 0b00000100)); // provjerite ovo na registrima kako biste bili sigurni da IIC nije u tijeku }
Void I2C_Begin () i void I2C_End ()
Svaki put dok pišemo ili čitamo bilo koje podatke pomoću I2C sabirnice trebali bismo započeti i završiti I2C vezu. Da bismo započeli I2C komunikaciju, moramo postaviti SEN bit, a da bismo završili komunikaciju moramo postaviti bit PEN statusa. Prije prebacivanja bilo kojeg od ovih bitova, trebali bismo također provjeriti je li I2C sabirnica zauzeta pomoću funkcije I2C_Hold kao što je gore spomenuto.
void I2C_Begin () { I2C_Hold (); // Držite program je I2C zauzet SEN = 1; // Početak IIC pg85 / 234 } void I2C_End () { I2C_Hold (); // Držite program je I2C zauzet PEN = 1; // Kraj IIC pg85 / 234 }
Praznina I2C_Write ()
Funkcija pisanja koristi se za slanje bilo kakvih podataka iz glavnog modula u modul salve. Ova se funkcija obično koristi nakon funkcije početka I2C, a slijedi je funkcija završetka I2C. Podaci koji se moraju upisati u IIC sabirnicu prolaze kroz varijablu podataka. Ti se podaci zatim učitavaju u registar međuspremnika SSPBUF kako bi ih poslali preko I2C sabirnice.
Uobičajeno će se prije pisanja podataka napisati adresa, pa ćete funkciju pisanja morati koristiti dva puta, jednom za postavljanje adrese, a drugi put za slanje stvarnih podataka.
void I2C_Write (nepotpisani podaci) { I2C_Hold (); // Držite program je I2C zauzet SSPBUF = podaci; // pg82 / 234 }
nepotpisani kratki I2C_Read ()
Konačna funkcija koju moramo znati je funkcija I2C_Read . Ova se funkcija koristi za čitanje podataka koji su trenutno na I2C sabirnici. Koristi se nakon što zatraži od slave da napiše neku vrijednost u sabirnicu. Primljena vrijednost bit će u SSPBUF-u , a tu vrijednost možemo prenijeti u bilo koju varijablu za naš rad.
Tijekom I2C komunikacije, slave nakon slanja podataka koje je zahtijevao Master poslati će drugi bit koji je bit potvrde, taj bit bi također trebao provjeriti master da bi bio siguran da je komunikacija bila uspješna. Nakon provjere ACKDT bita za potvrdu trebao bi biti omogućen postavljanjem ACKEN bita.
unsigned short I2C_Read (unsigned short ack) { unsigned short incoming; I2C_Hold (); RCEN = 1; I2C_Hold (); dolazno = SSPBUF; // dobiti podatke spremljene u SSPBUF I2C_Hold (); ACKDT = (ack)? 0: 1; // provjeravamo je li ack bit primio ACKEN = 1; // str 85/234 povratak dolaznog; }
To je to, ove bi funkcije trebale biti dovoljne za postavljanje I2C komunikacije i pisanje ili čitanje podataka s uređaja. Također imajte na umu da postoje mnoge druge funkcije koje I2C komunikacija može izvesti, ali radi jednostavnosti o njima ovdje ne raspravljamo. Uvijek možete uputiti tablicu podataka kako biste saznali potpuni rad programa
Kompletni kod sa zaglavnom datotekom za PIC16F877A I2C komunikaciju možete preuzeti s veze.
Programiranje pomoću datoteka zaglavlja I2C:
Sad kad smo saznali kako funkcionira I2C komunikacija i kako možemo koristiti zaglavnu datoteku stvorenu za nju, napravimo jednostavan program u kojem ćemo koristiti zaglavnu datoteku i upisati neke vrijednosti u I2C linije. Zatim ćemo simulirati ovaj program i provjeriti zapisuju li se ove vrijednosti na sabirnici.
Kao i uvijek program započinje postavljanjem konfiguracijskih bitova i podešavanjem frekvencije takta na 20 MHz, kao što je prikazano dolje
#pragma config FOSC = HS // Bitovi za odabir oscilatora (HS oscilator) #pragma config WDTE = OFF // Bit za uključivanje nadzornika (WDT onemogućen) #pragma config PWRTE = ON // Bit za omogućavanje timera za uključivanje (PWRT omogućen) # pragma config BOREN = ON // Bit za resetiranje smeđeg reseta (omogućen BOR) #pragma config LVP = OFF // Bit za omogućavanje serijskog programiranja u krugu niskog napona (s jednim napajanjem) (RB3 je digitalni I / O, uključen HV MCLR se mora koristiti za programiranje) #pragma config CPD = OFF // Bit zaštite podataka EEPROM memorijskog koda (zaštita podataka EEPROM koda isključena) #pragma config WRT = OFF // Flash programiranje bita Omogući bitove (zaštita od upisa isključena; sva programska memorija može se upisati na EECON kontrolu) #pragma config CP = OFF // Bit programa za zaštitu memorijskog koda Flash programa (zaštita koda isključena) #define _XTAL_FREQ 20000000
Sljedeći bi korak bio dodavanje datoteke zaglavlja o kojoj smo upravo razgovarali. Datoteka zaglavlja naziva se PIC16F877a_I2C.h i može se preuzeti s veze o kojoj smo gore razgovarali. Obavezno dodajte datoteku zaglavlja u datoteku zaglavlja na popisu projekata, struktura datoteke projekta trebala bi izgledati ovako

Nakon što provjerite je li datoteka zaglavlja dodana u datoteku projekta, uključite datoteku zaglavlja u glavnu datoteku C.
#include
Unutar while petlje započet ćemo I2C komunikaciju upisati nekoliko slučajnih vrijednosti u I2C sabirnicu, a zatim završiti I2C komunikaciju. Slučajne vrijednosti koje sam odabrao su D0, 88 i FF. Možete unijeti bilo koju vrijednost koju želite. Ali upamtite te vrijednosti jer ćemo ih provjeravati u našoj simulaciji.
while (1) { I2C_Begin (); I2C_Write (0xD0); I2C_Write (0x88); I2C_Write (0xFF); I2C_End (); __zakašnjenje_ms (1000); }
Kompletan program može se naći na dnu stranice, možete koristiti to ili preuzeti potpunu zip datoteku programa odavde. Nakon dobivanja programa kompajlirajte ga i pripremite se za simulaciju.
Simulacija proteja:
Proteus ima lijep instrument pod nazivom I2C program za pronalaženje pogrešaka koji se može koristiti za čitanje podataka na I2C sabirnici, pa napravimo sklop pomoću njega i provjerimo pišu li podaci uspješno. Kompletna shema sklopa prikazana je u nastavku

Učitajte hex datoteku koju je generirao naš program dvostrukim klikom na mikrokontroler. Zatim simulirajte program. Primijetit ćete iskačući prozor koji će prikazivati sve informacije o I2C sabirnici. Prozor za naš program prikazan je u nastavku.

Ako pažljivo pogledate podatke koji se zapisuju, primijetit ćete da su isti kao i mi u našem programu. Vrijednosti su D0, 88 i FF. Vrijednosti se zapisuju svake 1 sekunde, pa se vrijeme također ažurira kao što je prikazano u nastavku. Plava strelica označava da je zapisano od gospodara do podređenog da bi u suprotnom smjeru bilo usmjereno. Pobliži prikaz podataka koji se šalju prikazan je u nastavku.

Ovo je samo uvid u to što I2C može učiniti, također može čitati i pisati podatke na više uređaja. Više o I2C obrađivat ćemo u našim nadolazećim vodičima povezivanjem različitih modula koji rade s I2C protokolom.
Nadam se da ste razumjeli projekt i naučili nešto korisno iz njega. Ako sumnjate, objavite ih u odjeljku za komentare u nastavku ili koristite forume za tehničku pomoć.
Kompletni kod dan je u nastavku; datoteke zaglavlja sa svim kodovima možete preuzeti odavde.

