Чи існує максимальна кількість рабів i2c, якими може керувати майстер i2c? Які фізичні обмежуючі фактори?
Чи існує максимальна кількість рабів i2c, якими може керувати майстер i2c? Які фізичні обмежуючі фактори?
Відповіді:
Програмним обмежуючим фактором є розмір адреси, що використовується для підлеглих: 7-розрядна або 10-бітна, яка підтримує 127 і 1023 пристрої відповідно. Фізично існує два обмеження. По-перше, фізичний розмір шини, тому що шина призначена лише для коротких пробігів (внутрішня частина IC). Якщо шина занадто велика, є ємнісні ефекти затримки завантаження та поширення, з якими потрібно вирішити. По-друге, деякі пристрої не можуть підтримувати весь спектр адрес I2C. Як приклад, гіроскоп MPU6050 підтримує лише дві адреси, а деякі пристрої резервують конкретні адреси для спеціальних цілей.
Адресація обмежує кількість пристроїв - деякі можуть використовувати 10-бітну адресацію (досить рідко використовується), що обмежує кількість адрес до 1024. Є декілька "зарезервованих" адрес.
I2C (на відміну від "двох провідних шин" або будь-яких інших, які хочуть викликати подібні шини), повинен відповідати стандарту NXP (née Philips), специфікації UM10204 I2C-шини та керівництву користувача . Це повинен бути вашим основним довідковим документом, а не різними тлумаченнями та підмножинами, які існують в інших місцях.
На максимальну кількість пристроїв впливатимуть можливості приводу найслабшого виходу (що, в свою чергу, визначає мінімальний резистор витягування), провідникова та вхідна ємність, а також режим / частота роботи. Див. Розділ 7.2 Робота над максимально допустимою ємністю шини, якщо максимальна ємність повинна бути перевищена:
Шина i2c обмежена в основному ємністю шини (а отже, швидкістю) та доступними адресами пристроїв. І фізичний простір на дошці.
Але немає реальної верхньої межі, коли ви враховуєте буфери шини, розширювачі, ретранслятори, концентратори, мультиплексори, комутатори (або будь-яку іншу назву пристрою, який може перемикатися між декількома шинами). Вони додають деякі накладні витрати на i2c, оскільки вони можуть бути доступні через ту ж шину i2c. Наприклад, PCA9548A - це 8-розрядний комутатор шини.
Цей єдиний чіп теоретично може вчетверо збільшити кількість i2c рабів (127 * 8), які є в іншому випадку. І PCA9548A може бути налаштований на до 8 адрес на одній шині, тобто 8 * 8 * 127 пристроїв. (математика може бути вимкнена). І це тільки з цим пристроєм і не більше.
Відверто кажучи, немає теоретичного обмеження, якщо налаштувати ємність.
I2C вказує 2 адреси довжини, 7 та 10 біт , що дає теоретичний максимум 128 та 1024 розрізнених адреси відповідно.
Однак є кілька зарезервованих адрес, наприклад 0x00 (загальний дзвінок). Це ще більше обмежує адресний простір.
Якщо ви будуєте систему, де ви маєте безпосередній контроль над пристроями I2C, ви можете використовувати зарезервовані адреси для власного використання, але система більше не відповідатиме стандарту I2C.
Окрім адреси, є обмеження фізичної шини. Кожен пристрій в шині повинен мати можливість низько витягувати шину за певний проміжок часу (залежно від швидкості шини). Якщо шина має велику ємність, пристрої можуть не в змозі витягнути ПДД досить низько, а підйоми можуть не принести ПДД досить швидко.
Тепер апаратні проблеми можна подолати за допомогою трохи апаратних засобів. Зараз я працюю над проектом, який використовує I2C для спілкування з пристроями на відстані декількох 10 метрів. Основна шина використовує 24 В, а на кожній платі є драйвер, який знижує її до 3,3 В.
У горіховій оболонці фізичне обмеження I2C може бути подолане. Адресацію можна подолати, але лише за умови безпосереднього контролю над пристроєм.
Основне обмеження кількості рабовласників, якими може керувати ведучий, як правило, випливає з електричних факторів, таких як ємність шини, витоку, міцності приводу тощо. Якщо можна було побудувати рабів з нульовою паразитарною ємністю і нульовим витоком, і якщо можна було б їх з'єднати з слідами плати нульової ємності, то ємність шини не була б фактором, але на практиці жодне припущення не дотримується.
Адресування пристроїв, які "знають" один про одного, насправді не є проблемою. Було б тривіально розробити периферійну мережу, яка б дозволила підключати мільярди чіпів за допомогою однієї адреси читання та однієї записи. Просто вкажіть, що кожен пристрій повинен мати унікальний чотирьохбайтовий ідентифікатор, і він повинен постійно слухати адресу запису, але повинен виходити з кожної транзакції, перші чотири чотири байти переданих даних не відповідають їх ідентифікатору. Далі уточнюйте, що пристрої можуть відповідати на адресу зчитування лише у тому випадку, коли останній запис запису, який вони почули, відповідав їх адресі.
Якби хотілося додати можливість, щоб ведучий визначав ідентифікатори всіх підключених підлеглих, можна було б резервувати деякі спеціальні діапазони ідентифікаторів для таких цілей. Наприклад, можна сказати, що якщо перший байт ідентифікатора FF, то наступні чотири байти будуть маскою, а чотири після цього ідентифікатором; пристрій повинен залишатися на зв’язку (і акетувати останній байт ідентифікатора), якщо частина його ідентифікатора, визначена маскою, відповідає тій, що вказана в команді. Це дозволить майстру ідентифікувати принаймні один пристрій, використовуючи 64 транзакції, і додаткові пристрої, що використовують 62 або менше транзакцій кожен. Мабуть, не найшвидший спосіб ідентифікації пристрою, але непогано, враховуючи простір пошуку мільярдів ідентифікаторів пристрою.
Коротка відповідь: Це залежить
Якщо у вас є (звичайні) пристрої з 7-бітовою адресою до 104 пристроїв (128 адрес - зарезервовані адреси (0x00-0x07 та 0xF0-0xFF зарезервовано)) (застосовуються певні обмеження) Якщо у вас є (рідше поширені) пристрої, які підтримують 10 біт адресація до 1024 пристроїв (ви можете змішати 7-бітні та 10-бітові пристрої та охопити до 1136 пристроїв таким чином)
Тепер до обмежень. Більшість простих пристроїв можна налаштувати лише на два-8 різних адрес. Ви можете подолати це, замовляючи пристрої з різними базовими адресами (але це зазвичай означає, що ви замовляєте мінімальну кількість пристроїв) Існують також обмеження на обладнання (в основному ємність шини), але це можна вирішити за допомогою спеціальних драйверів i2c.
Якщо ви хочете підключити багато пристроїв на більші відстані, я б запропонував використовувати полеву шину все одно! I2C призначений для зв'язку всередині пристрою (наприклад, телевізора). Я використовую сам I2C з RaspberyPi із зовнішніми кабелями до 50 см (навіть із T-секціями, які ви ніколи не повинні мати в системі шин). Це працює напрочуд добре.
Кількість пристроїв, підключених до шини, обмежена лише загальною дозволеною ємністю шини 400 пФ. Оскільки більшість ІМ-інтерфейсів з інтерфейсом I²C використовують технологію CMOS з низькою потужністю, з високим опором, багато ІМС можуть бути підключені до шини I²C до досягнення максимальної ємності
За допомогою доданих мультиплексорних мікросхем (наприклад, TCA9544A) або буферів (наприклад, PCA9515B) ви можете подолати всі межі - і ємності шини, і адреси.
Ви можете розмістити 3 пристрої з однаковими адресами за мультиплексором і вибрати лише один з них, зв’язатися з ним і пізніше вибрати інший. Звичайно, програмне забезпечення стає складнішим.
Якщо у вас довго проводка, ви можете розмістити буфер посередині і подолати межу ємності.