I2CHUB_V1 – застосування поділювача інтерфейсів на шині I2C

Опис задачі


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

Рис. Приклад різноманітних модулів з шиною I2C

Більшість мікроконтролерів (MCU) є мініатюрними пристроями і має дуже обмежений бюджет вільних портів вводу/виводу. Зазвичай на контролерах типу Arduino / ESP8266 / ESP32 / STM32 під шину I2C (навіть якщо їх передбачено дві) у реальності можливо зарезервувати лише один інтерфейс: два порти GPIO під сигнальні канали SDA та SCL.

Причин цьому щонайменше дві.

По-перше, GPIO порти – це коштовний ресурс на головному контролері. Вони задіяні під інші, не менш важливі зовнішні інтерфейси : UART, SPI, Deep Sleep Wakeup, входи під кнопки, виходи під актюатор(и),тощо.

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

Примітка. Також всі ми знаємо, що послідовну шину I2C може бути реалізовано не лише апаратно, з фіксованими портами вводу-виводу MCU, але і програмно, коли сигнальні лінії шини можуть бути призначені на будь-які порти GPIO MCU. Ба більше, програмна реалізація шини дозволяє об’явити декілька програмних шин I2C з різними Bus_ID.

Рис. Апаратна та програмна реалізації шини I2C головного контролера

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


Вирішення задачі

Для вирішення проблеми одного порту I2C на MCU найчастіше вдаються до застосування апаратного поділювача інтерфейсів шини I2C. Це пасивний хаб, який розгалужує один наявний інтерфейс I2C у необхідну кількість таких самих інтерфейсів.

На ринку є безліч подібних пристроїв, та ми наведемо приклади на пристрої власного виробництва – I2CHUB_V1, має 6 портів I2C: 3 x JST HX2.54, 3 x Dupont і два виділені порти живлення.

Рис. Модуль поділювача інтерфейсів I2CHUB_V1 як приклад

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

Рис. Приклад підключення специфічних модулів сенсорів з двома роз’ємами I2C

“Вхідний” інтерфейс кожного такого модуля підключається до MCU або попереднього модуля сенсора на шині, а “вихідний” інтерфейс дозволяє каскадом підключити наступний модуль. Деякі виробники передбачають по два інтерфейси шини I2C саме з цією метою. Але, нажаль, більшість модулів не оснащено такими можливостями. Тому розглядаємо I2C HUB як більш поширений і універсальний підхід. Нижче наводимо основні схеми підключення модулів із застосуванням поділювача / хаба.

Примітка. Коли зростає кількість з’єднань, степеневим чином зростає:
– кількість точок відмови (PoF, Point of Failure);
– ризик людської помилки під час виконання з’єднань сигналів інтерфейсу.

З міркувань захисту обладнання від виходу з ладу та помилок монтажу, з метою підвищення загальної надійності системи, радимо:

  • якомога частіше застосовувати роз’єми з ключем;
  • застосовувати модулі з взаємно сумісними електричними інтерфейсами та фізичними роз’ємами.

Не дивлячись на те, що ми рекомендуємо застосовувати за можливості роз’єми з ключем, ми намагаємося рахуватися з реаліями ринку електронних компонентів та враховувати потреби споживачів. І тому ми наділили поділювач I2CHUB_V1 можливістю виступати у якості конвертора типу роз’ємів з JST на Dupont і навпаки – з Dupont на JST.


Вважаємо це дуже корисною функцією, адже завдяки можливості вільно розвертати інтерфейсні кабелі JST – Dupont відповідним боком користувач може підключити до хаба практично будь-який існуючий на ринку модуль з інтерфейсом I2C. Також користувач може вільно використовувати власні штирьові кабелі Dupont – Dupont.
Для опції “Замовлення з кабелями” в модулі I2CHUB_V1 роз’єми завжди встановлюються за однаковою схемою: половина роз’ємів – 2.54 мм JST (з ключем), інша половина – штирьові роз’єми Dupont. Це робиться саме для забезпечення згаданої вище гнучкості взаємного підключення різноманітних I2C-модулів.


Схеми модульного підключення до поділювача інтерфейсів

Зірка


Найпоширеніша схема, коли всі модулі інтерфейсами I2C підключаються у поділювач. Назвемо її “Зірка”.

Рис. Приклад підключення типу “Зірка”

Каскадування


Наступна топологія є каскадом двох і більше “Зірок”. Назвемо її “Каскадування”.

Рис. Приклад підключення типу “Каскадування”

Оскільки один з портів поділювача інтерфейсів завжди задіяно як “вхід”, то в деяких ситуаціях може виникнути нестача вільних портів поділювача. Саме в цьому випадку застосовується каскадування поділювачів у необхідній кількості таким чином, щоб забезпечити бажану кількість інтерфейсних портів на шині I2C.

Наприклад, I2CHUB_V1 виробництва IoT-devices має 6 портів I2C. Якщо в проекті, за задумом, необхідно підключати до MCU більше 5 підпорядкованих пристроїв, то можливо застосувати каскадування двох поділювачів і розподілити між їх інтерфейсами відповідні підпорядковані пристрої.


Довга лінія


Остання можлива схема впровадження, яку варто навести у даній публікації – це топологія з довгою лінією передачі даних і двома віддаленими, незалежними джерелами живлення. Назвемо її “Довга лінія”.

Рис. Приклад підключення типу “Довга лінія”

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

Сумісність поділювачів з іншими системами


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

Втім, оскільки класичний поділювач I2C (такий як I2CHUB_V1) є пристроєм пасивним та не перетворює напруги за рівнем, він автоматично є сумісним з будь-яким контролером, до якого ви вирішили його підключити: Arduino, STM32, ESP8266, ESP32, Raspberry Pi, etc.

Увага! Лише ви вирішуєте, з якими логічними рівнями мають працювати компоненти проекту: 1.8V, 3.3V чи 5V.


Докладні специфікації шини I2C


Для того, щоб ознайомитися докладно з усіма особливостями шини I2C, рекомендуємо читати офіційні настанови та вимоги специфікації за посиланням: https://www.nxp.com/docs/en/user-guide/UM10204.pdf
А також інші ресурси в мережі інтернет.

Ось і все, що ми запланували розповісти у даній публікації. Ми розглянули особливості і можливості підключення підпорядкованих модулів до інтерфейсу шини I2C головного контролера. Показали основні схеми застосування поділювача, такі як “Зірка”, “Каскадування”, “Довга лінія”, з можливістю віддаленого незалежного живлення окремих ланок шини, завдяки наявності у поділювача спеціальних портів “входів” / “виходів” живлення.

Дякуємо за увагу. Ставте запитання у наших соцмережах.
Бажаємо успіхів!