Справочник
GPIO
GPIO — сокращение от General Purpose Input Output (универсальный вход-выход). GPIO — это цифровые (иногда аналоговые) сигнальные выводы, которые можно использовать как интерфейсы к другим системам или устройствам. Каждый вывод может находиться в разных состояниях, но при включении питания или после сброса системы у него будет состояние по умолчанию (обычно безобидное, например цифровой вход). Затем мы можем написать программу, которая переведёт вывод в нужное нам состояние.
Познакомимся с несколькими понятиями, связанными с GPIO:
Конфигурации выводов
GPIO можно настроить одним из нескольких способов. Доступные варианты зависят от конструкции чипа, но обычно включают:
Floating (плавающий): плавающий вывод не подключён ни к VCC, ни к земле. Он просто принимает то напряжение, которое на него подано. Однако учтите: схема должна подтягивать вывод внешним образом к низкому или высокому уровню, потому что КМОП-устройства (например, микроконтроллеры) могут работать некорректно, если вывод дольше нескольких микросекунд находится выше «порога низкого уровня» Vtl, но ниже «порога высокого уровня» Vth.
Push-Pull-Output (двухтактный выход): вывод, настроенный как двухтактный выход, может либо выставлять на себя высокое напряжение (то есть подключаться к VCC), либо низкое (подключаться к земле). Это удобно для светодиодов, пищалок и других устройств, которые потребляют немного энергии.
Open-Drain-Output (выход с открытым стоком): выходы с открытым стоком переключаются между состояниями «отключено» и «подключено к земле». Предполагается, что внешний резистор слабо подтягивает линию к VCC. Такой выход позволяет соединять несколько устройств вместе: линия находится в «низком» состоянии, если хотя бы одно из подключённых устройств притягивает её к земле. Если два или больше устройств притягивают её к земле одновременно, ничего не повреждается (соединение земли с землёй безопасно). Если ни одно из них не притягивает линию вниз, резистор по умолчанию подтянет её к высокому уровню.
Floating-Input (плавающий вход): вывод, на котором внешнее напряжение можно прочитать программно как 1 (обычно если напряжение выше некоторого порога) или 0 (если нет). Для этого состояния действуют те же предупреждения, что и для «Floating».
Pull-Up-Input (вход с подтяжкой вверх): как Floating-Input, но внутренний «pull-up» резистор слабо подтягивает линию к VCC, когда ничто внешнее не тянет её к земле. Удобно для чтения кнопок и других переключателей, так как не нужен внешний резистор.
Активный высокий и низкий уровни
Цифровой сигнал может находиться в двух состояниях: high (высокий) и low (низкий). Обычно это выражается разностью напряжений между сигналом и землёй. Какой уровень напряжения соответствует какому логическому состоянию, определяется произвольно, поэтому активным может быть как high, так и low.
Например, у активного высокого вывода есть напряжение, когда логический уровень активен, а у активного низкого вывода напряжение есть, когда логический уровень неактивен.
В embedded Rust абстракции показывают логический уровень, а не уровень напряжения. Поэтому, если активный низкий вывод подключён к светодиоду, чтобы светодиод загорелся, его нужно перевести в неактивное состояние.
Выбор чипа (Chip Select)
Chip Select — двоичный сигнал, который может включать или выключать другое устройство, полностью или частично. Обычно это сигнальная линия, подключённая к GPIO. Её часто используют, чтобы несколько устройств могли работать на одной шине SPI: каждое устройство «слушает» шину, только когда его линия Chip Select активна.
Bit banging
Для протоколов вроде I2C или SPI обычно используется периферия внутри микроконтроллера, которая преобразует данные для передачи в сигналы. Иногда, например если микроконтроллер не поддерживает протокол или используется нестандартная его форма, нужно написать программу, которая превращает данные в сигналы вручную. Это называется bit-banging.