经过几次尝试后,UART读取失败

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
5个职位/ 0个新
最后发表
ainwood87
离线
最后看到:2年8个月前
加入:2017-08-21 21:10
经过几次尝试后,UART读取失败

我试图创建一个任务,负责从串行使用UART1读取。我发现调用ad_uart_read几次之后,最终ad_uart_read()将永远阻塞。我使用的是一个USB to TTL适配器,我可以使用逻辑分析仪探测它,因此我知道消息将发送到线路上,但ad_uart_read()仍然没有返回。

通过添加打印,我知道ad_uart_read()在这一行是阻塞的:
OS_EVENT_WAIT(设备- > bus_data - > event_read,超时);

关于如何配置UARTs的一些细节(UART1用于通信,UART2用于printf)

c:
Static const gpio_config gpio_cfg[] = {
HW_GPIO_PINCONFIG(HW_GPIO_PORT_1, HW_GPIO_PIN_3, OUTPUT, UART2_TX, false),
HW_GPIO_PINCONFIG(HW_GPIO_PORT_2, HW_GPIO_PIN_3, INPUT, UART2_RX, false),
HW_GPIO_PINCONFIG(HW_GPIO_PORT_3,HW_GPIO_PIN_2, OUTPUT, UART_TX, false),
HW_GPIO_PINCONFIG(HW_GPIO_PORT_3, HW_GPIO_PIN_3, INPUT, UART_RX, false),
HW_GPIO_PINCONFIG_END
};

..
hw_gpio_configure (gpio_cfg);

在custom_config_qspi.h:

#定义CONFIG_RETARGET
#定义CONFIG_RETARGET_UART HW_UART2

#定义dg_configUART_ADAPTER (1)

/ / # define dg_configUART_SOFTWARE_FIFO (1)
#定义dg_configUART_RX_CIRCULAR_DMA (1)

#定义dg_configUART1_RX_CIRCULAR_DMA_BUF_SIZE (100)
/ / # define dg_configUART1_SOFTWARE_FIFO_SIZE (100)

注意,我已经尝试切换使用软件FIFO和DMA,我得到相同的行为。

在platform_device.h:
Uart_bus (uart1, serial1, hw_uart_baudrate_19200, hw_uart_databits_8, hw_uart_parity_none,
Hw_uart_stopbits_1, 1,1, hw_dma_channel_1, hw_dma_channel_0, 0,0)

Uart_bus (uart2, serial2, hw_uart_baudrate_115200, hw_uart_databits_8, hw_uart_parity_none,
hw_uart_stopbits_1,0,1, hw_dma_channel_3, hw_dma_channel_2, 0,0)

在mytask.c:

ad_uart_init ();

uart_device uart = ad_uart_open(SERIAL1);

(,) {
Int len = ad_uart_read()
...

关键词:
设备:
PM_Dialog
离线
最后看到:1天6小时前
工作人员
加入:2018-02-08 11:03
嗨ainwood87,

嗨ainwood87,

我相信你所经历的问题是由延长睡眠时间引起的。当您使用延长睡眠时,设备将不会被UART Rx引脚上的流量自动唤醒。只有使用CTS引脚的UART2支持这种从睡眠中唤醒的函数。UART1不支持任何流控制,因此不使用位就无法从睡眠中唤醒。我们通过测试您发布的代码来复制您的问题,我们得出结论,您的代码停止的原因是睡眠配置问题。强烈建议将缓冲区大小更改为比dma循环缓冲区大小小1。

建议:

  1. 当使用UART时,禁用扩展睡眠模式。UART在省电时不工作。
  2. 请使用UART2来获取数据,使用CTS来唤醒数据
  3. 有一个单独的引脚来唤醒您的系统,以便唤醒您的设备之前,通过UART发送数据。

谢谢,PM_Dialog

ainwood87
离线
最后看到:2年8个月前
加入:2017-08-21 21:10
嗨,对话框中,

嗨,对话框中,

能解释一下如何配置单板使用CTS引脚吗?这是我需要手动分配到GPIO引脚的东西,还是它内置到USB连接?

ainwood87
离线
最后看到:2年8个月前
加入:2017-08-21 21:10
嗨,对话框中,

嗨,对话框中,

您提到FIFO大小应该比DMA循环缓冲区大小小1。然而,当我尝试编译两个选项启用,我得到以下警告:
#错误UART2不能同时配置使用软件FIFO和循环DMA FIFO

这似乎与你的建议相矛盾。

PM_Dialog
离线
最后看到:1天6小时前
工作人员
加入:2018-02-08 11:03
嗨ainwood87,

嗨ainwood87,

根据DA14680 datasheet, UART2用一个16字节深度的FIFO实现硬件流控制,所以您不能将它配置为软件UART。只有UART1支持软件实现。对于完整的UART功能,您应该在头文件(J15)中添加RTS - P1_5和CTS - P1_6之间的跳线。强烈建议调查一下5.3.4 HCI / UART报头(J15)段落的«DA1468x/DA1510x PRODevelopment kit UM-B-060»用户手册文档。注意,CTS引脚通过跳线J8与K1按钮复用。然后,在外围_init()函数中配置CTS pin,如下所示:

hw_gpio_configure_pin (HW_GPIO_PORT_1HW_GPIO_PIN_6HW_GPIO_MODE_INPUT_PULLUP

HW_GPIO_FUNC_UART2_CTSN1);

谢谢,PM_Dialog