Чтение уровня выходного контакта на SAMDG55 - PullRequest
0 голосов
/ 21 октября 2019

Я создаю прошивку для устройства на базе 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), но я не получаю ожидаемого результата. Я думаю, что он работает только с выводами, настроенными как входы.

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

Ответы [ 3 ]

1 голос
/ 24 октября 2019

Ссылаясь на рисунок 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).

1 голос
/ 22 октября 2019

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

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

update:

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

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

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

0 голосов
/ 22 октября 2019

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

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

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

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

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

...