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

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

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

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

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

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:
hw_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)

hw_uart_bus (uart2, serial2, hw_uart_baudrate_115200, hw_uart_databits_8, hw_uart_parity_none, hw_uart_bus, 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. 当使用UART时,禁用扩展睡眠模式。UART在省电时不工作。
  2. 请使用UART2为您的数据,使用CTS为唤醒
  3. 在通过UART发送数据之前,有一个单独的引脚来唤醒你的系统,以唤醒你的设备。

谢谢,PM_Dialog

ainwood87
离线
最后看到:3年4天前
加入:2017-08-21 21:10
嗨,对话框中,

嗨,对话框中,

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

ainwood87
离线
最后看到:3年4天前
加入:2017-08-21 21:10
嗨,对话框中,

嗨,对话框中,

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

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

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

嗨ainwood87,

根据DA14680数据表,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引脚与K1按钮通过跳线J8复用。然后,你应该在peripher_init()函数中配置CTS引脚,如下所示:

hw_gpio_configure_pin (HW_GPIO_PORT_1HW_GPIO_PIN_6HW_GPIO_MODE_INPUT_PULLUP

HW_GPIO_FUNC_UART2_CTSN1);

谢谢,PM_Dialog