问题在UART读取DA14580

⚠️
大家好. .谢谢你来参加论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,并包含在Dialog主网站中。所有的帖子和账户都已迁移。我们现在只接受新论坛的流量-请张贴任何新的线程//www.xmece.com/support.我们将在未来几天修复漏洞/优化搜索和标签。
13个职位/ 0个新职位
最后发表
dhrishi
离线
最后看到:4年4个月前
加入:2017-02-10 09:56
问题在UART读取DA14580

你好,

我们的设置有一个外部MCU,通过UART连接到DA14580。DA14580与单片机之间使用我们设计的协议进行通信。
DA14580正在等待uart读取5字节头。MCU发送带有data_length的头(5字节)。然后DA14580使用接收到的data_length字节执行uart_read。
观察:
假设,单片机要发送5字节的报头和32字节的数据。
UART HW使用的内部缓冲区似乎有16个字节。因为我们看到的是DA14580正确地接收报头,然后尝试一次性读取32个字节,然后如果数据的某些部分已经存在于DA14580的UART HW缓冲区中,那么读取回调永远不会调用ie。32个字节永远不会被完全读取。
然而,如果在从MCU接收实际数据之前调用32字节的uart读取,则整个读取成功并且读取回调得到正确执行。

我们还尝试在读取报头后从DA14580中逐一读取一个字节。在这种情况下,(16 - 5)即11个字节被逐一正确读取。尽管DA14580从未接收到其他字节,但它们已经由MCU发送。

DA14580 UART似乎有问题。请检查并回复。
注意:我们还启用了HW级流控制,但仍然看到这个问题。请确认HW流量控制是否正常工作,并使用API uart_flow_on()打开。

——Hrishikesh

设备:
LC_Dialog
离线
最后看到:一年前
工作人员
加入:2016-09-19 23:20
你好Hrishikesh,

你好Hrishikesh,

我目前正在调查这个问题,并将提供一个更新来解决这个问题。

最好的
信用证

LC_Dialog
离线
最后看到:一年前
工作人员
加入:2016-09-19 23:20
你好Hrishikesh,

你好Hrishikesh,

硬件FIFO为16字节,按照标准提供1、4、8和14字节的中断。您当前使用的中断级别是什么?如果您在当前中断级别上有问题,那么您可以执行以下选项

禁用FIFO并从接收缓冲区正常读取数据。这可以通过监控Rx数据可用中断和Rx超时中断来实现。通过这种方式,您可以控制接收的数据量。基于头中的长度字段,您可以读取增量到该字节数。

另一种选择是配置RTL中断来触发FIFO中接收到的每个字节,包括接收头(在较低的速度下工作最好(比如115200)。这样,您就可以根据自己的需要大量读取数据。

请提供一些更深入的了解您的应用程序实现,如当前的波特率,什么是您的RTL中断等,以及您如何读取第一个报头,然后下一个数据,这将有助于找出实际问题。如果您还有什么问题,请告诉我

最好的
信用证

dhrishi
离线
最后看到:4年4个月前
加入:2017-02-10 09:56
与uart相关的问题是

uart相关问题解决。问题是uart流控制没有启用。

我们在调用uart_init()之后使用uart_flow_on() API
这应该记录在uart_flow_on()的SDK头文件中:这个API需要在uart_init()生效之前被调用。

LC_Dialog
离线
最后看到:一年前
工作人员
加入:2016-09-19 23:20
你好drishi,

你好dhrishi,

顺序uart_flow_on ()而且uart_init ()启用硬件流控制应该无关紧要。应该还有其他原因。

请确认您所面临的问题是否已完全解决。

最好的
信用证

dhrishi
离线
最后看到:4年4个月前
加入:2017-02-10 09:56
是的。我们面临的问题

是的。我们面临的问题已经完全解决了。尽管如此,当我交换uart_flow_on()和uart_init()的序列时,我可以看到流控制没有生效。
无论如何,我会再试一次,如果有任何新的观察/发现,我会及时更新。

谢谢,
Hrishikesh

LC_Dialog
离线
最后看到:一年前
工作人员
加入:2016-09-19 23:20
你好Hrishikesh,

你好Hrishikesh,

很高兴听到问题解决了。如果没有指定,我会重新审核,并确保更新到相关的地方。

最好的
信用证

kqtrinh
离线
最后看到:4年11个月前
加入:2016-08-24 00:17
你好,信用证,

你好,信用证,

我也有类似的问题,从外部MCU读取UART。

在阅读这篇文章后,我尝试在uart_init()之后调用uart_flow_on()来实现这个建议。这对我没有帮助。
我有一个UART2设置,以57.6Kbps的速度与外部MCU通信。从DA发送数据到外部MCU是好的。它能收到地检官发送的所有信息然而,当从外部MCU接收UART数据返回到DA时,每个事务都有帧错误。我附上了Saleae捕获供您查看。

在捕获中,DataToQPI是DA发送给外部MCU的数据,DataFromQPI是外部MCU发送给DA的数据。

谢谢你!
——潘文凯

kqtrinh
离线
最后看到:4年11个月前
加入:2016-08-24 00:17
你好,信用证,

你好,信用证,

我知道我的问题了。我必须将RX引脚配置为下面的PULL_UP:

gpio_configupin (GPIO_UART2_RX_PORT, GPIO_UART2_RX_PIN, INPUT_PULLUP, PID_UART2_RX, false);
谢谢,
——潘文凯

kqtrinh
离线
最后看到:4年11个月前
加入:2016-08-24 00:17
你好,信用证,

你好,信用证,

现在,RX PULL_UP行已经不存在了,我有一个关于将RX行上的数据读入DA缓冲区的后续问题。下面是我在读取UARt2的RX数据的代码:

bool readFromCIIf(BYTE* data, int data_len) {
Bool r = true;
短idx = 0;
Int nbytes = 0, bytes_left = data_len;

While (idx < data_len) {
//等待1毫秒FPGA加载一个字节在CI UART数据寄存器
qpiSpinCounter (TICK_1MSEC);

//找出发送到ASIC的CI输出缓冲区的字节数
// Khai:尝试使用CI_OUTPUT_BUFFER_SZ代替RX_CALLBACK_SIZE
if (bytes_left > CI_OUTPUT_BUFFER_SZ)
nbytes = CI_OUTPUT_BUFFER_SZ;
其他的
Nbytes = bytes_left;

//删除将从剩余总数中检索的字节
Bytes_left -= nbytes;

//从ASIC读取字节
uart2_read(data+idx, nbytes, NULL);
Idx += nbytes;

返回r;

我玩的CI_OUTPUT_BUFFER_SZ = 256字节,而RX_CALLBACK_SIZE = 8字节。此函数的调用者请求读取140个字节。我已经用Saleae查看了RX行,所有140字节都在附加的logicdata文件中。然而,当上述函数遍历循环进行读取时,读入缓冲区的字节与线路上的字节并不相同。

当我使用RX_CALLBACK_SIZE时,前16个字节看起来不错。在此之后,内存中的字节丢失并被跳过到下一个字节。其余的在时间点上都是0。当使用CI_OUTPUT_BUFFER_SZ时,我可能只得到前16个字节,其余的都是0。

以某种方式为每次读取指定读取缓冲区大小似乎很重要。要正确读取数据,这必须是什么?

谢谢,
——潘文凯

LC_Dialog
离线
最后看到:一年前
工作人员
加入:2016-09-19 23:20
你好潘文凯,

你好潘文凯,

在我这边,我无法重复那个问题。所以我不太确定这种情况下哪里出了问题。然而,我想提出一些建议。

1.请检查是否分配了相应的GPIO,连接是否正确。我认为它们是正确对齐的,因为你可以在逻辑分析仪上看到数据。

2.我附上了一个从实际驱动程序修改的示例驱动程序,以解决RX FIFO调整。尝试使用这个驱动程序代替当前的驱动程序,并检查是否解决了问题。请注意,这不是一个正式的发布驱动程序,仅用于测试目的。

最好的
信用证

kqtrinh
离线
最后看到:4年11个月前
加入:2016-08-24 00:17
你好,信用证,

你好,信用证,

在uart2_init函数中的modified_uart2.c文件(uint16_t baudr, uint8_t dlf_value, uint8_t mode)中,第二个参数dlf_value的设置是什么?在我的uart2.c文件中不需要这个参数。

难道你不应该把uart2.h文件也发给我吗?
谢谢,
——潘文凯

LC_Dialog
离线
最后看到:一年前
工作人员
加入:2016-09-19 23:20
你好潘文凯,

你好潘文凯,

请使用这里所附的头文件。uart驱动程序在最新版本中几乎没有更新。

最好的
信用证

附件: