Сигнал I2C и мощность на большом расстоянии (кабель 10 метров)

9

После некоторого чтения / тестирования мне удалось установить стабильную связь между двумя устройствами, используя I2C с медным кабелем витой пары FTP CAT5.

  • Зеленый провод - SCL
  • Белый / зеленый провод - GND
  • Синий провод - ПДД
  • Белый / синий провод - GND

GND подключен только на одном конце кабеля, тактовая частота шины I2C составляет 10 кГц, и я использовал нагрузочные резисторы 10 кОм для VCC

Работает хорошо и стабильно. Когда я решил использовать другие 2 пары кабеля для питания (+12 В), он перестал работать. Я протестировал + 12V на одной паре GND на другой паре, а также + 12V / GND на той же паре: тот же результат, он перестал работать. Перестала работать вся шина I2C, к ней подключены и другие устройства.

Интересно, смогу ли я использовать тот же кабель или перейти на самый безопасный выбор - другой кабель для питания.

user3503519
источник
3
Вы проверили, что питание на приемной стороне достаточно хорошо? Никаких глюков, никаких провалов ... Кабели CAT5 достаточно тонкие, поэтому PoE потребляет> 40 В для питания.
Владимир Краверо
4
Это где вам нужен осциллограф. Все остальное будет (образованным) отгадыванием.
труба
1
Я бы не стал скручивать SDA или SCL с GND, потому что вы не хотите иметь какую-либо емкость между ними. Я бы крутил + 12В с GND, так как вы хотите емкость между ними. Какой (обратный) ток имеет +12 В? (у вас может быть отскок)
Huisman
5
GND подключен только на одном конце кабеля? Если я не понимаю, это звучит неправильно.
Mkeith
1
Вы имели в виду кабель UTP ? Я уверен, что это может использоваться для большего количества протоколов, чем просто FTP;)
Эндрю Мортон

Ответы:

15

Может быть, излишнее, если оно работало раньше, но можно использовать преобразователь I2C в дифференциальный преобразователь, такой как PCA9615 , LTC4331 и т. Д. Если резисторы меньшего размера не работают или вам нужно удлинить кабель, подумайте о том, чтобы не использовать I2C напрямую.

Не только диапазон будет расширен, но вы также получите лучшую помехоустойчивость.

введите описание изображения здесь введите описание изображения здесь

Уэсли Ли
источник
1
Отличный ответ, это именно то, что должно быть сделано, но, конечно, это может быть радикальным изменением для ОП.
Джек Криси
Я имею в виду, что они очень просты в реализации (по сравнению с переходом на RS-485, CAN и т. Д.), Но да, по сравнению с заменой некоторых резисторов, это радикальное изменение.
Уэсли Ли
1
Проблема @JackCreasey OP заключается не только в емкости кабеля, они, кажется, страдают от шума на линии 12 В, которую они добавили. Понижение подтягивающих резисторов обеспечивает некоторую дополнительную помехоустойчивость, но они не могут продолжать снижать это сопротивление бесконечно.
Дмитрий Григорьев
@DmitryGrigoryev Поскольку ОП не дал никаких подробностей, я не уверен, как вы могли бы предположить, что вводится шум. Я согласен, что вы не можете просто продолжать снижать уровень завершения / подтягивания ... но ОП слишком велика на 10: 1.
Джек Криси
9

Как я отметил в комментарии, трудно отладить без следа осциллографа, но первое, что выделяется из вашего вопроса, это подтягивающий резистор 10 кОм. Это необычно высоко для I2C, хотя во многих случаях это может сработать.

Сначала я бы попытался снизить их до 1 кОм, чтобы посмотреть, повлияет ли это на что-нибудь. Если это поможет, вы можете постепенно сделать их выше, хотя это повлияет на время вашего роста.

труба
источник
10 кΩне так ли велика для шины I2C на 10 кГц? (Или это должно быть 100 кГц ОП?)
Huisman
@Huisman Два хороших момента. 10 кОм не беспокоит меня при 10 кГц на обычной печатной плате, но, возможно, этого недостаточно по кабелю. И 10 кГц - это необычно, но не сумасшедший необычный, я думаю
труба
7
10 кОм огромны для I2C на любом расстоянии. Это основная проблема ОП.
Джек Криси
1
Я думаю, что лучше разделить резисторы и использовать один на каждом конце. 2 подтягивающих резистора @ 4,7 кОм, по одному на каждом конце, должны быть лучшим выбором, чем одиночные подтягивающие резисторы 2,2 кОм.
12431234123412341234123
Я постараюсь понизить резисторы, это все, что меня интересует после всех этих комментариев.
user3503519
5

Вам необходимо сбросить нагрузочные резисторы на большие расстояния, и 10 м - это длинный путь, а 10 кОм - это очень много.

Значение подтягивающего резистора связано с тремя вещами:

  1. Емкость кабеля
  2. Направленное напряжение и чувство уровня Rx.
  3. скорость

Попробуйте использовать любой из доступных калькуляторов и начните читать здесь с приложения TI для значений подтягивания или здесь со стандартом NXP I2C (7.1).

С точки зрения проблемы, с которой вы столкнулись, должно быть очевидно, что заземление дополнительных пар (12 В, Gnd) в кабеле изменит емкость на сигнальных проводах I2C.

Джек Криси
источник
2
Я согласен, можно предположить, что кабель CAT5 имеет около 50 пФ на метр, поэтому 10 метров превышают предел емкости 400 пФ, указанный в спецификации I2C. И достижение тактовой частоты I2C 400 кГц не может быть достигнуто с емкостью 400 пФ при использовании заданного тока подтягивания 3 мА от резисторов. К счастью, замедление скорости поможет - если устройства не имеют минимального ограничения тактовой частоты. Мы не знаем, что это за устройства и каково напряжение на шине I2C, но на самом деле подтягивания должны быть отрегулированы так, чтобы обеспечивать как минимум 3 мА, а если устройства позволяют и согласовывают низкое напряжение на шине, то даже больше.
Justme
Да, я собираюсь проверить это, но мой вопрос - почему это работает, если на этот кабель не подается питание?
user3503519
Плавающая пара кабелей не имеет той же емкости, что и пара сигналов, которую она имеет, когда кабель заземлен. Для вашей конфигурации и +12, и Gnd, по сути, одинаковы…. У них есть емкость к сигнальному кабелю, которая влияет на ваше время нарастания. ,
Джек Криси
2

Несколько заметок:

Получение правильных подтягивающих значений жизненно важно, особенно для SDA. Различные устройства могут потреблять различное количество тока. Я видел установки, которые генерируют дополнительные единицы в данных из-за слишком маленького подтягивающего резистора после переключения на меньший сенсорный чип. Меньшая геометрия означала, что он не может тянуть автобус до чистого нуля.

Скорость убивает. Длинный кабель - это фильтр нижних частот LRC. Для многих приложений I2C вы можете замедлить время, не теряя ничего. Более медленные часы могут компенсировать слабое повышение и большую емкость (но не слишком сильное повышение).

Длинные кабельные трассы - это приглашение EMI. Я видел реализацию I2C, которая нуждалась в ферритовом зажиме для прохождения тестирования на невосприимчивость. Концевая заделка, экранированный кабель или фильтры могут помочь.

Остерегайтесь параллельного сопротивления. Если у вас есть нагрузка 1 кОм на ведущем устройстве, а затем 1 КБ на каждом из четырех клиентских устройств на шине, тогда у вас есть подтягивающая сила в 200 Ом. Не собираюсь на работу.

Джейсон Треон
источник
0

Прорыве плата SparkFun I2C является хорошим решением, особенности:

PCA9615 buffer
I2C Supply voltage range 2.3-5.5V
Differential Supply voltage range 3-5.5V
draws 16µA of current
Extends I2C bus up to 100 feet
Data rate up to 400kHz
2x Qwiic Connectors

введите описание изображения здесь

gatorback
источник
-1

Первое: я хочу поблагодарить сообщество за публикацию ответов.
Второе: я нашел решение на основе этих ответов, вот что я сделал:

Испытано опускание подтягивающих резисторов до 4,7К и 2К. В 2K я время от времени начинаю получать отклики, поэтому я опускаюсь до 1K, затем я начинаю получать ответы, но часть данных отсутствовала по каждому из них. После этого включили нагрузочный резистор на вывод SDA с 10K и все начало работать стабильно.
Таким образом, решение в моем случае - 1K подтягивание на SCL и 10K на SDA.

Спасибо за ваше время.

user3503519
источник
1
Это безумие, хотя. Какое оборудование вы используете здесь? Может быть, что-то неправильно настроено.
труба
1
С одной стороны это ESP32 с микропифоном, с другой стороны - atmega8, запрограммированная с помощью Arduino IDE. Я, наконец, не считаю, что это безопасная связь, поэтому я собираюсь переключиться на последовательный (RS232), так как я тестировал, он прекрасно работает на этих диапазонах
user3503519
1
На вашем месте я бы также посмотрел на RS-485, который был бы еще более надежным и еще более простым. Недостаток в том, что для этого требуется больше сигнальных проводов, но у вас их уже много в CAT5.
труба
1
Ну, я не понимаю, как можно напрямую реализовать RS-485 на процессоре Atmega или ESP 32 без дополнительных преобразователей и оборудования, поэтому RS-232 - лучший выбор здесь. Будет использоваться только один переключатель уровня TTL.
user3503519