- Що таке протокол зв'язку I2C?
- Як працює I2C Communication?
- Де використовувати зв'язок I2C?
- I2C в MSP430: управління цифровим потенціометром AD5171
MSP430 - це потужна платформа, яку Texas Instruments надає для вбудованих проектів; її універсальність дозволила знайти шляхи для багатьох застосувань, і фаза все ще триває. Якщо ви дотримувались наших підручників з MSP430, то ви б помітили, що ми вже охопили широкий спектр підручників з цього мікроконтролера, починаючи з самих основ. Відтепер ми розглянули основи, за якими ми можемо потрапити в такі цікаві речі, як комунікаційний портал.
У великій системі вбудованих програм жоден мікроконтролер не може виконувати всі дії самостійно. На певному етапі часу йому доводиться спілкуватися з іншими пристроями для обміну інформацією, існує багато різних типів протоколів зв'язку для обміну цією інформацією, але найбільш використовуваними є USART, IIC, SPI та CAN. Кожен протокол зв'язку має свої переваги та недоліки. Поки зосередимося на частині I2C, оскільки саме про це ми будемо вчитися в цьому посібнику.
Що таке протокол зв'язку I2C?
Термін IIC розшифровується як “ Інтегральні мікросхеми ”. Зазвичай це позначається як I2C, або я в квадраті C, або навіть як 2-провідний інтерфейсний протокол (TWI) в деяких місцях, але все це означає одне і те ж. I2C - це протокол синхронного зв'язку, що означає, що обидва пристрої, які обмінюються інформацією, повинні мати спільний тактовий сигнал. Він має лише два дроти для обміну інформацією, з яких один використовується для сигналу крана, а інший - для передачі та прийому даних.
Як працює I2C Communication?
Вперше зв'язок I2C був представлений Філіпсом. Як вже було сказано раніше, він має два дроти, ці два дроти будуть з'єднані між собою двома пристроями. Тут один пристрій називається ведучим, а інший пристрій - веденим. Спілкування повинно і завжди відбуватиметься між двома Володарем і Рабом. Перевага зв'язку I2C полягає в тому, що до ведучого може бути підключено більше одного веденого пристрою.
Повна комунікація відбувається за допомогою цих двох проводів, а саме: послідовного годинника (SCL) та послідовних даних (SDA).
Серійний годинник (SCL): Поділяє тактовий сигнал, сформований ведучим, із веденим пристроєм
Серійні дані (SDA): Надсилає дані до головного та веденого пристроїв та назад.
У будь-який момент часу тільки майстер зможе ініціювати спілкування. Оскільки в шині більше одного веденого, ведучий повинен посилатися на кожного веденого, використовуючи іншу адресу. При зверненні лише ведений з цією конкретною адресою відповість з інформацією, поки інші продовжують виходити. Таким чином ми можемо використовувати одну і ту ж шину для зв'язку з кількома пристроями.
На рівнях напруги I2C не призначені. Зв'язок I2C є гнучким, означає пристрій, який живиться від напруги 5 В, може використовувати 5 В для I2C, а пристрої 3,3 В можуть використовувати 3 В для зв'язку I2C. Але що, якщо два пристрої, що працюють на різній напрузі, потребують зв’язку за допомогою I2C? Шина I2C 5V не може бути пов'язана з 3.3V пристрої. У цьому випадку регулятори напруги використовуються для узгодження рівнів напруги між двома шинами I2C.
Існує певний набір умов, які визначають транзакцію. Ініціалізація передачі починається з падаючого краю SDA, який визначається як умова «СТАРТ» на діаграмі нижче, де ведучий залишає 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 в IDE Energia, нам потрібно просто включити файл заголовка wire.h. Декларація контактів (SDA та SCL) знаходиться всередині дротової бібліотеки, тому нам не потрібно оголошувати у функції налаштування .
Зразки прикладів можна знайти в меню Приклад IDE. Один із прикладів пояснюється нижче:
Цей приклад показує, як керувати цифровим потенціометром Analog Devices AD5171, який здійснює зв’язок через синхронний послідовний протокол I2C. Використовуючи бібліотеку проводів I2C від MSP, цифровий банк пройде через 64 рівні опору, згасаючи світлодіод.
По-перше, ми включимо бібліотеку, відповідальну за зв'язок i2c, тобто дротову бібліотеку
#включати
У функції налаштування ми ініціюємо бібліотеку проводів за допомогою функції .begin () .
void setup () { Wire.begin (); }
Потім ініціалізуйте змінну val для зберігання значень потенціометра
байт val = 0;
У функції циклу ми розпочнемо передачу на підпорядкований пристрій i2c (у цьому випадку цифровий потенціометр IC), вказавши адресу пристрою, яка вказана в таблиці даних ІС.
порожній цикл () { Wire.beginTransmission (44); // передача на пристрій №44 (0x2c)
Згодом байти в черзі, тобто дані, які ви хочете надіслати на мікросхему для передачі за допомогою функції write () .
Wire.write (байт (0x00)); // посилає байт інструкції Wire.write (val); // посилає байт значення потенціометра
Потім передайте їх, викликавши endTransmission () .
Wire.endTransmission (); // припинити передачу val ++; // збільшуємо значення if (val == 64) {// якщо досягли 64-ї позиції (max) val = 0; // починаємо спочатку з найменшого значення } затримка (500); }