Чтение уровня выходного вывода на SAMDG55

Собираю прошивку для устройства на базе Atmel/Microchip AT SAMG55.

В простой функции активируйте некоторые реле, подключенные к контактам GPIO. Поскольку я хочу заблокировать разные входы/выходы, избегая одновременного высокого уровня двух определенных выходов, мне нужно знать уровень вывода, который я установил ранее.

В другом проекте, основанном на SAMD21, была функция, которая считывает состояние выходного вывода.

static inline bool port_pin_get_output_level(const uint8_t gpio_pin)

Библиотека портов SAMG55 в ASF совсем другая, поэтому я попробовал ioport_get_pin_level(pin), но не получил ожидаемого результата. Я думаю, что это работает только с пинами, сконфигурированными как входы.

Есть ли рекомендуемые решения?


person Edoardo Lobbiani    schedule 21.10.2019    source источник
comment
Почему бы просто не установить переменную, которая устанавливается при установке вывода GPIO?   -  person markus-nm    schedule 22.10.2019
comment
@markus-nm спасибо. Я рассматривал этот путь. Кстати, я бы предпочел найти более конкретное решение, которое напрямую считывает уровень контактов, если это возможно. Это дало бы мне больше уверенности, если бы я получил реальный статус, даже если бы он был изменен какой-либо инструкцией в библиотеке.   -  person Edoardo Lobbiani    schedule 22.10.2019


Ответы (3)


Ссылаясь на рисунок 16-2 в техпаспорте SAMG55 и на разделы 16.5.4 и 16.5.8:

16.5.4 Управление выводом

... Уровень, управляемый на линии ввода-вывода, можно определить, записав в регистр установки выходных данных (PIO_SODR) и в регистр очистки выходных данных (PIO_CODR). Эти операции записи, соответственно, устанавливают и очищают регистр состояния выходных данных (PIO_ODSR), который представляет данные, передаваемые по линиям ввода-вывода. ...

16.5.8 Входы

Уровень на каждой линии ввода/вывода можно прочитать через PIO_PDSR. Этот регистр указывает уровень линий ввода-вывода независимо от их конфигурации, будь то уникальный вход, управляемый PIO-контроллером или периферийным устройством. Чтение уровней линии ввода-вывода требует, чтобы часы контроллера PIO были включены, в противном случае PIO_PDSR считывает уровни, присутствующие в линии ввода-вывода в то время, когда часы были отключены.

Таким образом, до тех пор, пока вывод настроен так, что фактический уровень на выводе всегда соответствует уровню, который мы пытаемся передать — что, например, не в случае с конфигурацией с открытым коллектором — тогда ответ Тарика Веллинга правильный: вы можете прочитать состояние вывода из регистра состояния выходных данных (PIO_ODSR).

Однако истинное состояние вывода, независимо от конфигурации драйвера, может быть считано (с учетом задержки ресинхронизации, которая может иметь или не иметь значения в любом конкретном приложении) из регистра состояния данных вывода (PIO_PDSR).

person Jeremy    schedule 24.10.2019

Вы можете программировать на низком уровне. Вы используете функции HAL высокого уровня для настройки, установки и сброса контактов, но прежде чем вы это сделаете, вы бы это сделали. Считайте значение вывода, обратившись к значению данных регистра. В AVR это можно сделать, прочитав PORTx. В STM32 это можно сделать, прочитав значение GPIOx->ODR. Вам, конечно, нужно будет извлечь правильный штифт, но это можно сделать.

Вы также можете заглянуть внутрь определения port_pin_get_output_level и проверить, как они это сделали, и преобразовать его в то, как эта плата/поставщик/HAL выполняет свою адресацию.

Обновить:

При просмотре внутри техническое описание SAM G55G/J. Страница 340 дает нам ответ, который нам нужен.

Уровень, управляемый на линии ввода-вывода, можно определить путем записи в регистр установки выходных данных (PIO_SODR) и в регистр очистки выходных данных (PIO_CODR). Эти операции записи, соответственно, устанавливают и очищают Регистр статуса выходных данных (PIO_ODSR), который представляет данные, передаваемые по линиям ввода/вывода.

Таким образом, мы можем управлять выходом, записывая в PIO_SODR и PIO_CODR для установки и сброса контактов соответственно. Но также читайте из PIO_ODSR, это регистр, который содержит состояние вывода.

person Tarick Welling    schedule 22.10.2019

Быстрый поиск в Google выдает два варианта контроллеров Atmel/AVR:

  1. прочитать обратно из того же места, которое вы использовали для установки выходного значения (регистр PORTx). Это даст вам значение, которое вы записали в регистр ранее.

  2. прочитайте фактическое значение, используя регистры PINx. Это даст вам значение, которое вы действительно можете измерить на своем устройстве.

Разница между ними может быть важной: если вы установите GPIO, который опускается ниже порога логического напряжения (т. е. если он подключен к GND), в HIGH, PORTx будет читать HIGH (значение, которое вы установили), а PINx будет читать LOW (значение, которое вы установили). реальная стоимость).

https://www.avrfreaks.net/forum/reading-pin-set-output

person markus-nm    schedule 22.10.2019
comment
Это будет работать для AVR mcus, но это для ARM, и поэтому PORT/PIN/DDR не существует. - person Tarick Welling; 23.10.2019