Связь I2C с ЖК-экраном через кабель длиной 2,5 м

Я пытаюсь подключить ЖК-дисплей 4x20 к Arduino Mega 2560 Rev3 по протоколу I2C через 2,5-метровый VGA-кабель. Я понимаю, что такой длинный кабель не идеален для связи по I2C, но я не могу изменить эту схему. Я изучил соответствующий вопрос здесь, который был весьма информативным, но у меня всё ещё есть некоторые сомнения относительно того, как это реализовать в моей конкретной конфигурации.

Моя настройка:

  • Микроконтроллер: Arduino Mega 2560 Rev3
  • Расширитель I2C: PCF8574 (удалённый 8-битный расширитель для шины I2C)
  • ЖК-дисплей: 20x4, совместимый с HD44780
  • Кабель: кабель VGA длиной 2,5 м
    • SDA подключен к контакту 13
    • SCL подключен к контакту 14
    • GND подключен к внешнему контакту кабеля VGA
  • Используемые библиотеки:
    • <Wire.h>
    • <hd44780.h>
    • <hd44780ioClass/hd44780_I2Cexp.h>

Вопросы:

  1. Можно ли настроить тактовую частоту I2C с помощью следующего фрагмента кода, не вызывая конфликтов с используемыми библиотеками?

    Wire.begin();
    TWBR = 152;
    
  2. Подтягивающие резисторы:

    • Насколько я понимаю, Arduino Mega использует встроенные подтягивающие резисторы сопротивлением 10 кОм на линиях SDA и SCL. В своём коде я явно не настраивал SDA и SCL как подтягивающие резисторы. Я просто объявил объект LCD следующим образом:

      hd44780_I2Cexp lcd; // объявляем объект lcd: автоматическое определение местоположения и автоконфигурация микросхемы расширителя
      

      Обрабатывает ли автоматическая конфигурация библиотеки подтягивания автоматически?

    • Я читал, что меньшее сопротивление подтяжки полезно для более длинных кабелей. Как изменить сопротивление подтягивающих резисторов на Arduino Mega 2560? Какое значение сопротивления вы бы порекомендовали для этого 2,5-метрового кабеля?

  3. Заглушки на SDA и SCL на конце кабеля, подключаемом к расширителю I2C

    Имеет ли смысл добавлять керамические резисторы 0,1 мкФ между землей и SDA и землей и SCL?

, 👍0

Обсуждение

Если вам действительно нужно _меньше_ сопротивление в подтягиваниях, можно просто параллельно разместить внешние подтягивания. Увеличить сопротивление будет сложно., @PMF

1) В библиотеке Wire есть Wire.setClock(), см. [документацию](https://reference.arduino.cc/reference/en/language/functions/communication/wire/setclock/). 2) Кто-нибудь уже ответил на этот вопрос; 3) I2C расшифровывается как Inter-Integrated-Circuit protocol (протокол межинтегральных схем), то есть он разработан для коротких расстояний между микросхемами. Если вы действительно хотите использовать 2,5 м, то, согласно спецификации I2C, ёмкость шины не должна превышать 200 пФ для быстрого режима. Если вы используете кабель CAT 5 с ёмкостью менее 52 пФ/м, с подтяжкой 2,2 кОм и тактовой частотой 100 кГц или ниже, это может вполне соответствовать спецификации I2C., @hcheung

Раз уж вы упомянули VGA, знаете ли вы [DDC](https://en.wikipedia.org/wiki/Display_Data_Channel#DDC2)? Вторая версия использует I²C... Возможно, вам стоит изучить этот вопрос. Например, там используются [контакты 12 и 15](https://en.wikipedia.org/wiki/VGA_connector)., @the busybee

Есть ли причина **не** использовать аппаратный порт I2C на контактах 20 и 21?, @Edgar Bonet


1 ответ


Лучший ответ:

0

Проблема с длиной шины связана со способом работы подтягивающих резисторов. При переходе с высокого уровня на низкий уровень узел I2C устанавливает низкий уровень на выводе, поэтому потенциал провода всегда быстро падает. Но при переходе с низкого уровня на высокий уровень узел переходит в состояние высокого уровня. Таким образом, потенциал провода повышается только благодаря подтягивающему резистору.

Теперь представьте, что между проводом и землёй есть (паразитный) конденсатор. Тогда провод становится средней точкой RC-цепи. Следовательно, время нарастания его потенциала становится пропорциональным R, умноженному на C. R устанавливается в диапазоне от 1 до 10 кОм. Поэтому, если C достаточно велико, любой переход от низкого к высокому уровню также не может быть быстрым.

Итак, какие есть варианты?

  1. Уменьшите сопротивление R. Достаточно добавить ещё один подтягивающий резистор (чтобы он был параллельно существующему). Однако будьте осторожны: не делайте его слишком маленьким, иначе волшебный дым вылетит наружу. Для SCL это, возможно, не проблема, но SDA всегда двунаправленный.

2. Уменьшите C. Обычно мы просто не используем длинные провода. В вашем случае нужно скрутить провода друг вокруг друга. Или просто используйте качественную витую пару.

  1. Низкая скорость SCL. В спецификации указано 100 Кбит/с как минимальная тактовая частота. Однако только хост определяет реальную скорость. Подчинённым устройствам может не хватать слишком высокой частоты, но обычно у них нет проблем с низкой. Конечно, аппаратные/библиотечные реализации могут не поддерживать такую функцию. Но реализовать бит-бэнгинг на I2C действительно просто. Тогда вы сможете сделать тактовую частоту настолько низкой, насколько вам нужно.

  2. Использование двунаправленного буфера(ов) в середине кабеля. Это немного спорный совет, поскольку буфер сам по себе создаёт задержку. Но, думаю, экспериментировать не помешает. Если какой-нибудь дешёвый модуль «логического преобразователя» не поможет, возможно, какая-нибудь специализированная микросхема (txs010x и т.п.) подойдёт лучше. Кто знает?

  3. Отпаяйте плату I2C и полностью отключите шину I2C. Сам экран не привязан к протоколу I2C. Вместо этого можно подключить, скажем, 74hc595 и переключиться на SPI (который тоже работает на короткие расстояния, но должен работать для кабеля длиной 2-3 метра). Или просто проведите все (около восьми) проводов параллельно, без всяких замысловатых последовательно-параллельных протоколов. Возможно, вам также понадобятся какие-нибудь буферные микросхемы, а может и нет. В худшем случае решение на базе UART может решить практически любую проблему с длиной/качеством кабеля.

,

1) При уменьшении C витая пара не уменьшает C. Ёмкость определяется ёмкостью лотка печатной платы и типом провода. Витая пара не способствует работе шины I2C (или цифровой сигнализации), поскольку SDA и SCL подключены к земле, и скручивание проводов SCL и SDA нецелесообразно, так как это увеличит перекрестные помехи между ними. 2) Аппаратный интерфейс I2C не обязательно работает на частоте 100 кГц. Даже если вы настроите I2C на 100 кГц, фактическая тактовая частота может быть всего лишь 80 кГц в зависимости от конфигурации тактовой частоты микроконтроллера и внутреннего предделителя., @hcheung

@hcheung 1. Скручивание сигналов с землей, так как устройствам I2C нужна общая земля, и никто не хочет иметь для нее отдельный кабель; 2. Если это работает на 100 или 80, то все в порядке; дело в том, что мастер шины может установить даже гораздо более низкую скорость, если только программное обеспечение позволяет это., @Matt

Скручивание с заземлением только увеличит ёмкость, а не уменьшит её. Витая пара снижает электромагнитные помехи (для аналогового сигнала), но проблема протокола I2C заключается в ёмкости линии (<200 пФ в быстром режиме). Ознакомьтесь со спецификацией протокола I2C., @hcheung