- Какво е I2C протокол за комуникация?
- Как работи I2C Комуникацията?
- Къде да използвам I2C комуникация?
- I2C в MSP430: Управление на цифровия потенциометър AD5171
MSP430 е мощна платформа, предоставена от Texas Instruments за вградени проекти, нейната универсална природа го е накарала да намира пътища в много приложения и фазата все още продължава. Ако сте следвали нашите уроци за MSP430, тогава бихте забелязали, че вече сме обхванали широк набор от уроци за този микроконтролер, започвайки от самите основи. От сега обхващаме основите, по които можем да влезем в по-интересни неща като комуникационния портал.
В обширната система от вградени приложения никой микроконтролер не може да изпълнява всички дейности сам. На даден етап от времето той трябва да комуникира с други устройства, за да споделя информация, има много различни видове комуникационни протоколи за споделяне на тази информация, но най-използваните са USART, IIC, SPI и CAN. Всеки комуникационен протокол има своите предимства и недостатъци. Нека се съсредоточим върху частта I2C засега, тъй като това ще научим в този урок.
Какво е I2C протокол за комуникация?
Терминът IIC означава „ Интер интегрални схеми “. Обикновено се обозначава като I2C или I на квадрат C или дори като двупроводен интерфейсен протокол (TWI) на някои места, но всичко означава едно и също. I2C е синхронен комуникационен протокол, което означава, че и двете устройства, които споделят информацията, трябва да споделят общ тактов сигнал. Той има само два проводника за споделяне на информация, от които единият се използва за сигнала на крана, а другият се използва за изпращане и получаване на данни.
Как работи I2C Комуникацията?
I2C комуникацията е представена за първи път от Филипс. Както беше казано по-рано, той има два проводника, тези два проводника ще бъдат свързани през две устройства. Тук едното устройство се нарича master, а другото устройство се нарича slave. Комуникацията трябва и винаги ще се осъществява между двама Господар и Роб. Предимството на I2C комуникацията е, че повече от един slave може да бъде свързан към Master.
Пълната комуникация се осъществява чрез тези два проводника, а именно, сериен часовник (SCL) и сериен данни (SDA).
Сериен часовник (SCL): Споделя сигнала на часовника, генериран от главното устройство, с подчинения
Серийни данни (SDA): Изпраща данните към и между главния и подчинения.
Във всеки един момент само майсторът ще може да инициира комуникацията. Тъй като в шината има повече от един slave, капитанът трябва да се обърне към всеки slave, използвайки различен адрес. Когато се обърне само робът с този конкретен адрес ще отговори с информацията, докато останалите продължават да излизат. По този начин можем да използваме една и съща шина за комуникация с множество устройства.
Нивата на напрежение на I2C не са предварително дефинирани. I2C комуникацията е гъвкава, означава устройството, което се захранва от 5v волта, може да използва 5v за I2C и 3.3v устройствата могат да използват 3v за I2C комуникация. Но какво, ако две устройства, работещи на различни напрежения, трябва да комуникират чрез I2C? А 5V I2C автобус не може да бъде свързан с 3.3V устройство. В този случай превключвателите на напрежение се използват за съвпадение на нивата на напрежение между две I2C шини.
Има някои условия, които определят транзакцията. Инициализирането на предаването започва с падащ ръб на SDA, което се дефинира като условие „START“ в диаграмата по-долу, където master оставя SCL висок, докато настройва SDA ниско.
Както е показано на горната диаграма по-долу, Падащият ръб на SDA е хардуерният спусък за състоянието START. След това всички устройства от една и съща шина преминават в режим на слушане.
По същия начин, нарастващият ръб на SDA спира предаването, което е показано като условие „STOP“ в горната диаграма, където главният оставя SCL високо и също освобождава SDA, за да отиде HIGH. Така нарастващият ръб на SDA спира предаването.
R / W бит показва посоката на предаване на следващите байтове, ако е HIGH, означава, че подчиненият ще предаде, а ако е нисък означава, че главният ще предаде.
Всеки бит се предава на всеки тактов цикъл, така че са необходими 8 тактови цикъла, за да се предаде байт. След всеки байт, изпратен или получен, се провежда девети тактов цикъл за ACK / NACK (потвърден / непотвърден). Този ACK бит се генерира от подчинен или главен в зависимост от ситуацията. За ACK бит SDA се задава на ниско ниво от главния или подчинения при 9 -ия тактов цикъл. Така че е ниско, счита се за ACK, иначе NACK.
Къде да използвам I2C комуникация?
I2C комуникацията се използва само за комуникация на къси разстояния. Със сигурност е надежден до известна степен, тъй като има синхронизиран импулс на часовника, за да го направи умен. Този протокол се използва главно за комуникация със сензор или други устройства, които трябва да изпращат информация до главен. Много е удобно, когато микроконтролерът трябва да комуникира с много други подчинени модули, използвайки минимум само проводници. Ако търсите комуникация на дълги разстояния, трябва да опитате RS232, а ако търсите по-надеждна комуникация, трябва да опитате протокола SPI.
I2C в MSP430: Управление на цифровия потенциометър AD5171
Energia IDE е един от най-лесните софтуери за програмиране на нашия MSP430. Същото е като Arduino IDE. Можете да научите повече за Първи стъпки с MSP430 с помощта на Energia IDE тук.
Така че, за да използваме I2C в Energia IDE, трябва просто да включим заглавния файл wire.h. Декларацията за ПИН (SDA и SCL) е вътре в жичната библиотека, така че не е необходимо да декларираме в настройката .
Примерни примери можете да намерите в менюто за пример на IDE. Един от примерите е обяснен по-долу:
Този пример показва как да се контролира цифров потенциометър Analog Devices AD5171, който комуникира чрез синхронния сериен протокол I2C. Използвайки библиотеката за проводници I2C на MSP, цифровият пот ще премине през 64 нива на съпротива, като избледнява светодиод.
Първо, ще включим библиотеката, отговорна за i2c комуникацията, т.е. жична библиотека
#include
Във функцията за настройка ще инициираме жичната библиотека чрез функцията.begin () .
void setup () { Wire.begin (); }
След това инициализирайте променлива val за съхраняване на стойности на потенциометъра
байт val = 0;
Във функция на цикъла ще започнем предаването към i2c slave устройството (в този случай Цифров потенциометър IC), като посочим адреса на устройството, който е даден в листа с данни на IC.
невалиден цикъл () { Wire.beginTransmission (44); // предаване на устройство # 44 (0x2c)
Впоследствие байтове на опашка, т.е. данни, които искате да изпратите на IC за предаване с функцията write () .
Wire.write (байт (0x00)); // изпраща байт с инструкции Wire.write (val); // изпраща байт стойност на потенциометъра
След това ги предайте, като извикате endTransmission () .
Wire.endTransmission (); // спиране на предаването val ++; // увеличаване на стойността if (val == 64) {// ако е достигната 64-та позиция (max) val = 0; // започнем отначало от най-ниската стойност } закъснение (500); }