Как настроить контакт как двунаправленный и с открытым коллектором?

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

В некоторых примерах кода направление контакта настраивается для переключения входа на выход в зависимости от того, хочет ли хост вводить или выводить сигнал. Постоянное переключение направления выводов кажется несколько наивным.

Есть ли лучшие методы?

, 👍1

Обсуждение

Зависит от используемого MCU., @Ignacio Vazquez-Abrams


1 ответ


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

2

Если другой конец линии имеет то же напряжение сигнала, что и ваш Arduino, вы можете смоделировать открытый коллектор с помощью одного вывода:

  • digitalWrite(pin, LOW); pinMode(pin, OUTPUT); устанавливает вывод для вывода активный низкий сигнал.
  • pinMode(pin, INPUT_PULLUP) устанавливает для вывода режим ввода или вывода пассивный высокий, что в режиме открытого коллектора то же самое.

Обратите внимание, что в первом случае важен порядок команд: on Микроконтроллеры AVR, если перед записью установить режим OUTPUT. LOW, контакт на короткое время выдаст активный высокий уровень, который запрещено в режиме открытого коллектора. Я не знаю, как другие MCU вести себя в той же ситуации.

Изменить в соответствии с комментарием Игнасио Васкес-Абрамса: Открытый коллекционер шине требуется подтягивающий резистор на каждой линии данных для правильной работы. Если что подтяжка уже обеспечивается вашей клавиатурой или вашим кабелем, тогда вы должны использовать pinMode(pin, INPUT) для точной имитации Выход с открытым коллектором на стороне Arduino. В противном случае вы должны предоставить это подтягивание либо как внешний компонент, либо с помощью внутреннего подтяжка MCU. Остерегайтесь, что последний может быть немного слаб, в зависимости от скорости передачи данных.

,

Вы не хотите, чтобы подтяжка была включена, если вы пытаетесь точно эмулировать вывод OC., @Ignacio Vazquez-Abrams

@IgnacioVazquez-Abrams: Верно. Я отредактировал свой ответ, чтобы решить этот очень важный вопрос., @Edgar Bonet

В зависимости от скорости передачи данных также может быть полезно напрямую записывать контакты PORT и регистры DDR, что работает намного быстрее, чем использование digitalWrite(). Хотя для медленной связи это не имеет большого значения., @chrisl

Просто чтобы уточнить, выдача этих двух команд позволит контакту вводить и выводить сигнал? Правильный? Кроме того, просто из любопытства, может ли также работать разделение вывода данных между входным и выходным контактами? Спасибо., @ATL_DEV

@ATL_DEV: Да, это так. Разделение вывода данных может сработать, но это не упростит задачу и, по сути, бессмысленно., @Edgar Bonet