读取SAMDG55上的输出引脚电平



我正在为基于 Atmel/Microchip AT SAMG55 的设备构建固件。

在一个简单的函数中,触发一些连接到GPIO引脚的关系。 因为我想联锁不同的I/O,避免两个特定输出同时处于高电平,所以我需要知道我之前设置的引脚电平。

在另一个基于SAMD21的项目中,有一个读取输出引脚状态的功能。

static inline bool port_pin_get_output_level(const uint8_t gpio_pin)

ASF 中的 SAMG55 端口库完全不同,所以我尝试了ioport_get_pin_level(pin),但我没有得到预期的结果。我认为它仅适用于配置为输入的引脚。

是否有任何推荐的解决方案?

参见 SAMG55 数据手册中的图 16-2 以及第 16.5.4 和 16.5.8 节:

16.5.4 输出控制

。I/O线路上驱动的电平可以通过写入设置输出数据寄存器(PIO_SODR(和 清除输出数据寄存器 (PIO_CODR(。这些写入操作, 分别设置和清除输出数据状态寄存器 (PIO_ODSR(,表示在 I/O 线路上驱动的数据。...

16.5.8 输入

每个 I/O 行上的电平都可以PIO_PDSR读取。此寄存器指示 I/O 线的电平,无论其 配置,无论是唯一作为输入,还是由 PIO 驱动 控制器,或由外设驱动。读取 I/O 线路电平 需要启用 PIO 控制器的时钟,否则 PIO_PDSR读取 I/O 行上存在的级别,当时 时钟已禁用。

因此,只要引脚的配置使得引脚上的实际电平始终对应于我们尝试驱动的电平 - 例如,集电极开路配置不是这种情况 - 那么TarickWelling的答案是正确的:您可以从输出数据状态寄存器(PIO_ODSR(读取输出状态。

但是,无论驱动程序配置如何,都可以从引脚数据状态寄存器(PIO_PDSR(读取引脚的真实状态(受重新同步延迟的影响,该延迟可能与任何给定应用相关,也可能无关(。

你可以做一些低级编程。您可以使用高级 HAL 函数来配置、设置和重置引脚,但在此之前,您将这样做。通过寻址寄存器的数据值来读取引脚的值。在 AVR 中,这将通过读取PORTx来完成。在STM32中,这可以通过读取GPIOx->ODR的值来完成。当然,您需要提取正确的引脚,但这是可以做到的。

您还可以查看port_pin_get_output_level的定义,检查他们是如何做到的,并将其转换为该板/供应商/HAL 的寻址方式。

更新:

在查看 SAM G55G/J 的数据表时,第 340 页为我们提供了所需的答案。

I/O线上的驱动电平可以通过写入设置输出数据寄存器(PIO_SODR(和 清除输出数据寄存器 (PIO_CODR(。这些写入操作分别设置和清除输出数据 状态寄存器 (PIO_ODSR(,表示 I/O 线路上驱动的数据

因此,我们可以通过写入PIO_SODRPIO_CODR来分别设置和重置引脚来驱动输出。但也从PIO_ODSR读取这是一个包含引脚状态的寄存器。

在谷歌上快速搜索一下,Atmel/AVR 控制器有两个选项:

  1. 从用于设置输出值的同一位置读回(PORTx 寄存器( 这将为您提供之前写入寄存器的值。

  2. 使用 PINx 寄存器读取实际值 这将为您提供可以在设备上实际测量的值。

两者之间的区别可能很重要:如果将下拉到逻辑电压阈值以下的 GPIO(即连接到 GND(设置为 HIGH,则 PORTx 将读取 HIGH(您设置的值(,而 PINx 将读取 LOW(实际值(。

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

最新更新