- Kaj je komunikacijski protokol I2C?
- Kako deluje komunikacija I2C?
- Kje uporabiti komunikacijo I2C?
- I2C v MSP430: krmiljenje digitalnega potenciometra AD5171
MSP430 je zmogljiva platforma, ki jo ponuja Texas Instruments za vdelane projekte, zaradi svoje vsestranske narave pa je našel pot do številnih aplikacij, faza pa še poteka. Če bi sledili našim vadnicam MSP430, bi opazili, da smo na tem mikrokrmilniku že zajeli široko paleto vadnic, že od samih osnov. Od zdaj smo pokrivali osnove, s katerimi lahko pridemo do bolj zanimivih stvari, kot je komunikacijski portal.
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 izmenjavo teh informacij, najpogosteje pa se uporabljajo USART, IIC, SPI in CAN. Vsak komunikacijski protokol ima svojo prednost in slabost. Zaenkrat se osredotočimo na del I2C, saj se bomo tega naučili v tej vadnici.
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 petelina, 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 kot slave. Komunikacija bi morala in bo vedno potekala med dvema Master 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 komunikacijo lahko sprožil samo poveljnik. Ker je v vodilu več podrejenih naprav, se mora poveljnik sklicevati na vsakega podrejenega z drugim naslovom. Ko je naslovljen samo suženj s tem naslovom, bo odgovoril s podatki, medtem ko bodo ostali nehali. Na ta način lahko z istim vodilom komuniciramo z več napravami.
Na ravni napetosti v I2C niso vnaprej določene. I2C komunikacija je prilagodljiva, pomeni napravo, ki jo napaja 5v voltov, lahko uporablja 5v za I2C, naprave 3.3v pa 3v za komunikacijo I2C. Kaj pa, če morata dve napravi, ki delujeta na različne napetosti, komunicirati s pomočjo I2C? 5V I2C ni mogoče povezati z 3,3 napravo. V tem primeru se napetostni preklopniki uporabljajo za usklajevanje ravni napetosti med dvema vodiloma I2C.
Obstaja nekaj pogojev, ki določajo transakcijo. Inicializacija prenosa se začne s padajočim robom SDA, ki je v spodnjem diagramu opredeljen kot pogoj 'START', kjer glavni pusti SCL visoko, medtem ko SDA nastavi nizko.
Kot je prikazano na zgornjem diagramu spodaj, Spodnji rob SDA je sprožilec strojne opreme za stanje START. Po tem vse naprave na istem vodilu preidejo v način poslušanja.
Na enak način naraščajoči rob SDA ustavi prenos, ki je v zgornjem diagramu prikazan kot pogoj 'STOP', kjer glavni pusti SCL visoko in prav tako spusti SDA, da gre VISOKO. Torej naraščajoči rob SDA ustavi prenos.
R / W bit označuje smer prenosa naslednjih bajtov, če je VISOK, pomeni, da bo podrejeni podrejen in če je nizek, pomeni, da bo prenašal glavni.
Vsak bit se prenese v vsakem taktnem ciklu, zato je za prenos bajta potrebnih 8 urnih ciklov. Po vsakem poslanem ali prejetem bajtu se izvede deveti takt za ACK / NACK (potrjen / nepriznan). Ta bit ACK generira podrejeni ali glavni, odvisno od situacije. Za bit ACK je SDA glavni ali pomožni nastavljen na nizko vrednost pri 9. taktnem ciklu. Torej je nizka, šteje se za ACK, sicer NACK.
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 informacije pošiljati glavnemu. 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 pa iščete bolj zanesljivo komunikacijo, poskusite s protokolom SPI.
I2C v MSP430: krmiljenje digitalnega potenciometra AD5171
Energia IDE je eno najlažjih programov za programiranje našega MSP430. Enako je kot Arduino IDE. Več o tem, kako začeti uporabljati MSP430 z uporabo Energia IDE, lahko izveste tukaj.
Za uporabo I2C v programu Energia IDE moramo samo vključiti glavo head.hr. Deklaracija pinov (SDA in SCL) je znotraj žične knjižnice, zato nam ni treba prijaviti v nastavitveni funkciji.
Vzorčne primere najdete v meniju Primer IDE. Eden od primerov je razložen spodaj:
Ta primer prikazuje, kako upravljati digitalni potenciometer Analog Devices AD5171, ki komunicira prek sinhronega serijskega protokola I2C. Z uporabo knjižnice žic I2C MSP bo digitalni lonec stopil skozi 64 stopenj odpornosti in utripal LED.
Najprej bomo vključili knjižnico, ki je odgovorna za komunikacijo i2c, tj. Žično knjižnico
#include
V nastavitveni funkciji bomo knjižnico žic sprožili s funkcijo.begin () .
void setup () { Wire.begin (); }
Nato inicializirajte spremenljivko val za shranjevanje vrednosti potenciometra
bajt val = 0;
V funkciji zanke bomo začeli prenos na pomožno napravo i2c (v tem primeru digitalni potenciometer IC) z določitvijo naslova naprave, ki je naveden v obrazcu IC.
void loop () { Wire.beginTransmission (44); // prenos v napravo št. 44 (0x2c)
Nato postavite bajte v čakalno vrsto, tj. Podatke, ki jih želite poslati na IC za prenos s funkcijo write () .
Wire.write (bajt (0x00)); // pošlje bajt navodil Wire.write (val); // pošlje bajt vrednosti potenciometra
Nato jih pošljite s klicem endTransmission () .
Wire.endTransmission (); // prenehamo oddajati val ++; // prirast vrednosti, če (val == 64) {// če je dosežen 64. položaj (maks.) val = 0; // začnite znova od najnižje vrednosti } delay (500); }