读取SAMDG55上的输出引脚电平

时间:2019-10-21 15:27:09

标签: microcontroller gpio atmel atmelstudio samd21

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

在一个简单的功能中,触发一些与GPIO引脚连接的继电器。 因为我想互锁不同的I / O,以避免同时有2个特定的输出为高电平,所以我需要知道我之前设置的引脚电平。

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

static inline bool port_pin_get_output_level(const uint8_t gpio_pin)

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

有没有推荐的解决方案?

3 个答案:

答案 0 :(得分:1)

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

您还可以查看port_pin_get_output_level的定义,并查看其定义,并将其转换为此板/供应商/ HAL进行寻址的方式。

更新:

the datasheet for the SAM G55G/J内部查看时。第340页为我们提供了所需的答案。

  

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

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

答案 1 :(得分:1)

请参阅SAMG55数据表中的图16-2,以及16.5.4和16.5.8节:

  

16.5.4输出控制

     

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

     

16.5.8输入

     

可以通过PIO_PDSR读取每条I / O线上的电平。该寄存器指示I / O线的电平,无论它们如何   配置,无论是作为输入唯一还是由PIO驱动   控制器,或由外设驱动。读取I / O线路电平   需要启用PIO控制器的时钟,否则   PIO_PDSR读取I / O线上存在的电平   时钟被禁用。

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

但是,无论驱动器配置如何,都可以从引脚数据状态寄存器(PIO_PDSR)中读取引脚的真实状态(取决于重新同步延迟,在任何给定应用中可能或可能不相关)。

答案 2 :(得分:0)

谷歌快速搜索为Atmel / AVR控制器提供了两种选择:

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

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

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

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