После некоторого чтения / тестирования мне удалось установить стабильную связь между двумя устройствами, используя I2C с медным кабелем витой пары FTP CAT5.
- Зеленый провод - SCL
- Белый / зеленый провод - GND
- Синий провод - ПДД
- Белый / синий провод - GND
GND подключен только на одном конце кабеля, тактовая частота шины I2C составляет 10 кГц, и я использовал нагрузочные резисторы 10 кОм для VCC
Работает хорошо и стабильно. Когда я решил использовать другие 2 пары кабеля для питания (+12 В), он перестал работать. Я протестировал + 12V на одной паре GND на другой паре, а также + 12V / GND на той же паре: тот же результат, он перестал работать. Перестала работать вся шина I2C, к ней подключены и другие устройства.
Интересно, смогу ли я использовать тот же кабель или перейти на самый безопасный выбор - другой кабель для питания.
Ответы:
Может быть, излишнее, если оно работало раньше, но можно использовать преобразователь I2C в дифференциальный преобразователь, такой как PCA9615 , LTC4331 и т. Д. Если резисторы меньшего размера не работают или вам нужно удлинить кабель, подумайте о том, чтобы не использовать I2C напрямую.
Не только диапазон будет расширен, но вы также получите лучшую помехоустойчивость.
источник
Как я отметил в комментарии, трудно отладить без следа осциллографа, но первое, что выделяется из вашего вопроса, это подтягивающий резистор 10 кОм. Это необычно высоко для I2C, хотя во многих случаях это может сработать.
Сначала я бы попытался снизить их до 1 кОм, чтобы посмотреть, повлияет ли это на что-нибудь. Если это поможет, вы можете постепенно сделать их выше, хотя это повлияет на время вашего роста.
источник
Вам необходимо сбросить нагрузочные резисторы на большие расстояния, и 10 м - это длинный путь, а 10 кОм - это очень много.
Значение подтягивающего резистора связано с тремя вещами:
Попробуйте использовать любой из доступных калькуляторов и начните читать здесь с приложения TI для значений подтягивания или здесь со стандартом NXP I2C (7.1).
С точки зрения проблемы, с которой вы столкнулись, должно быть очевидно, что заземление дополнительных пар (12 В, Gnd) в кабеле изменит емкость на сигнальных проводах I2C.
источник
Несколько заметок:
Получение правильных подтягивающих значений жизненно важно, особенно для SDA. Различные устройства могут потреблять различное количество тока. Я видел установки, которые генерируют дополнительные единицы в данных из-за слишком маленького подтягивающего резистора после переключения на меньший сенсорный чип. Меньшая геометрия означала, что он не может тянуть автобус до чистого нуля.
Скорость убивает. Длинный кабель - это фильтр нижних частот LRC. Для многих приложений I2C вы можете замедлить время, не теряя ничего. Более медленные часы могут компенсировать слабое повышение и большую емкость (но не слишком сильное повышение).
Длинные кабельные трассы - это приглашение EMI. Я видел реализацию I2C, которая нуждалась в ферритовом зажиме для прохождения тестирования на невосприимчивость. Концевая заделка, экранированный кабель или фильтры могут помочь.
Остерегайтесь параллельного сопротивления. Если у вас есть нагрузка 1 кОм на ведущем устройстве, а затем 1 КБ на каждом из четырех клиентских устройств на шине, тогда у вас есть подтягивающая сила в 200 Ом. Не собираюсь на работу.
источник
Прорыве плата SparkFun I2C является хорошим решением, особенности:
источник
Первое: я хочу поблагодарить сообщество за публикацию ответов.
Второе: я нашел решение на основе этих ответов, вот что я сделал:
Испытано опускание подтягивающих резисторов до 4,7К и 2К. В 2K я время от времени начинаю получать отклики, поэтому я опускаюсь до 1K, затем я начинаю получать ответы, но часть данных отсутствовала по каждому из них. После этого включили нагрузочный резистор на вывод SDA с 10K и все начало работать стабильно.
Таким образом, решение в моем случае - 1K подтягивание на SCL и 10K на SDA.
Спасибо за ваше время.
источник