- Co je komunikační protokol I2C?
- Jak funguje komunikace I2C?
- Kde použít komunikaci I2C?
- I2C v MSP430: ovládání digitálního potenciometru AD5171
MSP430 je výkonná platforma poskytovaná společností Texas Instruments pro vestavěné projekty, díky své univerzální povaze je možné najít cesty k mnoha aplikacím a fáze stále pokračuje. Pokud jste sledovali naše výukové programy MSP430, všimli byste si, že jsme již na tomto mikrokontroléru pokryli celou řadu výukových programů, počínaje úplnými základy. Od té doby jsme se zabývali základy, které můžeme dostat do zajímavějších věcí, jako je komunikační portál.
V rozsáhlém systému integrovaných aplikací nemůže žádný mikrokontrolér provádět všechny činnosti sám. V určité době musí komunikovat s jinými zařízeními za účelem sdílení informací, existuje mnoho různých typů komunikačních protokolů pro sdílení těchto informací, ale nejpoužívanější jsou USART, IIC, SPI a CAN. Každý komunikační protokol má své vlastní výhody a nevýhody. Pojďme se nyní zaměřit na část I2C, protože to se v tomto tutoriálu naučíme.
Co je komunikační protokol I2C?
Termín IIC znamená „ Inter Integrated Circuits “. Obvykle se na některých místech označuje jako I2C nebo I na druhou C nebo dokonce jako 2vodičový protokol rozhraní (TWI), ale všechno to znamená totéž. I2C je synchronní komunikační protokol, což znamená, že obě zařízení, která sdílejí informace, musí sdílet společný hodinový signál. Má pouze dva vodiče ke sdílení informací, z nichž jeden se používá pro kohoutkový signál a druhý pro odesílání a příjem dat.
Jak funguje komunikace I2C?
Komunikaci I2C poprvé představil Phillips. Jak již bylo řečeno, má dva vodiče, tyto dva vodiče budou připojeny přes dvě zařízení. Zde se jedno zařízení nazývá hlavní a druhé zařízení se nazývá slave. Komunikace by měla a vždy proběhne mezi dvěma Master a Slave. Výhodou komunikace I2C je, že k Master může být připojeno více než jeden slave.
Kompletní komunikace probíhá prostřednictvím těchto dvou vodičů, jmenovitě Serial Clock (SCL) a Serial Data (SDA).
Serial Clock (SCL): Sdílí hodinový signál generovaný nadřízeným s podřízeným
Serial Data (SDA): Sends the data to and from between the Master and slave.
Komunikaci může kdykoli zahájit pouze nadřízený. Protože ve sběrnici je více než jeden slave, musí master odkazovat na každého slave pomocí jiné adresy. Pokud je adresován pouze otrok s touto konkrétní adresou, odpoví zpět s informacemi, zatímco ostatní budou ukončeni. Tímto způsobem můžeme použít stejnou sběrnici ke komunikaci s více zařízeními.
Tyto úrovně napětí na I2C nejsou předdefinované. Komunikace I2C je flexibilní, to znamená, že zařízení, které je napájeno 5 V, může používat 5 V pro I2C a zařízení 3,3 V mohou používat 3 V pro komunikaci I2C. Ale co když dvě zařízení, která běží na různých napětích, potřebují komunikovat pomocí I2C? 5V I2C bus nemůže být spojen s 3,3 zařízením. V tomto případě se měniče napětí používají k přizpůsobení úrovní napětí mezi dvěma sběrnicemi I2C.
Existuje několik podmínek, které rámcují transakci. Inicializace přenosu začíná sestupnou hranou SDA, která je definována jako podmínka „START“ v níže uvedeném diagramu, kdy master ponechává SCL vysokou při nastavování nízké SDA.
Jak ukazuje výše uvedený diagram, Klesající hrana SDA je hardwarová spoušť pro podmínku START. Poté všechna zařízení na stejné sběrnici přejdou do režimu poslechu.
Stejným způsobem zastaví náběžná hrana SDA přenos, který je ve výše uvedeném diagramu zobrazen jako stav „STOP“, kde hlavní jednotka ponechá SCL vysoko a také uvolní SDA, aby dosáhla HIGH. Náběžná hrana SDA tedy zastaví přenos.
Bit R / W udává směr přenosu následujících bajtů, pokud je HIGH znamená, že slave bude vysílat, a pokud je nízký, bude vysílat master.
Každý bit se přenáší v každém taktu, takže přenos bajtu trvá 8 hodinových cyklů. Po každém odeslaném nebo přijatém bajtu je pro ACK / NACK zadržen devátý hodinový cyklus (potvrzeno / nepotvrzeno). Tento bit ACK je generován slave nebo master v závislosti na situaci. Pro ACK bit, SDA je nastavena na minimum tím, master nebo slave v 9 -tého taktu. Takže je nízká, považuje se to za ACK, jinak NACK.
Kde použít komunikaci I2C?
Komunikace I2C se používá pouze pro komunikaci na krátkou vzdálenost. Určitě je do jisté míry spolehlivý, protože má synchronizovaný hodinový puls, aby byl chytrý. Tento protokol se používá hlavně ke komunikaci se senzorem nebo jinými zařízeními, která musí odesílat informace hlavnímu zařízení. Je velmi užitečné, když mikrokontrolér musí komunikovat s mnoha dalšími podřízenými moduly pomocí minimálně pouze vodičů. Pokud hledáte komunikaci na velkou vzdálenost, měli byste zkusit RS232 a pokud hledáte spolehlivější komunikaci, zkuste použít protokol SPI.
I2C v MSP430: ovládání digitálního potenciometru AD5171
Energia IDE je jedním z nejjednodušších programů pro programování našeho MSP430. Je to stejné jako Arduino IDE. Více informací o Začínáme s MSP430 pomocí prostředí Energia IDE se dozvíte zde.
Chcete-li tedy použít I2C v Energia IDE, musíme do souboru zahrnout pouze soubor header.h . Deklarace PIN (SDA a SCL) je uvnitř knihovny vodičů, takže nemusíme deklarovat ve funkci nastavení .
Ukázkové příklady najdete v nabídce Příklad IDE. Jeden z příkladů je vysvětlen níže:
Tento příklad ukazuje, jak řídit digitální potenciometr AD5171 Analog Devices, který komunikuje pomocí synchronního sériového protokolu I2C. S využitím I2C Wire Library MSP digitální potenciometr prochází 64 úrovněmi odporu a slábne LED.
Nejprve zahrneme knihovnu odpovědnou za komunikaci i2c, tj. Knihovnu drátů
#zahrnout
Ve funkci nastavení zahájíme knihovnu drátů pomocí funkce .begin () .
void setup () { Wire.begin (); }
Pak inicializovat proměnné val pro ukládání hodnot potenciometrem
byte val = 0;
Ve funkci smyčky zahájíme přenos na slave zařízení i2c (v tomto případě digitální potenciometr IC) zadáním adresy zařízení, která je uvedena v datovém listu IC.
void loop () { Wire.beginTransmission (44); // přenos do zařízení # 44 (0x2c)
Následně bajty fronty, tj. Data, která chcete odeslat na IC pro přenos s funkcí write () .
Wire.write (byte (0x00)); // odešle instrukční bajt Wire.write (val); // odešle bajt hodnoty potenciometru
Poté je přeneste voláním endTransmission () .
Wire.endTransmission (); // přestat vysílat val ++; // přírůstek hodnoty if (val == 64) {// pokud je dosaženo 64. pozice (max) val = 0; // začátek od nejnižší hodnoty } delay (500); }