Гайд: Підключення мультиплексора TCA9548A (I2C 1–8) для початківців
1. Принцип роботи TCA9548A
Що таке TCA9548A і для чого він використовується?
TCA9548A – це 8-канальний I2C мультиплексор (комутатор), який дозволяє під’єднати до восьми I2C-пристроїв до одного мікроконтролера. По суті, він працює як "переключатель" ліній SDA/SCL: ваш контролер бачить лише ті пристрої, канал яких наразі активовано. Це особливо корисно, коли потрібно підключити кілька однакових сенсорів або модулів з однаковими I2C-адресами – у стандартній I2C-шині два пристрої з однаковою адресою конфліктуватимуть, але через мультиплексор вони ізольовані на різних каналах. Наприклад, якщо у вас є 8 однакових датчиків температури з однією і тією ж адресою, ви можете підключити кожен до окремого каналу TCA9548A (канали 0–7) і опитувати їх по черзі без конфліктів.
Як працює мультиплексування I2C?
Мультиплексор TCA9548A має один "вхідний" I2C-інтерфейс (підключений до мікроконтролера) і вісім "вихідних" I2C-каналів. Лінії SDA та SCL від мікроконтролера "розгалужуються" на вісім пар SDA/SCL для пристроїв. За допомогою спеціальної команди через шину I2C ви вибираєте, який із каналів наразі з’єднаний з головною шиною. Тобто, ви можете перемикати канали програмно, і тільки пристрої на вибраному каналі будуть спілкуватися з контролером (інші канали тим часом відключені електрично). Це важливо, щоб уникнути взаємного впливу пристроїв з однаковими адресами – коли канал вимкнено, пристрої на ньому “невидимі” для основної шини і не спричиняють конфліктів адрес.
Основні технічні характеристики TCA9548A:
Кількість каналів: 8 двонапрямних I2C-каналів (0–7), що комутуються програмно.
Напруга живлення: від 1,65 В до 5,5 В, підтримує логіку 3,3 В та 5 В (всі I/O-виводи 5-вольт толерантні).
I2C-адреса мультиплексора: базова 0x70 (7-біт), змінюється від 0x70 до 0x77 встановленням пінів A0, A1, A2 (до 8 таких чіпів на одній шині). За замовчуванням при A0=A1=A2=LOW адреса = 0x70.
Швидкість I2C: підтримує стандартну та швидку шину – до 400 кГц максимально. (Примітка: режим High Speed 1 МГц не підтримується.)
Reset (скидання): має вивід RST (активний низьким рівнем) для скидання мультиплексора. При скиданні або при ввімкненні живлення всі канали автоматично вимикаються (ізолюються) для безпечного старту.
Особливості: Можна вибрати як один канал, так і кілька каналів одночасно (відкривши їх "паралельно"), шляхом запису відповідної комбінації біт у регістр керування. Однак зазвичай використовується по одному каналу за раз. Також чип забезпечує переклад рівнів між шинами – наприклад, можна мати мікроконтролер на 5 В, а сенсори на 3,3 В: достатньо підтягнути вихідні канали до потрібної напруги, і TCA9548A обмежить рівень сигналу до цього значення.
TCA9548A своїм прикладом показує, як можна усунути обмеження I2C-шини щодо кількості пристроїв. Якщо одного такого мультиплексора мало, ви навіть можете використати декілька TCA9548A одночасно: до 8 штук на одній шині (з різними адресами 0x70–0x77), отримавши таким чином до 64 окремих I2C-каналів! (Хоча на практиці рідко виникає потреба у такій кількості).

Ілюстрація роботи мультиплексора TCA9548A.
2. Схема підключення TCA9548A
Діаграма підключення: Під’єднання TCA9548A до вашого контролера (наприклад Arduino) досить просте. Модуль TCA9548A має такі основні виводи: живлення (VIN), земля (GND), лінії I2C (SDA, SCL), три адресні піни (A0, A1, A2), вивід скидання (RST) і по дві лінії на кожен із 8 каналів (SD0/SC0 ... SD7/SC7). Нижче описано призначення виводів та їх підключення:
- VIN (VCC) – живлення мультиплексора. Під’єднується до 3,3 В або 5 В (залежно від того, яка логіка використовується в системі). Напруга живлення визначає логічні рівні на виходах. Наприклад, на Arduino Uno можна підключити VIN до піну 5V.
- GND – спільна земля. Під’єднується до GND контролера і має бути спільною з землями всіх підключених I2C-пристроїв.
- SDA, SCL – шина I2C з боку майстра (контролера). Підключається до відповідних ліній SDA і SCL вашого мікроконтролера. Для Arduino Uno SDA знаходиться на аналоговому вході A4, а SCL – на A5 (на інших платформах можуть бути інші піни). Отже, SDA TCA9548A -> A4 Arduino, SCL TCA9548A -> A5 Arduino.
- A0, A1, A2 – адресні входи мультиплексора. Визначають молодші біти I2C-адреси TCA9548A. Їх можна підключати до GND або VCC для встановлення адреси з діапазону 0x70–0x77. Якщо ви використовуєте тільки один мультиплексор, найпростіше залишити всі три на GND (тобто адреса за замовчуванням 0x70). Приклад: A0=GND, A1=GND, A2=GND -> адреса 0x70; якщо, скажімо, A0=VCC, решта GND -> адреса 0x71, і т.д.
- RST – вхід скидання (Reset). Активний в низькому стані (LOGIC 0). Якщо він не потрібен для керування, його зазвичай підтягують до VCC (на деяких модулях вже є резистор підтягання). Ви можете також підключити RST до виходу мікроконтролера, щоб при потребі програмно скидати мультиплексор. У типовій схемі для спрощення RST з’єднують із VIN (через резистор 10 кОм або безпосередньо, якщо виробником модуля це передбачено), щоб тримати чип постійно активним.
- SD0–SD7, SC0–SC7 – вихідні лінії I2C для каналів 0–7. Кожен канал має свою пару ліній SDA (SDx) і SCL (SCx). Саме до них підключаються периферійні I2C-пристрої (сенсори, екрани тощо). Наприклад, якщо датчик під’єднаний до каналу 3, його SDA йде до контакту SD3, а SCL – до SC3 на мультиплексорі. Для каналу 0 – SDA пристрою на SD0, SCL на SC0, і так далі.
Приклад підключення до Arduino (схема):
- Arduino Uno 5V -> VIN модуля TCA9548A (живлення 5 В).
- Arduino GND -> GND модуля TCA9548A (спільна земля).
- Arduino SDA (A4) -> SDA мультиплексора.
- Arduino SCL (A5) -> SCL мультиплексора.
- Виводи A0, A1, A2 мультиплексора -> GND (встановлюємо адресу 0x70 за замовчуванням).
- Вивід RST мультиплексора -> 5В (через резистор 10 кОм або напряму до VIN, щоб тримати мультиплексор у робочому стані).
- OLED 1 (перший дисплей): підключаємо SDA дисплея до SD0, SCL дисплея до SC0 (тобто канал 0 мультиплексора). VCC дисплея – до 5В, GND – до GND.
- OLED 2 (другий дисплей): SDA дисплея -> SD1, SCL -> SC1 (канал 1 мультиплексора). VCC -> 5В, GND -> GND.
Обидва дисплеї тепер фізично підключені, але рознесені по різних каналах мультиплексора. Зверніть увагу, що всі GND повинні бути спільними (Arduino, мультиплексор і датчики мають бути на одній землі). Також, за потреби, переконайтеся, що на кожному каналі є підтягувальні резистори (pull-up) для SDA/SCL. Зазвичай на модулі TCA9548A є резистори підтягування на головній шині SDA/SCL, а на багатьох датчиках/модулях – свої підтягування на лініях. Якщо ж ви підключаєте "сирий" пристрій без підтягувань, додайте резистори 4,7 кΩ – 10 кΩ з SDx та SCx до потрібної напруги. Кожен використаний канал має мати pull-up на SDA і SCL до того ж рівня, що і живлення підключених до нього модулів.

Діаграма підключення TCA9548A.
3. Приклад коду для Arduino
Тепер, коли все підключено, розглянемо, як керувати TCA9548A програмно. Спілкування з мультиплексором відбувається через звичайну I2C-команду: TCA9548A сам є I2C-пристроєм (з адресою 0x70 за замовчуванням). Щоб перемкнутися на потрібний канал, ми повинні відправити байт з бітовою маскою потрібного каналу на адресу мультиплексора. Кожен біт цього байта відповідає одному з каналів: біт0 – канал0, біт1 – канал1, ..., біт7 – канал7. Наприклад, щоб вибрати канал 0 – відправляємо 0b00000001 (де лише біт0 = 1), для каналу 3 – 0b00001000 (біт3 = 1), і т.д. Можна встановити кілька біт одночасно, якщо раптом треба активувати кілька каналів, але найчастіше активують по одному.
Як перемикати між каналами? У Arduino це робиться за допомогою бібліотеки Wire. Передусім ініціалізуємо I2C (наприклад, Wire.begin() в setup()). Потім можна написати невелику функцію для вибору каналу, щоб зручно нею користуватися. Ось приклад коду:
#include <Wire.h>
#define TCA9548A_ADDR 0x70 // I2C-адреса мультиплексора (0x70 при A0=A1=A2=GND)
void selectChannel(uint8_t channel) {
if (channel > 7) return; // перевірка допустимого номера каналу 0-7
Wire.beginTransmission(TCA9548A_ADDR);
Wire.write(1 << channel); // виставляємо потрібний біт, відповідний каналу
Wire.endTransmission();
}
void setup() {
Wire.begin();
Serial.begin(9600);
// Ініціалізація: спочатку переконаємося, що на початку всі канали вимкнені
selectChannel(0); // приклад: вибираємо канал 0
// Тут можна виконати ініціалізацію пристрою на каналі 0, якщо потрібно (напр. датчика чи дисплея)
selectChannel(1); // перемикаємося на канал 1
// Ініціалізуємо пристрій на каналі 1
// Можна послідовно ініціалізувати всі необхідні канали
}
void loop() {
// Приклад опитування кількох пристроїв на різних каналах:
selectChannel(0);
// зчитуємо дані або оновлюємо дисплей на каналі 0
// ... ваш код роботи з пристроєм з адресою X на каналі 0 ...
selectChannel(1);
// зчитуємо дані/оновлюємо дисплей на каналі 1
// ... код для пристрою з тією ж адресою X, але на каналі 1 ...
delay(500);
}

Приклад коду для роботи з TCA9548A.
4. Типові проблеми та рішення
Навіть при правильному підключенні та коді, початківці можуть зіткнутися з деякими типовими нюансами при використанні TCA9548A. Розгляньмо найбільш поширені проблеми і способи їх вирішення:
Ситуація: ви запустили I2C-сканер на Arduino і бачите лише адресу 0x70, а підключені сенсори не “видно”. Не панікуйте – це нормально, якщо ви ще не вибрали потрібний канал. За замовчуванням після вмикання живлення жоден із каналів TCA9548A не активний (всі вимкнені), тому мікроконтролер “бачить” лише сам мультиплексор. Рішення: Перед опитуванням пристрою необхідно виконати команду вибору каналу. Наприклад, для сканування підключених пристроїв напишіть цикл, який для кожного каналу викликає selectChannel(n)
(як показано вище) і запускає сканування. Тоді ви побачите, що на кожному каналі може з’явитися пристрій з його адресою. Якщо ж проблема не в цьому, перевірте також підтягувальні резистори на лініях SDA/SCL кожного каналу та якість з’єднань. Часто готові модулі мають інтегровані pull-up, але якщо ви зібрали схему самі, відсутність підтягування на каналі зробить пристрій "невидимим".
Основна задача мультиплексора – вирішувати конфлікти адрес, тож якщо у вас два пристрої з однаковою адресою, рішенням є розмістити їх на різних каналах (як ми зробили з двома OLED вище). Переконайтеся, що на одному каналі не підключено два пристрої з однаковою адресою одночасно – мультиплексор не виправить конфлікт, якщо ви їх фізично з’єднаєте разом на тому самому виході. Правильний спосіб – один канал на кожен "конфліктний" пристрій. Інший можливий конфлікт – якщо адреса самого TCA9548A (0x70 за замовчуванням) вже зайнята іншим пристроєм на основній шині. Це трапляється рідко, але деякі датчики можуть мати адресу в тому діапазоні. Рішення: змінити адресу мультиплексора, встановивши пін A0/A1/A2 у відповідні положення, щоб вибрати іншу (від 0x71 до 0x77). Таким чином ви уникнете збігу адрес. Примітка: якщо ви випадково ввімкнули два канали одночасно, і на них є пристрої з однаковими адресами, це еквівалентно тому, що ці пристрої знов опинилися на одній шині – виникне конфлікт. Уникайте одночасного активування двох каналів з однаковими пристроями, якщо не хочете, щоб вони заважали один одному.
Якщо ви помічаєте, що дані зчитуються некоректно на високих швидкостях I2C, або шина іноді “висне”, варто перевірити декілька моментів. По-перше, максимальна швидкість TCA9548A – 400 кГц. Деякі контролери (наприклад, ESP32) за замовчуванням можуть намагатися використовувати швидший режим (800 кГц або 1 МГц). У такому разі знизьте частоту шини до 400 кГц або нижче. По-друге, велика кількість пристроїв і довгі дроти збільшують ємність шини, що може сповільнювати фронти сигналів. Рішення: за потреби використовуйте більш "сильні" (меншого номіналу) підтягувальні резистори на SDA/SCL – наприклад, 4,7 кΩ або навіть 3,3 кΩ замість 10 кΩ, щоб прискорити підйом сигналу. Але не перестарайтеся (надто малі номінали дадуть зайве навантаження). Якщо шина дуже довга, можливо, слід зменшити частоту до 100 кГц для надійності. Ще одна типова проблема – зависання шини I2C (наприклад, у разі помилки один з пристроїв постійно тримає SDA лінію в LOW). У контексті мультиплексора це може статись на якомусь каналі. Ви можете не одразу помітити, чому мікроконтролер перестав отримувати дані. Рішення: використати вивід RST TCA9548A. Аппаратне перезавантаження мультиплексора скине всі канали і розблокує шину, якщо, наприклад, пристрій на підканалі зависнув. Тому доцільно в критичних застосуваннях під’єднати RST мультиплексора до виходу контролера (або хоча б до кнопки Reset), щоб мати можливість його перезапустити без знеструмлення всієї системи.

Типові проблеми при роботі з TCA9548A.
На завершення

Підсумок та висновки.
На завершення, TCA9548A значно полегшує життя, коли потрібно підключити багато I2C-пристроїв. Головне – правильно його підключити та пам’ятати про перемикання каналів у коді. Цей мультиплексор дружній до початківців: при відносно простому керуванні він розв’язує складні апаратні проблеми. Тож експериментуйте сміливо – підключайте датчики, дисплеї й інші модулі, знаючи, що TCA9548A допоможе всім їм “подружитися” з вашим Arduino на одній двопровідній шині I2C. Успіхів у ваших проектах!
Написать комментарий