длина провода 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?
@Andrew, 👍0
Обсуждение2 ответа
Как писал @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 в различных ситуациях.
С 2 экранированными кабелями, отдельными для SDA, SCL не проблема пройти несколько метров.
Я только что подключил 2 устройства I2C общими экранированными кабелями длиной 6 м SDA, SCL. 3,3 В и заземление на неэкранированных кабелях
Успешно попробовал также экранированные кабели для компьютерных мышей, около 1,5 м работает без проблем
Подтягивающие резисторы прибл. 4k7
Скажите, пожалуйста, какой экранированный кабель вы использовали?, @VE7JRO
- Библиотеки I2C для ATTiny85?
- I2C запрашивает более одного байта
- Всегда 255-ответ в I2C между ATTiny85 (8 МГц) и Arduino Uno
- Связь AtTiny44 и AtTiny 85
- Соединение ATTiny85 I2C с Arduino Nano
- Digispark Rev. 3 Kickstarter ATtiny85 использует все 6 контактов
- Что такое "tws_delay" и как его использовать? (с ATTiny85)
- Получение байтов i2c на attiny85
I2C не предназначен для использования на длинных проводах. Что заставляет вас думать, что вы можете?, @Majenko
Буфер двойной двунаправленной шины P82B96 поможет вам «пройти лишнюю милю». См. таблицу на стр. 14, https://www.nxp.com/docs/en/data-sheet/P82B96.pdf., @Mikael Patel
@MikaelPatel добавьте свой комментарий в качестве ответа., @MatsK