SK LABS
Tipovi interfejsa i protokola (1): I2C
Veza na dve linije
D. PETROVIĆ
1. septembar 2022.

Kada pišemo o funkcijama mikrokontrolera, često pominjemo razne skraćenice. Neke od tih skraćenica malo i pojasnimo, ali mnoge ne, iako se vrlo često pominju i još više koriste. Iskusnijim elektroničarima u pokušaju skraćenice poput SPI, PWM, DAC i slično možda neće zvučati strano, ali verujemo da to nije slučaj sa početnicima. U ovoj seriji tekstova potrudićemo se da bacimo malo više svetla na njih.

I2C, ili I2C, ili IIC odnosi se na Inter-Integrated Circuit i u pitanju je interfejs koji je razvio Philips, sada već davne 1982. godine. Drugi proizvođači su prepoznali pogodnosti interfejsa, te su se u godinama koje slede priključili I2C interfejsu kao priznatom standardu. Ceo sistem je definisao Intel 1995. godine sa SystemManagementBus (SMBus), što je dovelo do uniformnosti celog interfejsa kakvog ga poznajemo danas.

Ukratko, ideja je da se preko samo dve žice ostvari komunikacija sa većim brojem različitih elektronskih uređaja. To mogu biti mikrokontroleri, senzori, moduli i drugo. U zavisnosti od širine same magistrale, zavisi i maksimalni broj uređaja. S obzirom na samu prirodu I2C, namenjena je za povezivanje na kraćim razdaljinama, uglavnom u okviru same štampane ploče i komponenata na njoj.

Gruba podela uređaja na I2C magistrali bila bi na Master i Slave, o čemu ćemo kasnije. I2C za komunikaciju koristi samo dve linije koje se nazivaju Serial Clock i Serial Data, nama poznatiji po skraćenicama SCL i SDA. SCL je signal radnog takta koji sinhronizuje protok podataka i obično se generiše kod uređaja koji je Master u sistemu. SCL signal se još naziva upravljačkim. SDA prenosi podatke. Sama struktura I2C zahteva da I2C linije budu otvorenog odvoda (open drain), te se iz tog razloga koriste dva otpornika u pull-up konfiguraciji. Na taj način se linije drže HIGH, jer je I2C interfejs LOW kada je aktivan. Vrednosti otpornika direktno zavise od broja povezanih uređaja i njihove brzine. Manje vrednosti otpornika (2K, 4,7K) mogu se koristiti za veće brzine protoka, do 400 kilobita u sekundi. Za niže brzine, od oko 100 kilobita u sekundi, obično se koristi 10K otpornik.

Brzina protoka podataka preko I2C magistrale zavisi od samih uređaja. Postoji nekoliko režima, recimo, standardni režiom sa brzinom od 100 kilobita u sekundi, zatim full-speed sa brzinom od 400 kilobita u sekundi i high-speed sa brzinom od 3,2 megabita u sekundi. Ultra-fast ide i do pet megabita u sekundi. Brzine ne zavise mnogo ni od Slave, niti od Mastera, već direktno od dužine vodova na ploči (ili žica van nje), vrednosti otpornika koje pomenusmo, električnog kapaciteta, napona na magistrali i raznih drugih faktora. Uvek treba imati u vidu najsporiji uređaj, jer će se njegovim zanemarivanjem doći u poziciju da ovaj hvata samo deliće transmisije i stalno će slati grešku, NACK (not acknowledged).

Adresiranje na I2C magistrali jako je bitno, zato da bi uređaji znali ko sa kime komunicira. Kod sedmobitne magistrale može se povezati do 128 (112) uređaja. Ako će se koristiti 10-bitna magistrala, broj mogućih uređaja na jednoj magistrali ide čak do 1024 (1008). Interfejs je predviđen za rad na manjim razdaljinama, do 30 centimetara u idealnim uslovima. Rekosmo, najčešća upotreba je u okviru jedne štampane ploče. Ipak, može se koristiti i preko žica, ako su u pitanju određeni senzori i moduli. Razdaljina se može povećati upotrebom diferencijalnih drajvera, gde se uz pomoć (mrežnog) CAT5 kabla ili slično, razdaljina povećava na 20 metara i više. Više o tome u SK 2/2021 (i.sk.rs/29239).

Kada pričamo o Master i Slave podeli, obično je Master, zapravo, mikrokontroler koji je zadužen za upravljanje projektom. On je taj koji šalje i prima podatke od Slave. Kao upravljački uređaj, on diktira i SCL takt linije. Ako je više Mastera na liniji, tada treba voditi računa o koliziji, to jest, situaciji kada dva ili više Mastera pokušavaju da istovremeno pošalju podatke. U ovakvim sistemima koristiti se i R(eset) bit, koji ponovno inicira I2C magistralu. Za Slave se obično uzima neki senzor ili modul. Vodeći svetski proizvođači hardvera osmislili su namenske I2C priključke, koji se sastoje iz dve naponske i dve I2C linije. Termini QWIIC, easyC, Stemma, Groove su na ovim stranicama poznati. Čak i MikroBUSsocket beogradske MikroElektronike jednim svojim delom sadrži I2C linije interfejsa.

Komunikacija počinje startnim bitom S, čime se SDA linija postavlja LOW, dok je SCL još uvek HIGH. Zatim, kreće slanje podataka preko SDA sve dok je SCL na LOW. Završetak prenosa podataka označava bit P na samom kraju prenosa. Ovim će se SDA postaviti na HIGH, dok je i sam SCL na HIGH. Da bi se malo bolje razumela ova komunikacija, uzećemo za primer jedan niz bitova kojim upravljamo jednim PCF8574 integralnim kolom. O njemu je bilo dosta reči i ranije (SK 5/2019, i.sk.rs/15870).

Ako pogledamo u tehničku dokumentaciju jednog PCF8574, možemo da vidimo primere niza bitova, kako za Input, tako i za Output, uz neznatne razlike. Ceo niz bitova možemo da podelimo na upravljačke, adresne i data bitove. Niz bitova direktno zavisi od samog I2C uređaja i za, recimo, MCP23017 će biti drugačiji.

Na slici gore se jasno vidi da niz počinje S bitom, kao start. Za njim ide niz od 7 bitova koji se tiče adrese (7-bit BUS). Niz se kreće u suprotnom redu, tako da je prvi, zapravo, A6, a završava se sa A0. Od A6 do A3 su, takozvani, fiksni bitovi i zavise isključivo od samog primerka čipa (PCF8574 i PCF8574A nemaju iste ove bitove). Da se ponovimo, govorimo isključivo o PCF8574, za druge uređaje biće drugačije. Od A2 do A0 su bitovi koje mi postavljamo prilikom odabira I2C adrese, vezujući A0-A2 izvode samog čipa na HIGH ili LOW. U okviru svake tehničke dokumentacije postoje tabele sa mogućim I2C adresama. Recimo da su za PCF8574 fiksni bitovi 0111, a pinove čipa od A0-A2 vežemo na LOW, dobijamo niz bitova 0111000. Naš čip u ovom slučaju piše logička stanja na svojim izvodima, tako da je R/W bit za Read jednako 0. Prvi segment niza bitova je, za sada, S01110000.

Niz sa podacima počinje sa A ili ACK (acknowledge) od Slave. ACK je znak da je Slave uspostavio ispravnu komunikaciju, te je ispisao na SDA logičku nulu (LOW). U suprotnom će biti NACK, zato što je SDA preko pull-up otpornika već povezana na HIGH. Razlog za NACK može da bude u tome što je Slave u tom trenutku zauzet, nije razumeo komandu, ne može da primi više podataka ili drugo. Inače, bit A (ili N) ide između svakog skupa bitova. Data1 i data2 (data3, data4 sve do bita Stop), shodno čipu, sadrže niz bitova logičkih stanja prema izvodima od P7 do P0. Pa, tako, ako želimo da uključimo LED na pinu P0, naš niz bi trenutno bio

S01110000 A 00000001 A 00000001 A...

sve do bita P, što znači Stop. Bit A prilikom skeniranja saobraćaja na I2C linijama biva predstavljen sa „+”. Suprotno, ako Slave ne odgovori potvrdno, biće „-”, odnosno, NACK. Recimo, uključena pomenuta LED sa samo jednim nizom podataka (obično tako funkcionišu biblioteke u Arduino IDE za PCF8574) bila bi ispisana ovako:

S01110000A00000001P

I2C skener bi ovo predstavio ovako:

S0111000W+0000001+s

Princip je isti za sve I2C uređaje prilikom pisanja (output) Mastera ka Slave.

Na slici dole se vidi da je osnovna razlika u promeni R/W bita, gde je za čitanje taj bit sada 1. Recimo da se na, sada, izvodu P7 nalazi taster koji je pritisnut i poslao je HIGH. Tada bi komunikacija izgledala ovako:

S01110001A10000000P

Ili na I2C skeneru:

S0111000R+10000000+s

Najveći broj I2C uređaja već ima svoje biblioteke u okviru Arduino IDE, te mi nemamo potrebe da se bavimo bitovima. Drugim rečima, neko je to za nas sve lepo upakovao u „fensi” funkcije. Ipak, treba znati da postoji i namenska I2C biblioteka za sam interfejs koja se naziva Wire. Bez obzira na neku od biblioteka, recimo baš za PCF8574, Wire će se svakako pozivati. Wire se sastoji iz nekoliko osnovnih funkcija, kao što su beginTransmission(), preko koje se obraćamo I2C uređaju (obično, ne i nužno) preko HEX I2C adrese i šaljemo ono S na početku. Sa endTransission() se prekida komunikacija, te šaljemo P na kraju. Između su funkcije read() i write(), po potrebi.

Mi smo na ovim stranama imali zaista dosta članaka gde smo sa mikrokontrolerima povezivali neki od I2C uređaja. Međutim, isto kao što jedan Uno može da uključi LED preko PCF8574 ili da pročita temperaturu sa BME280, tako može da pošalje podatke drugom mikrokontroleru preko I2C interfejsa. Podrazumeva se da jedan treba da bude Master, a drugi Slave.

Interfejs I2C svrstava se u sporije, koji su pogodni za povezivanje više uređaja u jednu celinu koristeći samo dve linije. Najveći broj grešaka se dešava prilikom odabira otpornika, neretko i sa dodavanjem otpornika za svaki od više I2C uređaja, gde se slepo prate primeri sa mreže. Na ovaj način se u zbiru dobija prevelika vrednost otpora na svakoj od I2C linija, što je, naravno, pogrešno.


PRETHODNI TEKST
SLEDEĆI TEKST
Najčitanije
Igre
Telefoni
Hardver
Softver
Nauka
Aktuelno štampano izdanje
JUN 2025
Doom: The Dark Ages
Doom iz mračnog doba drugačiji je od svih drugih Doomova, jer je Slayer koncipiran kao tenk sa štitom...
Clair Obscur: Expedition 33
Estetika Belle Époquea, gameplay u skladu sa kanonima JRPG-a, vrhunsko pripovedanje i ljubav prema igrama...
Computex 2025, Tajpej, Tajvan
AI NEXT
Ovaj, nekada ultra-PC-specifični sajam, odavno se proširio na srodne tehnologije, biznis rešenja i digitalne usluge, postavši varijanta azijskog C...
Gigabyte GeForce RTX 5070 Gaming OC 12G
Višak samopouzdanja
Kartica je sa hardverske strane vrlo kvalitetna, ali ništa ne može da nadomesti nedostatak snage „pod haubom”...
Asus ProArt P16 (H7606WP)
Pronalazak neverovatnog
Novi ProArt P16 donosi moderna rešenja, u dobro usaglašenom odnosu gabarita i performansi – alatka koju ćete sa ponosom nosati sa sobom...
Logitech ProX Superlight 2
Sve udvostručeno
Ovaj miš predstavlja jasnu indikaciju da najveći proizvođač ne želi da napusti nijedan segment tržišta...
Winhance 25.05
Popravka Prozora
U pitanju je alatka koja omogućava da se brzo rešite (većine) bloatwarea, ali i da obavite optimizaciju rada Windowsa...
TCL NXTPAPER 11 Plus
Momak za sve
Ovo bi bio najbolji tablet „za te pare” i da košta 100 evra više...
.rs: Beogradski prevoz na Yandexu • Srbija u SEPA • Loši primeri digitalizacije
Unapređeno e Zakazivanje
Beogradski prevoz na Yandexu • Srbija u SEPA • Loši primeri digitalizacije
Google Mariner, Google Astra i AI autonomni agenti
Uspon tihog softvera
Umesto kliktanja stručnog lica, softver će, već ove godine, u tihom, gotovo nečujnom načinu rada - završavati posao...
Fatal Fury: City of the Wolves
Fatal Fury je oduvek bio čudna cvećka u svetu borilačkih igara; takav je i ostao...
Arc Raiders
Novi extraction shooter iz pera autora dobrih delova franšize Battlefield (i potcenjenog The Finals)...
© 2025 Svet kompjutera. Sva prava zadrzana.
Novi broj - Arhiva - Forum - O nama