длина провода i2c

У меня проблемы с i2c. Я не могу использовать длинные провода на шине SDA и SCK.

Похоже, это следствие пропускной способности между проводами SDA и SCK, а не между SDA/SCK и GND.

Я понял это, поместив конденсаторы в макетную плату с Arduino UNO и несколькими MCP23017 (с подтягивающими резисторами 2k2).

Конденсатор 100 пФ между SDA и SCK: проблем нет.

150 пФ: связь прекращается.

1 нФ от SDA до GND и/или 1 нФ от SCK до GND: нет проблем.

Двухжильный кабель составляет около 50 пФ на метр, поэтому 2 метра кажутся пределом.

С ATtiny85 (тактовая частота 8 МГц, скорость i2c 100 000) в качестве ведущего все еще хуже: При подтягивании 2k2 емкость 68 пФ убивает.

Уменьшив подтягивающие резисторы до 470 Ом, я смог увеличить сопротивление до 200 пФ (ура: 4 метра провода).

Кто-нибудь знает, как увеличить расстояние, настроив синхронизацию SDA/SCK?

, 👍0

Обсуждение

I2C не предназначен для использования на длинных проводах. Что заставляет вас думать, что вы можете?, @Majenko

Буфер двойной двунаправленной шины P82B96 поможет вам «пройти лишнюю милю». См. таблицу на стр. 14, https://www.nxp.com/docs/en/data-sheet/P82B96.pdf., @Mikael Patel

@MikaelPatel добавьте свой комментарий в качестве ответа., @MatsK


2 ответа


3

Как писал @majenko, шина I2C не предназначена для подключения по проводам или кабелю. Это относится к компонентам на одной печатной плате. Как писал @mikaelpatel, существуют шинные приводы, которые преобразуют сигнал I2C в какой-то сигнал RS-485 для кабелей витой пары.

Всегда следует избегать перекрестных помех между SDA и SCL. Не помещайте SDA и SCL в провода, которые находятся рядом друг с другом. При использовании кабеля с витой парой (например, Cat5) используйте SDA в паре, отличной от пары SCL.
Худшая ситуация, когда SDA и SCL находятся рядом друг с другом в плоском ленточном кабеле.

Емкость, вызванная кабелем от SDA до GND и от SCL до GND, может быть компенсирована меньшим значением подтягивающих резисторов и снижением тактовой частоты.

Максимальный ток составляет 3 мА. Это означает, что при напряжении 5 В минимальное значение подтягивающего резистора составляет 1 кОм6.
Немного большего можно добиться с помощью драйвера тока на 3 мА вместо подтягивающих резисторов. Это делается нечасто, но сигнал получается лучше.

Библиотека Arduino Wire для Arduino Uno может быть установлена на 50 кГц с помощью Wire.setClock. Я не знаю наименьшее значение, но есть предел без предупреждения. Я не знаю самой низкой тактовой частоты для микроконтроллера Attiny. Программная реализация шины I2C часто может быть намного дешевле.
Обратите внимание, что некоторые датчики имеют минимальную тактовую частоту.

Практическое правило заключается в том, что длина проводов I2C не должна превышать 50 см. Однако некоторые говорят, что они могут использовать обычную шину I2C по 6-метровому кабелю. Мое мнение, что I2C должен работать всегда, так как он не очень отказоустойчив, а библиотека Arduino Wire для Arduino Uno вообще не отказоустойчива. Поэтому не приближайтесь к пределам.

Сканер MultiSpeedI2CScanner (вероятно, работает только с чипами Atmega) помог мне многое узнать о ограничения I2C в различных ситуациях.

,

1

С 2 экранированными кабелями, отдельными для SDA, SCL не проблема пройти несколько метров.

Я только что подключил 2 устройства I2C общими экранированными кабелями длиной 6 м SDA, SCL. 3,3 В и заземление на неэкранированных кабелях

Успешно попробовал также экранированные кабели для компьютерных мышей, около 1,5 м работает без проблем

Подтягивающие резисторы прибл. 4k7

,

Скажите, пожалуйста, какой экранированный кабель вы использовали?, @VE7JRO