[i] Схемотехника портов GPIO
В общем виде схемотехника вывода какого-либо порта GPIO микроконтроллера К1986ВЕ92QI представлена на рисунке 1.
Рисунок 1 - Порт ввода-вывода
На каждый порт A, B, C, D и т.д. выделен свой набор регистров. Биты в этих регистрах задают настройки для каждого вывода порта. Например, порты имеют по 16 выводов (пинов) и для включения выводов в цифровой режим используются 16 бит регистра ANALOG. Оставшиеся биты 32-х битного регистра ANALOG не используются. В регистрах FUNC и PWR настройки для выводов задаются двумя битами, поэтому используются все 32 бита регистра.
По схеме видно, что большинство регистров предназначены для настройки цифрового режима работы выводов. В аналоговом режиме поля этих регистров не имеют значения.
Если вывод используется в работе какого-либо периферийного блока (биты пина в регистре FUNC не равны 0), то работу вывода как вход или выход настраивает сам периферийный блок. Он же выводит наружу цифровые сигналы или считывает внешние сигналы. Для ручного управления пином необходимо использовать режим Port (биты пина в регистре FUNC равны 0), тогда при записи в регистр RTXT данные будут выводиться наружу, а при чтении считываться с пина.
Упрощенная схема ввода - вывода
В упрощенном варианте принцип работы портов в цифровых режимах записи и чтения удобно рассмотреть на схеме, приведенной на рисунке 2.
Диодная защита
На внешнем выводе I/O Pin стоит защита от напряжения. При превышении напряжения на выводе откроется верхний диод и сбросит напряжение на линию питания. При возникновении на выводе отрицательного напряжения, откроется нижний диод и погасит всплеск на землю. Данная защита рассчитана на незначительные скачки напряжения.
В микроконтроллерах есть выводы, которые обозначены как "входы, толерантные к TTL сигналам". В спецификации указано, что на эти входы может подаваться внешнее напряжение до 5,25 вольт. Дело в том, что в схемотехнике данных выводов отсутствует верхний диод к питанию. Получается, что при приложении внешнего напряжения, превышающего напряжение питания МК, ток через вывод не течет - верхнего диода нет, а вывод может быть только входом. Часть Output Driver в данном случае должна быть отключена.
Вывод
Работа выходного тракта осуществляется включением ключа "Output Enable" в схеме. В библиотеке SPL за это отвечает параметр:
GPIOInitStruct.PORT_OE = PORT_OE_OUT;
Когда порт работает на выход, то вариантов настройки не много. В основном режиме ключ "Pull-Down" закрыт и транзисторы, переключаясь попарно, передают "0" или "1" со входа на выход. За закрытое положение ключа в SPL отвечает параметр:
GPIOInitStruct.PORT_PD = PORT_PD_DRIVER;
В режиме с открытым стоком ключ "Open Drain" открыт и верхний транзистор отвязан от выходной линии. Получается, что он не может передать "1" на выход. В то же время нижний транзистор работает как раньше и сбрасывает состояние выхода в "0" при открытии. Этот режим подходит для линий или шин в которых есть внешняя подтяжка к линии питания, например в I2C. В таком случае после закрытия транзистора земли, на линии появится "1" за счет этой общей подтяжки к питанию. За включение этого режима ключа в SPL отвечает параметр:
GPIOInitStruct.PORT_PD = PORT_PD_OPEN;
Когда интересует чтение внешних данных, приходящих на пин, то собственный тракт выхода следует отключить. В SPL:
GPIOInitStruct.PORT_OE = PORT_OE_IN;
Вход
Рассмотрим настройки порта в режиме чтения.
Hi-Z
Когда резисторы подтяжки Pull Up и Pull Down отключены, и при этом отключен выходной тракт, ключ Output Enabled выключен, внешний вывод становится "висящим". Это состояние называется высокоомным или Hi-Z состоянием. Такой режим может применяться, например, для прослушивания какой-нибудь линии в шине. Поскольку сопротивление нашего вывода очень велико, то его присутствие никак не сказывается на работе шины. В тоже время, поскольку это, по существу, висящий провод, то он ловит всевозможные помехи и наводки. Для борьбы с наводками используются подтягивающие резисторы.
В SPL подтяжки выключаются так:
GPIOInitStruct.PORT_PULL_UP = PORT_PULL_UP_OFF;
GPIOInitStruct.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
Подтяжка к питанию
При включении резистора Pull Up, сопротивление которого ~50кОм, шумы на выводе подавятся. На внешнем выводе по умолчанию появится логическая "1". В тоже время, если к выводу подключена кнопка, замыкающая линию на землю, то на выводе появится логический "0". В SPL:
GPIOInitStruct.PORT_PULL_UP = PORT_PULL_UP_ON;
Подтяжка к земле
При включении резистора Pull Down сопротивление которого также ~50кОм, на выводе устанавливается "0". В SPL:
GPIOInitStruct.PORT_PULL_DOWN = PORT_PULL_DOWN_ON;
Триггер Шмитта
В тракте считывания может быть включен триггер Шмитта. Этот триггер известен тем, что имеет гистерезис и при некотором отклонении напряжения dU от заданного логического уровня на входе сохраняет текущее логическое значение на выходе.
Например, если ножка настроена на вход и напряжение на ней равно напряжению питания, то микроконтроллер трактует это, как наличие логической «1» на входе. Если в какой-то момент на линии появится помеха, или наводка такая, что напряжение на входе просядет меньше чем на dU, то микроконтроллер будет по-прежнему трактовать это как логическую «1». С логическим нулем ситуация аналогичная.
В SPL, выключен:
GPIOInitStruct.PORT_PD_SHM = PORT_PD_SHM_OFF; // dU = ~200 мВ
включен:
GPIOInitStruct.PORT_PD_SHM = PORT_PD_SHM_ON; // dU = ~400 мВ
Сохранить статью в PDF