- Що таке протокол зв'язку I2C?
- Як працює I2C-зв'язок?
- Де використовувати зв’язок I2C?
- I2C на Nuvoton N76E003 - Вимога до обладнання
- Взаємодія AT24LC64 з Nuvoton N76E003 - принципова схема
- I2C-шпильки на Nuvoton N76E003
- Зв'язок I2C у N76E003
- Програмування N76E003 для зв'язку I2C
- Прошивання коду та вихідних даних
У великій системі вбудованих додатків жоден мікроконтролер не може виконувати всі дії самостійно. На певному етапі часу він повинен зв’язуватися з іншими пристроями для обміну інформацією, існує багато різних типів протоколів зв’язку для обміну цією інформацією, але найбільш використовуваними є USART, IIC, SPI та CAN. Кожен протокол зв'язку має свої переваги та недоліки. Поки зосередимося на частині IIC, оскільки саме про це ми будемо вчитися в цьому посібнику. Якщо ви тут новачок, ознайомтесь із навчальними посібниками Nuvoton, де ми обговорили всі периферійні пристрої мікроконтролера N76E003, починаючи з самого базового навчального посібника. Якщо ви хочете дізнатись, як використовувати I2C з іншими мікроконтролерами, ви можете переглянути посилання нижче.
- Як використовувати I2C в Arduino: Зв'язок між двома платами Arduino
- Зв'язок I2C з мікроконтролером PIC16F877
- Зв'язок РК-дисплея 16X2 з ESP32 за допомогою I2C
- Зв'язок I2C з пусковою панеллю MSP430
- Зв'язок РК з NodeMCU без використання I2C
- Як обробляти багато комунікацій (I2C SPI UART) в одній програмі Arduino
I2C - це важливий комунікаційний протокол, розроблений Philips (нині NXP). Використовуючи цей протокол I2C, MCU можна підключити до декількох пристроїв та розпочати зв’язок. I2C працює лише з двома проводами, а саме SDA і SCL. Там, де SDA означає «Серійні дані», а SCL - «Серійний годинник». Однак для цих двох висновків потрібні підтягувальні резистори до рівня напруги VCC, і, маючи адекватний підтягуючий резистор, шина може підтримувати 127 пристроїв з унікальною адресою.
Що таке протокол зв'язку I2C?
Термін IIC розшифровується як “ Інтегральні мікросхеми ”. Зазвичай це позначається як I2C, або я в квадраті C, або навіть як 2-провідний інтерфейсний протокол (TWI) в деяких місцях, але все це означає одне і те ж. I2C - це протокол синхронного зв'язку, що означає, що обидва пристрої, які обмінюються інформацією, повинні мати спільний тактовий сигнал. Він має лише два дроти для обміну інформацією, з яких один використовується для тактового сигналу, а інший - для надсилання та отримання даних.
Як працює I2C-зв'язок?
Вперше зв'язок I2C був представлений Філіпсом. Як було сказано раніше, він має два дроти, ці два дроти будуть з'єднані між собою двома пристроями. Тут один пристрій називається ведучим, а інший пристрій - веденим. Спілкування повинно і завжди відбуватиметься між двома, Господарем і Рабом. Перевага зв'язку I2C полягає в тому, що до ведучого може бути підключено більше одного веденого пристрою.
Повна комунікація відбувається за допомогою цих двох проводів, а саме: послідовного годинника (SCL) та послідовних даних (SDA).
Серійний годинник (SCL): Поділяє тактовий сигнал, сформований ведучим, із веденим пристроєм
Серійні дані (SDA): Надсилає дані до головного та веденого пристроїв та назад.
У будь-який момент часу лише майстер зможе ініціювати спілкування. Оскільки в шині більше одного веденого, ведучий повинен посилатися на кожного веденого, використовуючи іншу адресу. У разі звернення лише заступник з цією конкретною адресою відповість з інформацією, а інші мовчать. Таким чином, ми можемо використовувати одну і ту ж шину для зв'язку з кількома пристроями.
Де використовувати зв’язок I2C?
Зв'язок I2C використовується лише для зв'язку на короткі відстані. Це, безумовно, надійно до певної міри, оскільки він має синхронізований тактовий імпульс, щоб зробити його розумним. Цей протокол в основному використовується для зв'язку з датчиком або іншими пристроями, які повинні надсилати інформацію майстру. Дуже зручно, коли мікроконтролер повинен взаємодіяти з багатьма іншими підлеглими модулями, використовуючи мінімум лише дроти. Якщо ви шукаєте зв'язку на великі відстані, спробуйте RS232, а якщо ви хочете отримати більш надійний зв’язок, спробуйте протокол SPI.
I2C на Nuvoton N76E003 - Вимога до обладнання
Оскільки вимога цього проекту полягає у вивченні зв'язку I2C за допомогою N76E003, ми будемо використовувати EEPROM, який буде підключений до лінії передачі даних I2C. Ми збережемо деякі дані в EEPROM, а також прочитаємо їх і відобразимо на екрані UART.
Оскільки збережене значення буде надруковано в UART, потрібен будь-який перетворювач USB в UART. Ви також можете ознайомитися з підручником з UART з Nuvoton, якщо ви новачок у спілкуванні UART на N76E003. Для нашого додатку ми використовуватимемо перетворювач CP2102 UART на USB. Окрім вищезазначеного, нам також потрібні наступні компоненти -
- EEPROM 24C02
- 2шт 4.7k резистори
Не кажучи вже про те, що, крім вищезазначених компонентів, нам потрібна плата розробки на основі мікроконтролера N76E003, а також програміст Nu-Link. Крім того, для підключення всіх компонентів також потрібні макетні та підключувальні дроти.
Взаємодія AT24LC64 з Nuvoton N76E003 - принципова схема
Як ми бачимо на схемі нижче, EEPROM підключений до лінії I2C разом з двома підтягуючими резисторами. У крайньому лівому куті показано підключення інтерфейсу програмування.
Я використав макетну плату для мікросхеми AT24LC64 і підключив мікросхему до моєї плати програміста nuvoton за допомогою перемичок. Налаштування мого обладнання разом із програмістом nu-ink показано нижче.
I2C-шпильки на Nuvoton N76E003
Схему контактів N76E003 можна побачити на зображенні нижче -
Як ми бачимо, кожен штифт має різні технічні характеристики, і кожен штифт може використовуватися для різних цілей. Однак контакт 1.4 використовується як I2C SDA, він втратить ШІМ та інші функції. Але це не проблема, оскільки для цього проекту не потрібна інша функціональність. Те ж саме відбудеться для P1.3 - це вивід SCL I2C.
Оскільки висновки I2C діють як GPIO, його потрібно налаштувати. Усі штифти GPIO можна налаштувати в описаному нижче режимі.
Відповідно до таблиці даних, PxM1.n та PxM2. n - два регістри, які використовуються для визначення керуючої роботи порту вводу-виводу. У таблиці зазначено, що для використання функціональності I2C режими вводу-виводу повинні використовуватися як відкритий злив для зв'язку, пов'язаної з I2C.
Зв'язок I2C у N76E003
Периферійний пристрій I2C - важлива річ для будь-якого мікроконтролера, який підтримує функції I2C. Багато типів різних мікроконтролерів постачаються із вбудованою периферією I2C. Однак у деяких випадках I2C можна налаштувати вручну за допомогою програмного управління, де апаратна підтримка, пов'язана з I2C, недоступна (наприклад, багато мікроконтролерів 8051). Однак nuvoton N76E003 постачається з периферійною підтримкою I2C.
M76E003 підтримує чотири типи операцій в режимах I2C - головний передавач, головний приймач, підлеглий передавач та підлеглий приймач. Він також підтримує стандартні (100 кбіт / с) і швидкі (до 400 кбіт / с) швидкості для лінії I2C. I2C працює з кількома загальними правилами в сигнальних лініях SCL та SDA.
Умова запуску та зупинки:
Це важлива річ у спілкуванні I2C. Коли дані передаються в лінію I2C, вони починаються з умови start і закінчуються умовою stop.
Умовою запуску є перехід від низького до нижчого на SDA, коли лінія SCL висока, а умовою зупинки є перехід від низького до високого на SDA, коли лінія SCL висока. Ці дві умови генеруються ведучим (MCU або що-небудь, що керує іншими підлеглими пристроями). Шина залишається зайнятою в цьому стані, коли ініціюється умова запуску, і знову залишається вільною, коли ініціюється умова зупинки.
Умова запуску та зупинки чудово показана в перспективі сигналу в таблиці даних N76E003 -
7-розрядна адреса з форматом даних:
N76E003 підтримує 7-розрядний формат адреси та даних. Після запуску умови запуску головний пристрій повинен надіслати дані на лінію I2C. Перші дані є важливими. Якщо ці дані неправильно створені або передані, підключений пристрій не буде ідентифіковано, і подальший зв'язок неможливий.
Дані складаються з 7-бітової веденої адреси, позначеної як SLA. Ця 7-бітна довга адреса повинна бути унікальною для кожного пристрою, якщо на шині підключено кілька пристроїв. Після 7-бітової адреси 8-м бітом є біт напрямку даних. Це означає, що залежно від 8-го біта ведучий надсилає інформацію на підлеглий пристрій про те, чи будуть дані записані в підлеглий пристрій, або дані будуть зчитуватися з підлеглого пристрою. 8-й біт - це R / W біт, який називається сповіщувачем про читання або запис. Як ми всі знаємо, 8-бітна інформація може бути 128 типів, підтримуючи таким чином 128 пристроїв, але I2C підтримує 127 типів пристроїв на одній шині, але не 128. Оскільки адреса 0x00 - це зарезервована адреса, яка називається загальною адресою виклику. Якщо майстер хоче надіслати інформацію на всі пристрої,він буде адресований 0x00, і кожен пристрій буде відтворюватися таким же чином, як відповідно до окремих конфігурацій програмного забезпечення.
Таким чином, передача даних виглядає нижче
Визнання:
На наведеному вище зображенні адреси даних 9-й біт, за яким слідує біт R / W, називається бітом підтвердження. Це важливо, оскільки за допомогою цього біта ведучий або ведений реагує на передавач даних, витягуючи лінію SDA низько. Щоб отримати біт підтвердження, передавач повинен звільнити лінію SDA.
Програмування N76E003 для зв'язку I2C
Повну програму, яка використовується в цьому посібнику, можна знайти внизу цієї сторінки. Пояснення важливих сегментів коду є наступним:
Встановіть шпильки як відкритий злив і налаштуйте їх для I2C:
Почнемо спочатку з розділу штифтів I2C. Як описано раніше, порти SC2 і SDA I2C потрібно налаштувати та встановити як конфігурацію з відкритим зливом. Для цього ми використовуємо файл заголовка I2C.h разом з вихідним файлом I2C.c . Фрагмент коду виглядає так -
do {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} в той час як (0)
Наведений вище код встановлює P13 і P14 як штифт з відкритим зливом, а clr_I2CPX використовується для вибору P13 і P14 як штифт SCL на P1.3 та SDA на P1.4.
Цей I2CPX є 0-м бітом контрольного регістру I2C I2CON. Якщо для цього I2C_PX встановлено значення 1, висновки змінюються на P0.2 як SCL та P1.6 як SDA. Однак ми будемо використовувати P13 та P14. Тут не використовуються альтернативні шпильки.
Реєстр керування I2C I2CON:
Регістр управління I2C I2CON використовується для управління операціями I2C. Перший біт - це біт вибору виводу I2C. Якщо встановити значення 0, I2C виводиться як P13 та P14.
Біт AA - це прапор підтвердження підтвердження, якщо встановлений прапор AA, ACK повертається під час імпульсу тактового сигналу підтвердження лінії SCL. Якщо він очищений, під час підтвердженого тактового імпульсу лінії SCL буде повернуто NACK (високий рівень на SDA).
Наступний біт - SI, який є перериванням стану I2C. Якщо ввімкнено переривання стану I2C, користувач повинен перевірити реєстр I2STAT, щоб визначити, який крок пройдено, і вжити заходів.
STO - це прапор STOP, який встановлюється в основному режимі. STO автоматично очищається апаратним забезпеченням після виявлення стану STOP .
Наступний біт - це біт STA. Якщо встановлений цей прапорець, I2C генерує умову START, якщо шина вільна. Якщо шина зайнята, I2C очікує на стан STOP і генерує наступний стан START. Якщо STA встановлено, коли I2C вже перебуває в головному режимі, і один або кілька байтів передані або отримані, I2C генерує повторний стан START. Програмне забезпечення має очищати STA вручну.
Останній, I2CEN - біт увімкнення або вимкнення шини I2C.
EEPROM 24C02:
Тепер, підійшовши до 24C02. Пакет підтримки плати N76E003 має код I2C для 24LC64 і може бути легко змінений. Однак ми будемо використовувати простий метод для розуміння функції I2C.
Якщо хтось хоче використовувати детальну взаємодію з EEPROM 24C02, тоді можна використовувати програму EEPROM в BSP.
Ми підключимо лише 24C02 в I2C, де N76E003 буде головним, а EEPROM буде веденим. Таким чином, ми запишемо будь-які дані на адресу EEPROM і прочитаємо те саме.
24C02 EEPROM-розпилювання показано нижче -
A0, A1 і A2 - це три висновки для вибору адреси. Штифти WP - це шпильки захисту від запису, і їх потрібно підключити до VSS, щоб забезпечити можливість запису в EEPROM.
Функція запису байтів показана на зображенні нижче -
Повний цикл запису відбувається зі стартовим бітом. Після цього потрібно подати контрольний байт. У контрольному байті потрібні такі речі:
Після початкового біта складається з веденої адреси. 1010 - статичний, а A0, A1 і A2 - адреса, заснована на апаратному підключенні. Якщо три штирі з'єднані з живленням GND або VSS, це буде читатися як 0. В іншому випадку, якщо підключено до VCC, воно буде читатися як 1. У нашому випадку всі A0, A1 і A2 підключені до VSS. Таким чином, все це буде 0.
Витрати на умови читання або запису. Значення адреси з бітом читання або запису буде - 0xA0 для запису та 0xA1 для читання. Далі - біт підтвердження, після чого буде передано 8-бітову адресу, де потрібно зберігати дані і, нарешті, дані, які зберігатимуться у відповідному місці. Ці дії виконуються у покроковому форматі в основній функції.
Основна функція та цикл роботи:
void main (void) {char c = 0x00; InitialUART0_Timer3 (115200); ТІ = 1; // Важливо, використовувати функцію prinft потрібно встановити TI = 1; I2C_init (); while (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n Зчитане значення становить% x", c & 0xff); }; }
Основна функція проста, вона постійно записує значення в EEPROM в адресу 1 і зчитує дані. Далі дані друкуються за допомогою функції printf. Printf друкує значення у шістнадцятковій формі.
Функція запису EEPROM складається з наступних речей, які були описані в розділі EEPROM-
void EEPROM_write (непідписана адреса символу, непідписане значення символу) {I2C_start (); I2C_write (0xA0); I2C_write (адреса); I2C_write (значення); I2C_stop (); }
Функція запуску I2C складається з наступних речей -
void I2C_start (void) {підписано int time = timeout; set_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
У цій функції статус SI перевіряється разом із заздалегідь визначеним періодом очікування (визначеним у I2C.h, де заданий час встановлений як 1000). Функція запуску починається з встановлення STA та очищення SI.
void I2C_stop (void) {підписано int time = timeout; clr_SI; set_STO; while ((STO == 1) && (time> 0)) {time--; }; }
Як і функція "Пуск, зупинка". Функція зупинки ініціюється шляхом налаштування STO з подальшим очищенням SI. Нижче наведено функцію зчитування I2C -
непідписаний char I2C_read (непідписаний char ack_mode) {підписаний int time = timeout; значення без знака без знака = 0x00; set_AA; clr_SI; while ((SI == 0) && (t> 0)) {time--; }; значення = I2DAT; if (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; while ((SI == 0) && (t> 0)) {time--; }; } повернене значення; }
Режим ack_mode та I2C_NACK обидва визначаються у файлі заголовка I2C як 0 та 1 відповідно.
Аналогічно створюється функція запису -
void I2C_write (значення без підпису char) {підписаний int time = timeout; I2DAT = значення; clr_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
Прошивання коду та вихідних даних
Код повернув 0 попереджень та 0 помилок і був прошитий за допомогою методу прошивки за замовчуванням Keil. Якщо ви новачок, ознайомтеся з початком роботи з підручником nuvoton, щоб зрозуміти, як завантажувати код. Інформацію про компіляцію коду можна знайти нижче.
Збірка цілі 'I2C_EEPROM' компіляція I2C_EEPROM.c… компіляція I2C.c… зв'язування… Розмір програми: data = 59,2 xdata = 0 code = 2409 створення шістнадцяткового файлу з ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 Помилка (и), 0 Попередження (и). Час побудови минув: 00:00:04 Підсумок пакетної збірки: 1 виконано, 0 не вдалося, 0 пропущено - Час минув: 00:00:04
Обладнання встановлюється на макеті і працює, як очікувалося. Як ви можете бачити на зображенні нижче, нам вдалося записати значення на EEPROM і зчитати його назад із пам'яті та відобразити на послідовному моніторі.
Перегляньте відео, подане нижче, для повної демонстрації роботи плати для цього коду. Сподіваюся, вам сподобався підручник і ви дізнались щось корисне, якщо у вас виникли запитання, залиште їх у розділі коментарів нижче. Ви також можете використовувати наші форуми для розміщення інших технічних питань.