Зеркало сайта: vivacious-stockings-frog.cyclic.app

Введение в Bit-banging: "режимы работы GPIO микроконтроллеров AVR, организация последовательной шины

разделы: I2C , дата: 20 сентября 2015г.


pull-up c английского
переводится как подтягивание

Когда речь шла об управлении дисплеем HD44780, то там все было относительно ясно. Напрямую соединялось два устройства, одно работало только на прием, другое только на передачу. Поэтому достаточно было выставить нужный логический уровень на выводах GPIO микроконтроллера, чтобы все работало.

Несколько сложнее обстоят дела, когда нужно организовать обмен данными между несколькими устройствами. Выводы устройств имеют два состояния: логичская единица т.е. +5 или +3 Вольта и логический ноль, когда контакт соединен с "землей". Если начать соединять их напрямую, то произойдет короткое замыкание. Bit-banging это та тема, где нужно четко представлять, что происходит.

    Рассмотрим режимы работы GPIO в AVR микроконтроллерах:
  1. Push-pull режим. Режим на передачу, когда вывод GPIO подключен либо к Vcc либо GND. Задается записью единицы в соответствующий бит DDR(data direction register) регистра. Состояние GPIO меняется записью в соответствующий бит регистра PORT нуля или единицы. Должно быть понятно, что прямые соединения типа: {(GPIO=1) <==> GND} или {(GPIO=0) <==> Vcc} приведут к короткому замыканию!
  2. Высокоимпедансное состояние. Это когда GPIO не подключен ни к Vcc ни к GND. Это состояние по умолчанию для всех GPIO микроконтроллера. Задается записью нулей в соответствующие биты регистров DDR и PORT. В этом состоянии доступен только на чтение регистр PIN, который выдаст единицу если на GPIO подать высокий потенциал и ноль, если потонциал будет ниже трех вольт. В случае, если вывод GPIO никуда не подключен, т.е. "болтается в воздухе". т.е. состояние соответствующего бита регистра PIN считается неопределенным, т.е. лишино всякого смысла.
  3. Pull-up состояние, когда, GPIO подключен через подтягивающий резистор(pull-up) к Vcc. Задается записью в соответствующие биты: ноль в DDR, единица в PORT. В этом состоянии, на GPIO будет высокий потенциал, но прямое соединение GPIO с землей не приведет к короткому замыканию. В этом состоянии, при замыкании GPIO на землю, с регистра PIN будет считываться ноль, в остальное время будет считываться единица.

На основе этих трех состояний можно постоить последовательную шину вида:

Как видно, здесь есть ведущие(мастер) и ведомые(slave). Уровень на шине формирует мастер. стальные в это время находятся в высокоимпедансном состоянии. Если мастеру нужно что-то передать, он переходит в состояние 1. Если слэйв что-то передает, он замыкает линию на землю и получается, что передавая единицу, мастер на входе получает ноль и наоборот. Такая вот логика.