Як вирішити зіткнення адреси I2C?


39

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

Чи є спосіб з'єднати кілька пристроїв з однією адресою?

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

Відповіді:


24

Для цього немає нічого вбудованого в I2C, звичайно ведені пристрої матимуть кілька зовнішніх штифтів, які можна встановити на 0 або 1, щоб увімкнути пару бітів адреси, щоб уникнути цієї проблеми. Крім того, я мав справу з кількома виробниками, які мають 4 або 5 номерів деталей, лише різницею є її адреса I2C.

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

Що стосується модуля перекладу, ви можете придбати $ 0,50 PIC з 2 шинами I2C і написати якийсь швидкий код, щоб змусити їх діяти як перекладачі адрес.


Спасибі. Так, ці пристрої мають вибір адреси, але лише між двома адресами, і я хочу підключити 5+ пристроїв, тому я все-таки закінчуватимуться зіткненнями. Я не думав використовувати ПІК. Це має спрацювати. Немає нічого з полиці, що робить подібні речі?
Саймон П Стівенс

11
NXP створює купу мультиплексорів / комутаторів для I2C, можливо, ви зможете щось виправити з цього: наприклад, ics.nxp.com/products/i2cmuxes ви можете створити у своєму випадку 3 підрозділи, кожен з яких має два пристрої , і використовуйте один з комутаторів NXP для досягнення своєї мети.
Марк

Чудово, це саме та річ, яку я шукав. Я просто не знав імені. Спасибі.
Саймон П Стівенс

Цій відповіді 7 років, тому я вважаю, що вона могла бути найкращою в той час, коли її запропонували. Для інших, які зараз проходять, проте деякі набагато новіші відповіді (на даний момент нижчий рейтинг у списку) пропонують потенційно кращі підходи на основі нових компонентів, які зараз є на ринку.
Цегла

6

Я щойно зіткнувся з цією проблемою з кількома пристроями I2C з фіксованою адресою. Нашим рішенням було використання ліній вводу / виводу на мікроконтролері для примусового використання ліній ПДР на пристроях, до яких ми не хочемо звертатися, в той час як лінія вводу / виводу для пристрою, на який ми орієнтуємося, встановлюється як вхідний (високий опір ). Це означає, що лише адресному пристрою відповідає його адреса I2C, а інші ігнорують будь-які наступні дані.

Кілька пристроїв I2C з однаковою адресою

Резистори на лінії SDA для неактивних пристроїв закінчують функцію підтяжки для шини, тому точне значення буде залежати від того, скільки пристроїв у вас є і який підтягувач вам потрібен для вашої шини. Отже, якщо ви вибираєте 10K резистори, то 3 неактивних пристрою дає підтягування 3K3.

Діоди Шоткі гарантують, що пристрій все ще може витягнути лінію SDA досить низько при передачі даних назад на хост.


Я вдячний за те, що ви простежили та опублікували це. Це досить геніальне рішення, я впевнений, що буде корисним для інших.
Simon P Stevens

Приємна ніша, яку можна використовувати в деяких додатках. Мені це дуже подобається
Гаррі Свенссон

5

Якщо жоден з пристроїв I2C не використовує розтягування годин (рукостискання), і якщо ви трохи розбиваєте майстра I2C, простий хакер полягає в тому, щоб деякі пристрої міняли годинник і дані шпильками. Під час передачі байту пристрій, у якому поміняні годинники та дані штифтів, побачить кожен "0" біт як подія (дані піднімаються та падають без годинника) і побачать кожен "1" біт як зупинка I2C та початок (піднімання годинника під час низьких даних, падіння даних, що піднімаються та спадають, з подальшим падінням годинника). Умисні умови зупинки та запуску для одного пристрою можуть розглядатися як біти даних для іншого, але якщо один пристрій не має надмірної кількості умов запуску та зупинки між бітами "1", навряд чи будь-який пристрій "випадково"


6
Я не виступаю проти цього, але це здається мені трохи ризикованим. Мій досвід роботи з I2C полягає в тому, що він досить чутливий до шуму лише за допомогою звичайного з'єднання. Однак ви вживаєте слово "хак" і згадуєте застереження "якщо жоден з пристроїв i2c не використовує розтягування годин", тож якщо це може працювати для когось, тоді їм більше сили.
Jason S

5

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

Комутатори шини зазвичай мають одну дивну характеристику, що не має значення для I2C, оскільки він використовує пристрої з відкритим зливанням: шина перемикача має низький опір при з’єднанні напруг біля 0 (Vss), але опір різко зростає в міру наближення напруги джерело живлення Vdd. (Це тому, що вони в основному MOSFET з напругою затвора на джерелі живлення, коли вони включаються, тому коли комутовані напруги наближаються до Vdd, наявні Vgs значно нижчі)


1
Посилання розірвано. fairchildsemi.com/product-technology/bus-switches працює краще.
florisla

4

У мене було два датчики кольорового світла TCS3414, які я хотів порівняти (пакети FN та CS, які мають різні фільтри). Адреса I2C провідний. Подивившись, як працює I2C з точки зору ліній SCL (тактова) та SDA (дані), здавалося, що відключення лінії SDA не дозволить чіпу отримати пусковий або стоп-біт і, таким чином, залишити його в спокої. Таким чином, використовували аналоговий перемикач CMOS (4066B) для вмикання або вимикання лінії SDA до кожного пристрою. Це спрацювало чудово для перемикання між двома пристроями. Я знаю, що це злом, і PCA9548 було б набагато краще, але мені не було зручно.


Насправді це зовсім не хак, і я запевняю, що це має бути прийнятою відповіддю. Я бачив, що це використовується в декількох комерційних продуктах, і я не можу придумати кращого рішення (якщо тільки у вас немає GPIO, і тому вам не потрібно чисте рішення I2C, наприклад, мукси для I2C). Хороші аналогові мукси мають велику пропускну здатність і божевільно дешеві.
Джей Карлсон

4

Зараз є відповідь - Linear Tech має серію адресних перекладачів LTC4316 / 17/18. Вони відносно нові, і доступність непевна.


Дуже цікава складова. Більшість пристроїв I2C мають 2 фіксованих адреси, і це може LTC4316 потенційно подвоїти адресацію за розумні витрати.
Мехрад

4

Кілька виробників пропонують шини I2C мультиплексні та комутаційні інтегральні пристрої.

Мукс може активувати один канал одночасно; комутатор може включати паралельно декілька.

Перевірте, наприклад, пропозиції NXP , TI та Maxim .

Для експериментів Adafruit має плату TCA9548a .

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

Переваги

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

-1

Використовуйте простий мікросхема demux (наприклад, 74HC139 afaik) і підключіть контактний контакт I2C CLK до входу (оскільки тільки штифт I2C CLK виводиться). Використовуйте штифти GPIO для керування потрібним виходом. Тоді контактний контакт I2C можна розділити між усіма рабами.


6
SCL не виводиться тільки. Раб може розтягнути годинник, якщо йому потрібно сповільнити його.
stevenvh

Можна використовувати аналоговий мультиплексор (який є двонаправленим), але декодер може не працювати з тієї причини, яку вказав Стівен. Якщо ви використовуєте мультиплексор, вам знадобиться слабка м'якоть на підлеглому боці, щоб забезпечити його неактивну роботу. Також змініть вибір мультиплексора лише тоді, коли шина не працює.
Кевін Вайт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.