用da14580读取UART中的问题

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
13个职位/0个新职位
最后一篇
德里希
离线
最后一次露面:3年4个月前
加入:2017-02-10 09:56
用da14580读取UART中的问题

你好,

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

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

似乎是DA14580 UART的问题。请您检查一下,然后回复。
注意:我们还启用了HW级别流量控制,并仍然看到了这个问题。可以请确认HW流控制是否正常工作,并使用API​​ UART_FLOW_ON()打开

-赫里希克什

设备:
LC\U对话框
离线
最后一次露面:1个月1天前
职员
加入:2016-09-19 23:20
Hello Hrishikesh,

Hello Hrishikesh,

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

最好的,
LC.

LC\U对话框
离线
最后一次露面:1个月1天前
职员
加入:2016-09-19 23:20
Hello Hrishikesh,

Hello Hrishikesh,

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

禁用FIFO并正常从接收器缓冲区读取数据。这可以通过监视RX数据可移中断和RX超时中断来实现。这样你就可以控制你拍摄多少数据。基于标题中的长度字段,您可以读取多个字节的递增。

另一个选项是配置您的RTL中断,以触发FIFO中接收到的每个字节,包括接收报头(在较低的速度下工作最好(比如115200)。这样你就可以根据你的需要阅读更多的数据。

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

最好的,
LC.

德里希
离线
最后一次露面:3年4个月前
加入:2017-02-10 09:56
UART相关问题是

解决了UART相关问题。问题是UART流控制未启用。

在调用uart\u init()之后,我们使用了uart\u flow\u on()API
这应该在SDK标题文件中记录在UART_FLOW_ON()中:在UART_INIT()之前需要调用此API以生效。

LC\U对话框
离线
最后一次露面:1个月1天前
职员
加入:2016-09-19 23:20
你好Driishi,

你好Dhrishi,

世界的秩序uart\u flow\u on()UART_INIT()启用硬件流控制应该无关紧要。可能还有其他原因。

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

最好的,
LC.

德里希
离线
最后一次露面:3年4个月前
加入:2017-02-10 09:56
是的。我们面临的问题

是的。我们面临的问题完全解决。虽然,当我互换UART_FLOW_ON()和UART_INIT()时,我可以看到流量控制没有生效。
无论如何,我会再次在一次新的观察/调查结果中再次尝试并更新。

谢谢,
瑞诗凯施

LC\U对话框
离线
最后一次露面:1个月1天前
职员
加入:2016-09-19 23:20
Hello Hrishikesh,

Hello Hrishikesh,

很高兴听到事情解决了。我会检讨它,如果它没有指定,并确保它是在相关的地方更新。

最好的,
LC.

kqtrinh.
离线
最后一次露面:3年10个月前
加入:2016-08-24 00:17
嗨,LC,

嗨,LC,

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

阅读此帖子后,我通过调用UART_INIT()之后调用UART_FLOW_ON()来尝试。这没有帮助我。
我拥有的是一个UART2设置,可以在57.6kbps的外部MCU通信。将数据从DA发送到外部MCU很好。它能够接收DA发送的所有内容。但是,当从外部MCU接收到DA的UART数据有每个事务的帧错误。我附上了Saleae捕获让你看看。

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

谢谢,
- khai

kqtrinh.
离线
最后一次露面:3年10个月前
加入:2016-08-24 00:17
嗨,LC,

嗨,LC,

我想出了我的问题。我必须将RX引脚配置为Pull_up以下:

GPIO\ U配置引脚(GPIO\ U UART2\ U RX\端口、GPIO\ U UART2\ U RX\引脚、输入\上拉、PID\ U UART2\ U RX、false);
谢谢,
- khai

kqtrinh.
离线
最后一次露面:3年10个月前
加入:2016-08-24 00:17
嗨,LC,

嗨,LC,

既然RX上拉线已经被排除了,我就有一个后续问题,就是将RX线上的数据读入DA缓冲区。下面是我从UARt2读取RX数据的代码:

BOOL READFROMCIIF(字节*数据,int data_len){
bool r = true;
短IDX = 0;
int nbytes = 0,bytes_left = data_len;

while(idx<数据长度){
//等待1毫秒,让FPGA在CI UART数据寄存器中加载一个字节
qdispincounter(勾选1毫秒);

//找出要发送到ASIC的CI输出缓冲区的字节数
//尝试使用CI\u OUTPUT\u BUFFER\u SZ而不是RX\u CALLBACK\u SIZE
if(bytes\ u left>CI\ u OUTPUT\ u BUFFER\ u SZ)
nbytes=CI\u OUTPUT\u BUFFER\u SZ;
别的
nbytes = bytes_left;

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

//从ASIC读取字节
UART2_READ(数据+ IDX,NBYTES,NBULL);
Idx + = nbytes;
}
返回r;
}

在rx_callback_size = 8字节时,我已经使用了CI_OUTPUT_BUFFER_SZ = 256字节。调用者对此功能请求读取140字节。我看过rx线的leaee,所有140字节都在附加的logicdata文件中的电线上。但是,当上述功能遍历循环读取时,读入缓冲区的字节与电线上的内容不同。

当我使用rx_callback_size时,前16个字节看起来很好。之后,内存中的字节丢失并跳到接下来的几个字节。然后,其余的是在时间点的所有0。使用CI_OUTPUT_BUFFER_SZ时,我只会获得前16个字节,其余的是0s。

以某种方式指定每个读取的读取缓冲区大小似乎很重要。这必须正确阅读数据吗?

谢谢,
- khai

LC\U对话框
离线
最后一次露面:1个月1天前
职员
加入:2016-09-19 23:20
你好,凯,

你好,凯,

我无法在我这边重现那个问题。所以我不太确定这个案子到底出了什么问题。不过,我想提几点建议。

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

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

最好的,
LC.

kqtrinh.
离线
最后一次露面:3年10个月前
加入:2016-08-24 00:17
嗨,LC,

嗨,LC,

在新修改的uart2.c文件的uart2\u init函数(uint16\u t baudr,uint8\u t dlf\u value,uint8\u t mode)中,第二个参数dlf\u value的设置是什么?在我的uart2.c文件中不需要此参数。

你不应该还要发给我UART2.H文件吗?
谢谢,
- khai

LC\U对话框
离线
最后一次露面:1个月1天前
职员
加入:2016-09-19 23:20
你好,凯,

你好,凯,

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

最好的,
LC.

附件: