- Mi az I2C kommunikációs protokoll?
- Hogyan működik az I2C Communication?
- Hol használható az I2C kommunikáció?
- I2C MSP430-ban: Az AD5171 digitális potenciométer vezérlése
Az MSP430 egy erőteljes platform, amelyet a Texas Instruments biztosít beágyazott projektekhez. Sokoldalú jellege miatt számos alkalmazás megtalálható, és a fázis még mindig tart. Ha követte az MSP430 oktatóprogramjainkat, akkor észrevette volna, hogy a mikrovezérlő oktatóinak széles skáláját már lefedtük az alapoktól kezdve. Azóta áttekintettük azokat az alapokat, amelyekkel még érdekesebb dolgokba keveredhetünk, például a kommunikációs portálba.
A beágyazott alkalmazások hatalmas rendszerében egyetlen mikrokontroller sem képes az összes tevékenységet egyedül végrehajtani. Bizonyos időszakokban kommunikálnia kell más eszközökkel az információk megosztása érdekében, sokféle kommunikációs protokoll létezik ezeknek az információknak a megosztására, de a leggyakrabban használtak az USART, IIC, SPI és CAN. Minden kommunikációs protokollnak megvan a maga előnye és hátránya. Koncentráljunk most az I2C részre, mivel ezt fogjuk megtanulni ebben az oktatóanyagban.
Mi az I2C kommunikációs protokoll?
Az IIC kifejezés az „ Inter integrált áramköröket ” jelenti. Általában I2C vagy I négyzetként jelöljük, vagy helyenként 2 vezetékes interfész protokollként (TWI) jelöljük, de mindez ugyanazt jelenti. Az I2C egy szinkron kommunikációs protokoll, vagyis mindkét információt megosztó eszköznek közös órajelet kell használnia. Csak két vezetékkel rendelkezik az információk megosztásához, amelyek közül az egyik a kakasjelre, a másik az adatok küldésére és fogadására szolgál.
Hogyan működik az I2C Communication?
Az I2C kommunikációt először Phillips vezette be. Mint korábban említettük, két huzallal rendelkezik, ezt a két vezetéket két eszközön fogják összekötni. Itt az egyik eszközt masternek , a másikat pedig slave-nek hívják. A kommunikációnak mindig két mester és egy rabszolga között kell történnie és meg kell történnie. Az I2C kommunikáció előnye, hogy egy masterhez több slave is csatlakoztatható.
A teljes kommunikáció ezen a két vezetéken, nevezetesen a soros órán (SCL) és a soros adaton (SDA) keresztül zajlik.
Soros óra (SCL): Megosztja a master által generált órajelet a slave-lel
Soros adatok (SDA): Az adatokat elküldi a Master és a Slave között és között.
A kommunikációt bármikor csak a mester kezdeményezheti. Mivel a buszon egynél több rabszolga van, a mesternek külön címet kell használnia az egyes rabszolgákra. Ha megszólítják, csak az adott címmel rendelkező rabszolga válaszol vissza az információval, míg a többiek kilépnek. Így ugyanazt a buszt használhatjuk több eszközzel való kommunikációhoz.
Az I2C feszültségszintje nincs előre meghatározva. Az I2C kommunikáció rugalmas, azt jelenti, hogy az 5 V-os feszültséggel működő eszköz 5 V-ot használhat az I2C-hez, a 3,3 V-os eszközök pedig 3 V-ot az I2C-kommunikációhoz. De mi van akkor, ha két, különböző feszültséggel működő eszköznek kommunikálnia kell az I2C segítségével? Az 5 V-os I2C busz nem csatlakoztatható 3,3 V-os eszközhöz. Ebben az esetben feszültségváltókat alkalmaznak a két I2C busz közötti feszültségszintek egyezésére.
Van néhány feltétel, amely egy tranzakciót keretbe foglal. Az átvitel inicializálása az SDA csökkenő peremével kezdődik, amelyet „START” feltételként definiálunk az alábbi ábrán, ahol a master magasra hagyja az SCL-t, miközben az SDA-t alacsonyra állítja.
Amint azt a fenti ábra mutatja, Az SDA zuhanó éle a START feltétel hardverindítója. Ezután ugyanazon a buszon lévő összes eszköz hallgatási módba vált.
Ugyanígy az SDA emelkedő széle leállítja az átvitelt, amely a fenti ábrán „STOP” állapotként jelenik meg, ahol a master magasan hagyja az SCL-t, és az SDA-t is HIGH-ra megy. Tehát az SDA emelkedő széle leállítja az átvitelt.
Az R / W bit a következő bájtok továbbításának irányát jelzi, ha HIGH, akkor azt jelenti, hogy a slave továbbít, és ha alacsony, akkor azt jelenti, hogy a master továbbít.
Minden bit minden óracikluson át kerül továbbításra, tehát egy bájt átviteléhez 8 óraciklus szükséges. Minden elküldött vagy fogadott bájt után kilencedik óraciklust tartunk az ACK / NACK számára (nyugtázva / nem nyugtázva). Ezt az ACK bitet egy szolga vagy egy master generálja a helyzettől függően. A ACK bit, SDA van beállítva, hogy az alacsony mester vagy slave 9 -én órajelciklusban. Tehát alacsony, ACK-nak tekintik, egyébként NACK.
Hol használható az I2C kommunikáció?
Az I2C kommunikációt csak rövid távú kommunikációra használják. Bizonyos mértékben megbízható, mivel szinkronizált impulzusokkal rendelkezik, hogy okos legyen. Ezt a protokollt főleg szenzorokkal vagy más eszközökkel való kommunikációra használják, amelyeknek információkat kell eljuttatniuk a masterhez. Nagyon hasznos, ha a mikrovezérlőnek sok más szolga modullal kell kommunikálnia, minimum csak vezetékeket használva. Ha nagy hatótávolságú kommunikációra vágyik, próbálja ki az RS232-et, és ha megbízhatóbb kommunikációt szeretne, akkor próbálja ki az SPI protokollt.
I2C MSP430-ban: Az AD5171 digitális potenciométer vezérlése
Az Energia IDE az egyik legkönnyebben programozható MSP430. Ez megegyezik az Arduino IDE-vel. Itt többet tudhat meg az MSP430 használatának megkezdéséről az Energia IDE használatával.
Tehát az I2C használatához az Energia IDE-ben csak a wire.h fejléc fájlt kell tartalmaznunk. A PIN deklaráció (SDA és SCL) a vezetékkönyvtárban található, így a telepítési funkcióban nem kell nyilatkoznunk.
Példapéldák találhatók az IDE Példa menüjében. Az egyik példát az alábbiakban ismertetjük:
Ez a példa bemutatja az analóg eszközök AD5171 digitális potenciométerének vezérlését, amely az I2C szinkron soros protokollon keresztül kommunikál. Az MSP I2C Wire Library használatával a digitális fazék 64 ellenállási szintet lép át, elhalványítva a LED-et.
Először felvesszük az i2c kommunikációért felelős könyvtárat, azaz a vezetékes könyvtárat
#include
A setup függvényben a vezetékes könyvtárat a .begin () függvénnyel kezdeményezzük.
void setup () { Wire.begin (); }
Ezután inicializáljon egy változó val értéket a potenciométer értékeinek tárolásához
bájt val = 0;
A loop funkció, akkor elkezd továbbítása a i2c szolga eszköz (ebben az esetben a digitális potenciométer IC) megadásával az eszköz címét, amelyet adott az adatlapon az IC.
void loop () { Wire.beginTransmission (44); // továbbítás a 44-es eszközre (0x2c)
Ezt követően sorbaállítási bájtokat, azaz azokat az adatokat, amelyeket az IC-nek el akar küldeni továbbítás céljából a write () függvénnyel.
Wire.write (byte (0x00)); // utasításbájtot küld Wire.write (val); // potenciométer érték bájtot küld
Ezután továbbítsa őket az endTransmission () meghívásával.
Wire.endTransmission (); // leállítja a val ++ továbbítását ; // növekmény értéke if (val == 64) {// ha elérjük a 64. pozíciót (max) val = 0; // kezdje a legkisebb értékből } késleltetés (500); }