Скільки ліній звязку потрібно для зєднання двох пристроїв по шині I2CСкільки ліній звязку потрібно для зєднання двох пристроїв по шині I2C

0 Comment

Зміст:

Скільки ліній звязку потрібно для зєднання двох пристроїв по шині I2C

Віримо в перемогу ЗСУ!
Працюємо з 09:00 до 18:00 Пн-Сб Працюємо з 09:00 до 19:00 Пн-Пт –> Магазин у відпустці до 19.08.2023 –>

Давайте розберемося щодо найзручнішої комунікації фізично закладеної в контролери Arduino

I2C це послідовна асиметрична шина для зв’язку між інтегральними схемами всередині електронних приладів. Тобто даний протокол зв’язку був розроблений для внутрішнього зв’язку всередині коробки пристрою або щита. Перед ним не ставилось завдання передавати дані на великі відстані, тому ходить безліч міфів про максимальну дальність зв’язку – в когось погано працює вже при 50 см, в когось при 2 м.

На шині I2C можуть сидіти до 128 пристроїв. Адреси від 0 до 127.

В контролерах Arduino закладена фізична комунікація I2C, яка дозволяє по двох інформаційних дротах під’єднувати до них як різноманітні датчики, розширювачі дискретних входів-виходів, цифро-аналогові та аналого-цифрові перетворювачі, так і інші контролери.

Про швидкість передачі на сайті виробнику не пишуть. Але згідно загальної документації на протокол вона повинна складати як мінімум 100 кбіт/с

Тепер хотілося би протестувати на скільки дійсно працездатна шина I2C, та на скільки важко по ній обмінюватися даними між декількома контролерами Arduino

Я візьму три контролери Arduino Nano, об’єднаю їх шиною I2C, та розберуся, як по ній обмінюватися даними. Перший контролер буде виконувати роль ведучого, а інші два – роль веденого.

Для відображення даних буду використовувати LCD-індикатор 1602 з модулем I2C, який буде підключений на ту ж комунікаційну шину.

Ведучій контролер буде послідовно опитувати другого та третього контролера. Прийняті дані перший контролер повинний виводити на індикатор. Опитування ведених Arduino Nano буде проводитися з частотою 1 раз/сек.

Схема підключення

Чотири дроти від кожного з 4-х пристроїв потрібно з’єднати паралельно. Вивід А4 плати Arduino Nano – це шина SDA протоколу I2C, а А5 – це SCL.

Я буду використовувати монтажні шилди під контролери Nano для зручності з’єднань.

Живлення буде подаватися просто на один з контролерів через mini USB вхід.

В LCD адреса в мережі I2C за замовчанням 27. В другого контролера задамо адресу 2 та в третього 3. Ведучому першому контролеру адреса не потрібна.

Програма контролера – ведучого.

#include #include // Set the LCD address to 0x27 for a 16 chars and 2 line display LiquidCrystal_I2C lcd(0x27, 16, 2); int nano1=0; int nano2; int nano3; void setup() < Wire.begin(); Serial.begin(9600); // initialize the LCD lcd.begin(); // Turn on the blacklight and print a message. lcd.backlight(); >void loop() < lcd.setCursor(0, 0); lcd.print(nano1); Wire.requestFrom(2, 2); // request 6 bytes from slave device #8 int i=0;nano2=0; while (Wire.available()) < // slave may send less than requested byte c = Wire.read(); // receive a byte as character Serial.print(c); if (i==0) nano2 = ((c & 0xff) Serial.println(""); Serial.println(nano2); lcd.setCursor(9, 0); lcd.print(nano2); delay(100); Wire.requestFrom(3, 2); // request 6 bytes from slave device #8 i=0;nano3=0; while (Wire.available()) < // slave may send less than requested byte c = Wire.read(); // receive a byte as character Serial.print(c); if (i==0) nano3 = ((c & 0xff) lcd.setCursor(0, 1); lcd.print(nano3); delay(100); nano1++; delay(800); >

Перший контролер змінює свою змінну типу integer та виводить її значення на індикатор. Також він по-черзі опитує слейв з 2-ю та 3-ю адресою. Запитує в них два байти інформації та перетворює їх в змінну integer. В результаті в першому контролері крутяться три змінні з трьох Nano та він може вивести їх на індикатор.

Програма другого контролера

#include int nano2=0; byte high[2]; void setup() < Wire.begin(2); // join i2c bus with address #8 Wire.onRequest(requestEvent); // register event >void loop() < delay(1000); nano2--; >// function that executes whenever data is requested by master // this function is registered as an event, see setup() void requestEvent() < high[0] = (nano2 >> 8); high[1] = (nano2 & 0xff); Wire.write(high[0]); // respond with message of 2 bytes Wire.write(high[1]); >

Програма третього Arduino Nano

#include int nano2=0; byte high[2]; void setup() < Wire.begin(3); // join i2c bus with address #8 Wire.onRequest(requestEvent); // register event >void loop() < delay(1500); nano2--; >// function that executes whenever data is requested by master // this function is registered as an event, see setup() void requestEvent() < high[0] = (nano2 >> 8); high[1] = (nano2 & 0xff); Wire.write(high[0]); // respond with message of 2 bytes Wire.write(high[1]); >

Останні дві програми відрізняються просто адресою в функції Wire.begin(3); та частотою зміни змінної.

Ці програми постійно змінюють змінну integer та очікують запит від ведучого. При запиті ця змінна розкладається на два байти та відправляється у відповідь на запит ведучому контролеру.

Таким чином роботу зв’язку по I2C можна контролювати за змінюваними значеннями трьох змінних на рідкокристалічному індикаторі.

Висновки

Прекрасно все работает – цифры на дисплее меняются. Я попробовал удлиннять шлейф проводов между вторым и третьим контроллерами Arduino. Проверил работу шины связи при длине 3 м – без притензий. Длиннее не пробовал, но многие мне утверждали, что I2C не работает дальше 0,5 . 2 м и меня воодушевила длина 3 м.

Для себя я уже вижу, где применю такую связь именно между тремя Nano.

Я здесь ещё не попробовал передачу данных от мастера слейву. Если попробуете – отпишитесь.

Недостатков здесь на небольших расстояниях ощутимо меньше чем превосходств.

I2C Slave. Приклад для AVR мікроконтролера Atmega

I2C – послідовна шина даних для зв`язку інтегральних схем, що використовує дві двонаправлені лінії зв`язку (SDA і SCL). Використовується для з`єднання низькошвидкісних периферійних компонентів. Назва є абревіатурою слів Inter-Integrated Circuit. TWI (Two Wire Interface) або TWSI (Two Wire Serial Interface) по суті та ж сама шина I2C, але використовує іншу назву з ліцензійних причин. I2C використовує дві двонаправлені лінії, підтягнуті до напруги живлення і керовані через відкритий колектор або відкритий стік – послідовна лінія даних (SDA, англ. Serial DAta) і послідовна лінія тактування (SCL, англ. Serial CLock). Стандартні напруги живлення +5 В або +3,3 В.

Класична адресація включає 7-бітовий адресний простір з 16 зарезервованими адресами. Тобто 112 вільних адрес для підключення периферії на одну шину. Основний режим роботи – 100 Кбіт/с; 10 Кбіт/с в режимі роботи із зниженою швидкістю. Стандарт допускає призупинення тактування при роботі з повільними пристроями.

Після перегляду стандарту в 1992 році стало можливим підключення ще більшої кількості пристроїв на одну шину (за рахунок 10-бітної адресації), а також збільшилась швидкість до 400 Кбіт/с в швидкісному режимі. Відповідно, доступна кількість вільних вузлів зросла до 1008. Максимальна допустима кількість мікросхем, приєднаних до однієї шині, обмежується максимальною ємністю шини в 400 пФ. Версія стандарту 2.0 1998 року представила високошвидкісний режим роботи зі швидкістю до 3,4 Мбіт/с зі зниженим енергоспоживанням. Версія 2.1 2001 року внесла лише незначні доопрацювання.

Послідовність передачі даних

Стан СТАРТ і СТОП

Процедура обміну починається з того, що Master формує стан СТАРТ: генерує перехід сигналу лінії SDA з ВИСОКОГО стану в НИЗЬКИЙ при ВИСОКОМУ рівні на лінії SCL. Цей перехід сприймається усіма пристроями, підключеними до шини, як ознака початку процедури обміну. Генерація синхросигналу – це завжди обов`язок Master-а; кожен Master генерує свій власний сигнал синхронізації при пересиланні даних по шині. Процедура обміну завершується тим, що Master формує стан СТОП – перехід стану лінії SDA з НИЗЬКОГО стану в ВИСОКЕ при ВИСОКОМУ стані лінії SCL. Стан СТАРТ і СТОП завжди генеруються Master-ом. Вважається, що шина зайнята після фіксації стану СТАРТ. Шина вважається звільненою через деякий час після фіксації стану СТОП. При передачі даних по шині I2C кожен Master генерує свій синхросигнал на лінії SCL. Після формування стану СТАРТ, Master опускає стан лінії SCL в низький стан і виставляє на лінію SDA старший біт першого байта повідомлення. Кількість байт в повідомленні не обмежена. Специфікація шини I2C дозволяє зміни на лінії SDA тільки при низькому рівні сигналу на лінії SCL. Дані дійсні і повинні залишатися стабільними тільки під час ВИСОКОГО стану синхроімпульса. Для підтвердження прийому байта від Master-передавача приймачем в специфікації протоколу обміну по шині I2C вводиться спеціальний біт підтвердження, який виставляється на шину SDA після прийому 8 біта даних.

Підтвердження

Таким чином передача 8 біт даних від передавача до приймача завершуються додатковим циклом (формуванням 9-го тактового імпульсу лінії SCL), при якому приймач виставляє низький рівень сигналу на лінії SDA, як ознака успішного прийому байта. Підтвердження при передачі даних обов`язкове, крім випадків закінчення передачі Slave стороною. Відповідний імпульс синхронізації генерується Master-ом. Передавач відпускає (ВИСОКУ) лінію SDA на час синхроімпульсу підтвердження. Приймач повинен утримувати лінію SDA протягом ВИСОКОГО стану синхроімпульсу підтвердження в стабільному НИЗЬКОМУ стані. В тому випадку, коли приймач не може підтвердити свою адресу (наприклад, коли він виконує в даний момент будь-які функції реального часу), лінія даних повинна бути залишена в ВИСОКОМУ стані. Після цього Master може видати сигнал СТОП для переривання пересилання даних. Якщо в пересиланні бере участь Master-приймач, то він повинен повідомити про закінчення передачі Slave-передавача шляхом непідтвердження останнього байта. Slave-передавач повинен звільнити лінію даних для того, щоб дозволити Master-у видати сигнал СТОП або повторити сигнал СТАРТ.

Синхронізація

Синхронізація виконується з використанням підключення до лінії SCL за правилом монтажного “І”. Це означає, що Master не має монопольного права на управління переходом лінії SCL з НИЗЬКОГО стану в ВИСОКИЙ. В тому випадку, коли ведомому необхідний додатковий час на обробку прийнятого біта, він має можливість утримувати лінію SCL в низькому стані до моменту готовності до прийому наступного біта. Таким чином, лінія SCL перебуватиме в НИЗЬКОМУ стані протягом найдовшого НИЗЬКОЇ періоду синхросигналов. Пристрої з більш коротким НИЗКИМ періодом будуть входити в стан очікування на час, поки не скінчиться довгий період. Коли у всіх задіяних пристроїв скінчиться НИЗЬКИЙ період синхросигналу, лінія SCL перейде в ВИСОКИЙ стан. Всі пристрої почнуть проходити ВИСОКИЙ період своїх синхросигналов. Перший пристрій, у якого скінчиться цей період, знову встановить лінію SCL в низький стан. Таким чином, НИЗЬКИЙ період сінхролініі SCL визначається найдовшим періодом синхронізації з усіх задіяних пристроїв, а ВИСОКИЙ період визначається самим коротким періодом синхронізації пристроїв. Механізм синхронізації може бути використаний приймачами як засіб управління пересиланням даних на байтовому і битовом рівнях. На рівні байта, якщо пристрій може приймати байти даних з великою швидкістю, але вимагає певний час для збереження прийнятого байта або підготовки до прийому наступного, то воно може утримувати лінію SCL в НИЗЬКОМУ стані після прийому і підтвердження байта, переводячи таким чином передавач в стан очікування. На рівні бітів, пристрій, такий як мікроконтролер без вбудованих апаратних ліній I2C, може уповільнити частоту синхроімпульсів шляхом продовження їх НИЗЬКОГО періоду. Таким чином швидкість передачі будь-якого Master-а адаптується до швидкості повільного пристрою.

Адресація в шині I2C

Кожен пристрій, підключений до шини, може бути програмно адресовано за унікальною адресою. Для вибору приймача повідомлення Master-а використовує унікальну адресну компоненту в форматі посилки. При використанні однотипних пристроїв, інтегральні схеми часто мають додатковий селектор адреси, який може бути реалізований як у вигляді додаткових цифрових входів селектора адреси, так і у вигляді аналогового входу. При цьому адреси таких однотипних пристроїв виявляються рознесеними в адресному просторі пристроїв, підключених до шини. У звичайному режимі використовується 7-бітна адресація. Процедура адресації на шині I2C полягає в тому, що перший байт після сигналу СТАРТ визначає, який Slave адресується Master-ом для проведення циклу обміну. Виняток становить адреса «Спільного виклику», яка адресує всі пристрої на шині. Коли використовується ця адреса, всі пристрої в теорії повинні послати сигнал підтвердження. Однак, пристрої, які можуть обробляти «загальний виклик», на практиці зустрічаються рідко. Перші сім бітів першого байта утворюють адресу Slave-а. Восьмий, молодший біт, визначає напрямок пересилки даних. «Нуль» означає, що Master буде записувати інформацію в обраного Slave-а. «Одиниця» означає, що Master буде зчитувати інформацію зі Slave. Після того, як адреса відправлена, кожен пристрій в системі порівнює перші сім біт після сигналу СТАРТ зі своєю адресою. При збігу пристрій вважає себе обраним як Slave-приймач або як Slave-передавач, в залежності від біта напрямку. Адреса Slave може складатися з фіксованої і програмованої частини. Часто трапляється, що в системі буде кілька однотипних пристроїв (наприклад ІМС пам`яті, або драйверів світлодіодних індикаторів), тому за допомогою програмованої частини адреси стає можливим підключити до шини максимально можливу кількість таких пристроїв. Всі спеціалізовані ІМС, що підтримують роботу в стандарті шини I2C, мають набір фіксованих адрес, перелік яких зазначений виробником в описах контролерів. Комбінація біт 11110ХХ адреси зарезервована для 10-бітної адресації. Як випливає з специфікації шини, допускаються як прості формати обміну, так і комбіновані, коли в проміжку від стану СТАРТ до стану СТОП Master і Slave можуть виступати і як приймач, і як передавач даних. Комбіновані формати можуть бути використані, наприклад, для управління послідовної пам`яттю. Під час першого байта даних можна передавати адресу в пам`яті, який записується у внутрішній регістр-засувку. Після повторення сигналу старту і адреси Slave видаються дані з пам`яті. Всі рішення про авто-інкремент або декремент адреси, до якої стався попередній доступ, приймаються конструктором конкретного пристрою. Тому, в будь-якому випадку кращий спосіб уникнути неконтрольованої ситуації на шині перед використанням нової (або що раніше не використовуваної) ІМС слід ретельно вивчити її опис (datasheet або reference manual), отримавши його з сайту виробника.

Можливі проблеми

На сьогоднішній момент найбільш популярна швидкість використання I2C – 100 Кбіт/с та 400 Кбіт/с. Однак, треба розуміти, що використання на одній шині декількох пристроїв, які мають різні реалізації протоколу, та працюють на різних швідкостях може привести до непередбачених проблем. Найчастіше для забеспечення стабільної роботи доводиться обмежувати швидкість шини до швидкості самого повільного пристрою. Деякі пристрої, що працюють в режимі MASTER не підтримують призупинення тактування для повільних пристроїв (clock stretching). В результаті чого виникають помилки при роботі. В цьому випадку доводиться значно зменшувати швидкість шини або, якщо є така можливість, розносити швидкі і повільні пристрої по різним шинам.

Приклад реалізації I2C Slave на AVR мікроконтролері Atmega8

 #include #include #include #define I2CSLAVE_ADDR 0x4E #define PORT_DDR 0xB0 // PORTB Settings #define PORT_IN 0xB1 // Get PINB #define PORT_OUT 0xB2 // Set PORTB unsigned char regaddr; // Store the Requested Register Address unsigned char regdata; // Store the Register Address Data void i2c_slave_action(unsigned char rw_status) < switch(regaddr) < // PORT case PORT_DDR: if (rw_status == 0) // read regdata = DDRB; else // write DDRB = regdata; break; case PORT_IN: if (rw_status == 0) // read regdata = PINB; break; case PORT_OUT: if (rw_status == 1) // write PORTB = regdata; break; >> ISR(TWI_vect) < static unsigned char i2c_state; unsigned char twi_status; // Disable Global Interrupt cli(); // Get TWI Status Register, mask the prescaler bits (TWPS1,TWPS0) twi_status=TWSR & 0xF8; switch(twi_status) < case TW_SR_SLA_ACK: // 0x60: SLA+W received, ACK returned i2c_state=0; // Start I2C State for Register Address required break; case TW_SR_DATA_ACK: // 0x80: data received, ACK returned if (i2c_state == 0) < regaddr = TWDR; // Save data to the register address i2c_state = 1; >else < regdata = TWDR; // Save to the register data i2c_state = 2; >break; case TW_SR_STOP: // 0xA0: stop or repeated start condition received while selected if (i2c_state == 2) < i2c_slave_action(1); // Call Write I2C Action (rw_status = 1) i2c_state = 0; // Reset I2C State >break; case TW_ST_SLA_ACK: // 0xA8: SLA+R received, ACK returned case TW_ST_DATA_ACK: // 0xB8: data transmitted, ACK received if (i2c_state == 1) < i2c_slave_action(0); // Call Read I2C Action (rw_status = 0) TWDR = regdata; // Store data in TWDR register i2c_state = 0; // Reset I2C State >break; case TW_ST_DATA_NACK: // 0xC0: data transmitted, NACK received case TW_ST_LAST_DATA: // 0xC8: last data byte transmitted, ACK received case TW_BUS_ERROR: // 0x00: illegal start or stop condition default: i2c_state = 0; // Back to the Begining State > // Clear TWINT Flag TWCR |= (1 <int main(void) < // TWI Pull UP PORTC |= ((1<> 

Тактова частота мікроконтролера має бути не меншою за 8 MHz.

У цьому прикладі, звертаючись по шині I2C до пристрою за адресою зазначеною в рядку:

 #define I2CSLAVE_ADDR 0x4E 

можна керувати портом B мікроконтролера, використовуючи адреси:

#define PORT_DDR 0xB0 // PORTB Settings #define PORT_IN 0xB1 // Get PINB #define PORT_OUT 0xB2 // Set PORTB

Для програмування порту на вхід, слід записати 0x00 за адресою 0xB0. Для отримання стану входів порту B потрібно прочитати один байт за адресою 0xB1. Для програмування порту на вихід записати 0xFF за адресою 0xB0. Щоб встановити всі виходи порту в 1 треба записати 0xFF за адресою 0xB2.

Використовуючи цей приклад можна створювати свої специфічні I2C Slave пристрої на базі AVR мікроконтролерів. Наприклад, модулі сенсорів, дисплеїв, тощо, інтерфейс яких потрібно уніфікувати.

Наідлінішій - найдовший, та синхроипульс - синхроімпульс. Я звик до ассемблеру, з СІ в мене поки стосунки не склались. Але в мене викликає запитання ініціалізація інтерфейсу TWI в основній частині програми. Назви бітів і регістру для всієї серії однакова? Ато Атмел має звичку в нових серіях залишати адресу регістру ту саму а назву на пару літер змінювати.
Дякую, помилки виправив. Щодо ініціалізації TWI, і не тільки, краще заглядати у доку до контролера. Бо навіть у дуже схожих можуть бути розбіжності.

click fraud protection

I2C — це протокол зв’язку, який використовується для підключення пристроїв до плати мікроконтролера Arduino UNO. Протокол використовує спільну лінію передачі даних (SDA) і тактову лінію (SCL) для зв’язку. Вбудована бібліотека Wire в Arduino IDE дозволяє легко спілкуватися з пристроями I2C за допомогою функцій високого рівня та підтримує кілька шин I2C.

  • Що таке зв’язок I2C в Arduino
  • Виводи I2C в Arduino
  • Що таке I2C Wire Library
  • Підключення двох плат Arduino за допомогою I2C як головного та підлеглого
  • Схематичний
  • Головний код
  • Рабський кодекс
  • Вихід
  • Висновок

Що таке зв’язок I2C в Arduino

I2C (Міжінтегральна схема) є популярним протоколом для підключення мікроконтролерів до периферійних пристроїв, таких як датчики та дисплеї. Arduino UNO, широко використовувану плату мікроконтролера, можна налаштувати для зв’язку з іншими пристроями за допомогою протоколу зв’язку I2C.

Деякі основні моменти комунікації I2C включають:

Можливість Multi-Master і Multi-Slave: I2C підтримує кілька головних пристроїв і кілька підлеглих пристроїв на одній шині, дозволяючи обмінюватися даними між кількома пристроями одночасно.

Низька кількість пінів: I2C використовує лише дві лінії, SDA і SCL, для зв’язку, що зменшує кількість необхідних підключень і спрощує підключення.

Адресні пристрої: кожен пристрій I2C на шині має унікальну адресу, що дозволяє легко ідентифікувати та спілкуватися з певними пристроями.

Висока швидкість: I2C підтримує високу швидкість передачі даних до 3,4 Мбіт/с, що робить його придатним для високошвидкісних програм передачі даних.

Енергозбереження: I2C забезпечує зв’язок між пристроями з низьким енергоспоживанням, дозволяючи пристроям перемикатися в режими низького споживання, коли зв’язок не здійснюється, і виходити з режиму сну за запитом.

Виводи I2C в Arduino

У зв’язку I2C використовуються дві лінії:

  • Лінія даних (ПДР): Лінія даних для обміну даними між головним і підлеглим пристроями.
  • Лінія годинника (SCL): лінія годинника для синхронізації зв’язку I2C між пристроями.

Ведучий Arduino контролює тактову лінію I2C і починає зв’язок з периферійними пристроями, тоді як підлеглі пристрої відповідають на запити головного.

У таблиці нижче ви знайдете розпіновку інтерфейсу I2C на різних платах Arduino:

дошкаВиводи I2C
Arduino NanoПДР-А4 | SCL-A5
Arduino MegaПДР-А4 | SCL-A5 і SDA-20 | SCL-21
Ардуіно ЛеонардоПДР-А4 | SCL-A5
Arduino UnoПДР-А4 | SCL-A5
Arduino MicroПДР-02 | SCL-03*

*Виводи I2C можуть відрізнятися залежно від версії плати, яку ви використовуєте. Для отримання додаткової інформації перегляньте відповідну таблицю даних.

Що таке I2C Wire Library

I2C Wire Library попередньо інстальовано в середовищі IDE, яка створює зв’язок між пристроями I2C. Бібліотека містить функції для налаштування та зв’язку на шині I2C, включаючи функції для ініціалізація шини як головного або підлеглого пристрою, надсилання та отримання даних і керування годинником швидкість.

Бібліотека полегшує спілкування з пристроями I2C, абстрагуючись від низькорівневих деталей протоколу I2C і надаючи прості функції високого рівня, які можна використовувати в ескізах Arduino. Наприклад, почати() функція використовується для ініціалізації шини I2C як головного або підлеглого пристрою

Бібліотека також підтримує використання кількох шин I2C, що дозволяє одночасно спілкуватися з кількома пристроями. Якщо ви маєте справу з кількома датчиками або дисплеями для проекту, це корисно.

Підключення двох плат Arduino за допомогою I2C як головного та підлеглого

Щоб встановити зв’язок I2C між двома платами Arduino UNO, контакти SDA та SCL обох плат повинні бути з’єднані разом і мати спільну землю. Зв’язок може бути досягнутий за допомогою вбудованої бібліотеки Wire в Arduino, яка містить функції для конфігурації та зв’язку по шині I2C.

Схематичний

На зображенні нижче показано дві плати Arduino Uno, підключені в конфігурації Master-Slave:

Головний код

Завантажте наведений нижче код на плату Master Arduino:

#включати /*Бібліотека проводів для зв’язку I2C*/
int x = 0 ; /* Ініціалізація змінної для збереження номера */
недійсне налаштування ( ) <
/* Запустіть шину I2C як майстер */
Wire.begin ( ) ;
>
порожня петля ( ) <
/* Адреса I2C BUS є встановити як 9 для Підлеглий пристрій */
Wire.beginTransmission ( 9 ) ;
Провід.писати ( x ) ; /* надсилає х */
Wire.endTransmission ( ) ; /* припинити передачу */
x++; /* Приріст х */
якщо ( x > 5 ) х = 0 ; /* скинути x, як тільки він отримає 6 */
затримка ( 1000 ) ;
>

Код, запущений, включає бібліотеку I2C Master. Ініціалізується змінна, яка зберігатиме цілі значення, починаючи з 0 до 5. Адреса I2C для підлеглого пристрою визначається як 9. Використання функції бібліотеки Wire

На головній дошці почати() функція ініціалізує шину I2C як головний пристрій

Після того, як плати налаштовані, вони можуть спілкуватися одна з одною через шину I2C. Головний Arduino запитує дані від підлеглої плати Arduino, і підлеглий може відповісти запитуваними даними.

Рабський кодекс

Завантажте наведений нижче код на плату Slave Arduino, до якої підключено світлодіод:

#включати
int LED = 13 ; /* Світлодіодний штифт для вихід */
int x = 0 ; /* змінна для отримання значення від Master Arduino */
недійсне налаштування ( ) <
pinMode ( LED, ВИХІД ) ; /* Світлодіодний штифт встановити як вихід */
Wire.begin ( 9 ) ; /* Підлеглий пристрій I2C буде читати дані від Майстра за адресою #9*/

Wire.onReceive ( receiveEvent ) ; /* Додайте a функція запускати, коли щось отримано */
>
void receiveEvent ( int байт ) <
x = Wire.read ( ) ; /* читати один персонаж з I2C Master */
>
порожня петля ( ) <
/* Якщо отримане значення є 0 блимає світлодіод для 200 РС */
якщо ( х == 0 ) <
digitalWrite ( LED, HIGH ) ;
затримка ( 200 ) ;
digitalWrite ( LED, LOW ) ;
затримка ( 200 ) ;
>
/* Якщо отримане значення є 3 блимає світлодіод для 400 РС */
якщо ( х == 3 ) <
digitalWrite ( LED, HIGH ) ;
затримка ( 400 ) ;
digitalWrite ( LED, LOW ) ;
затримка ( 400 ) ;
>
>

Код почався з включення бібліотеки Wire, а потім ми встановили вбудований світлодіод на контакті 13 Slave Arduino як вихід. Далі змінна x визначено, що отримуватиме дані від Master Arduino. Використовуючи це ціле значення, ми будемо блимати світлодіодом на певному символі після його отримання.

в цикл(), отриманий символ потім перетворюється на різну швидкість миготіння світлодіода залежно від отриманого символу. Якщо використовується умова, коли отриманий символ від головного пристрою дорівнює 0, світлодіод блимає з 200 мс, а якщо отриманий символ IS 3, світлодіод блимає із затримкою 400 мс.

У випадку будь-яких інших символів світлодіодний індикатор буде ВИМКНЕНО.

Вихід

На виході ми бачимо, що світлодіод, підключений до Slave Arduino, блимає кожного разу, коли Master надсилає символ 0 або 3.

Висновок

Зв’язок I2C дозволяє кільком пристроям спілкуватися один з одним за допомогою загальної шини. Плати Arduino можна налаштувати для обміну даними одна з одною за допомогою I2C, підключивши контакти SDA та SCL і налаштувавши плати як головну та підлеглу за допомогою бібліотеки Wire в Arduino. Таким чином, використання I2C зв’язку з декількома пристроями в рамках проекту є простішим і ефективнішим.