- Kas yra „I2C“ ryšio protokolas?
- Kaip veikia „I2C Communication“?
- Kur naudoti I2C ryšį?
- I2C MSP430: AD5171 skaitmeninio potenciometro valdymas
„MSP430“ yra galinga platforma, kurią „Texas Instruments“ teikia įterptiesiems projektams, dėl savo universalumo ji leido ieškoti būdų daugybei programų, o etapas vis dar vyksta. Jei stebėjote mūsų MSP430 vadovėlius, pastebėjote, kad mes jau apėmėme daugybę šio 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į į „ I2C“ dalį, nes tai yra 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 vergas, turintis tą konkretų adresą, atsakys atgal į informaciją, o kiti išjungs. Tokiu būdu mes galime naudoti tą pačią magistralę, kad galėtume bendrauti su keliais įrenginiais.
Kad įtampos lygių I2C yra ne iš anksto apibrėžtas. „I2C“ ryšys yra lankstus, tai reiškia, kad prietaisas, maitinamas 5 V įtampa, gali naudoti 5 V įtampą I2C, o 3.3 V prietaisai - 3 V I2C ryšiui. Bet ką daryti, jei du skirtingos įtampos įrenginiai turi bendrauti naudodami I2C? 5V magistralės I2c negali būti prijungtas su 3,3 "prietaiso. Šiuo atveju įtampos keitikliai naudojami įtampos lygiams tarp dviejų I2C magistralių suderinti.
Yra keletas sąlygų, kurios sudaro sandorį. Perdavimas pradedamas krentant SDA kraštui, kuris žemiau esančioje diagramoje apibrėžiamas kaip „START“ sąlyga, kai pagrindinis atstovas palieka aukštą SCL, tuo tarpu nustatydamas žemą SDA.
Kaip parodyta aukščiau pateiktoje diagramoje, Krintantis SDA kraštas yra apatinis paleidiklis sąlygai START. Po to visi toje pačioje magistralėje esantys įrenginiai pereina į klausymo režimą.
Tuo pačiu būdu kylantis SDA kraštas sustabdo transmisiją, kuri aukščiau pateiktoje diagramoje rodoma kaip „STOP“ sąlyga, kai pagrindinis atstovas palieka aukštą SCL ir taip pat išleidžia SDA, kad jis eitų HIGH. Taigi kylantis SDA kraštas sustabdo perdavimą.
R / W bitai nurodo sekančių baitų perdavimo kryptį, jei jis yra HIGH, reiškia, kad vergas perduos, o jei jis yra žemas, tai reiškia, kad pagrindinis perduos.
Kiekvienas bitas yra perduodamas kiekvienu laikrodžio ciklu, todėl baitui perduoti reikia 8 laikrodžio ciklų. Po kiekvieno išsiųsto ar gauto baito, ACK / NACK laikomas devintasis laikrodžio ciklas (patvirtinta / nepatvirtinta). Šį ACK bitą sukuria vergas arba pagrindinis, priklausomai nuo situacijos. ACK bitų atveju SDA nustatomas žemas pagal pagrindinį arba pavaldųjį 9 -ojo laikrodžio ciklą. Taigi yra mažai, jis laikomas ACK, kitaip NACK.
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 MSP430: AD5171 skaitmeninio potenciometro valdymas
„Energia IDE“ yra viena iš paprasčiausių programinės įrangos programuoti mūsų MSP430. Tai tas pats, kas „Arduino IDE“. Daugiau apie „MSP430“ pradėjimą naudojant „Energia IDE“ galite sužinoti čia.
Taigi, norėdami naudoti „I2C“ „Energia IDE“, turime įtraukti tik antraštę „ wire.h“ . Smeigtuko deklaracija (SDA ir SCL) yra laidų bibliotekoje, todėl mums nereikia deklaruoti sąrankos funkcijoje.
Pavyzdžių pavyzdžius galite rasti IDE meniu Pavyzdys. Vienas iš pavyzdžių yra paaiškintas toliau:
Šiame pavyzdyje parodyta, kaip valdyti analoginį įrenginį AD5171 skaitmeninį potenciometrą, kuris bendrauja per I2C sinchroninį nuoseklųjį protokolą. Naudojant MSP „I2C Wire Library“, skaitmeninis puodas peržengs 64 atsparumo lygius ir išblukins šviesos diodą.
Pirmiausia įtrauksime biblioteką, atsakingą už „i2c“ ryšį, ty laidų biblioteką
# įtraukti
Be sąrankos funkcijai, mes pradėsime vielos biblioteką .begin () funkcija.
negaliojanti sąranka () { Wire.begin (); }
Tada inicializuokite kintamąjį val, kad išsaugotumėte potenciometro vertes
baitas val = 0;
Pagal ciklo funkciją pradėsime perduoti į „i2c“ vergo įrenginį (šiuo atveju skaitmeninį potenciometrą IC) nurodydami prietaiso adresą, pateiktą IC duomenų lape.
void loop () { Wire.beginTransmission (44); // perduoti į įrenginį Nr. 44 (0x2c)
Vėliau eilės baitai, ty duomenys, kuriuos norite siųsti į IC perduoti naudodami rašymo () funkciją.
Wire.write (baitas (0x00)); // siunčia instrukcijos baitą Wire.write (val); // siunčia potenciometro vertės baitą
Tada persiųskite juos paskambinę „ endTransmission“ () .
„Wire.endTransmission“ (); // nustoti perduoti val ++; // prieaugio reikšmė if (val == 64) {// jei pasiekiama 64-oji padėtis (max) val = 0; // pradėti nuo mažiausios vertės } vėlavimas (500); }