你好,
我们的设置有一个通过UART连接到DA14580的外部MCU。DA14580和MCU使用我们设计的协议相互通信。
DA14580正在等待uart读取5个字节的头。单片机发送具有data_length的报头(5字节)。然后DA14580使用将要接收的data_length字节执行uart_read操作。
观察:
假设MCU必须发送5字节的报头和32字节的数据。
UART硬件使用的内部缓冲区似乎有16个字节。因为我们看到的是DA14580正确地接收了报头,然后在go中尝试读取32个字节,那么如果DA14580的UART硬件缓冲区中已经存在部分数据,则读取回调永远不会被称为ie。32个字节永远不会被完全读取。
然而,如果在从MCU接收到实际数据之前调用了32字节的uart读取,则整个读取是成功的,读取回调得到正确执行。
我们还尝试在读取报头后从DA14580读取一个字节。在这种情况下,所发生的是,(16-5)ie 11字节被一个接一个地正确读取。尽管如此,DA14580从未接收到其他字节,尽管它们已经由MCU发送。
DA14580 UART似乎有问题。请检查并恢复。
注意:我们也启用了HW液位流量控制,但仍然存在这个问题。请确认HW流量控制是否正常工作,并使用API uart_flow_on()打开。
-赫里希克什
设备:
你好Hrishikesh,
我目前正在调查这个问题,并将提供一个更新来解决这个问题。
最好的
信用证
你好Hrishikesh,
硬件FIFO为16字节,按照标准,提供1、4、8和14字节的中断。您使用的当前中断级别是什么?如果当前中断级别有问题,则可以执行以下选项
禁用先进先出和读取数据正常从接收缓冲区。这可以通过监控Rx数据可用中断和Rx超时中断来实现。这样你就可以控制接收到多少数据。基于头文件中的length字段,可以读取到这么多字节。
另一个选项是将RTL中断配置为触发FIFO中接收到的每个字节,包括接收报头(在较低的速度下工作得最好(高达115200)。这样,您可以根据需要读取更多数据。
请提供更多关于您的应用程序实现的信息,如当前波特率、什么是RTL中断等,以及如何读取第一个报头和下一个数据,这将有助于找出实际问题。如果您还有其他问题,请告诉我
最好的
信用证
解决uart相关问题。问题是uart流控制没有被启用。
在调用uart_init()之后,我们使用了uart_flow_on()API
这应该记录在uart_flow_on()的SDK头文件中:这个API需要在uart_init()生效之前被调用。
你好dhrishi,
秩序uart_流量_on()和uart_init ()启用硬件流控制应该无关紧要。可能还有其他原因。
请确认您面临的问题是否已完全解决。
最好的
信用证
是的。我们所面临的问题完全解决了。但是,当我交换uart_flow_on()和uart_init()的序列时,可以看到流控制没有生效。
无论如何,我会再试一次,如果有任何新的观察/发现,我会更新。
谢谢
瑞诗凯施
你好Hrishikesh,
很高兴听到它被解决了。如果它没有被指定,我会检查它,并确保它在相关的地方被更新。
最好的
信用证
嗨,LC,
我在从外部MCU读取UART时也遇到了类似的问题。
在阅读了这篇文章之后,我尝试按照建议在uart_init()之后调用uart_flow_on()。这对我没有帮助。
我拥有的是一个UART2设置,以57.6Kbps与外部MCU通信。将数据从DA发送到外部MCU是可行的。它能接收地检发送的所有信息。然而,当从外部MCU接收UART数据回DA时,每个事务都有帧错误。我已经附上了Saleae捕捉给你看。
在捕获中,DataToQPI是从DA发送到外部MCU的数据,而DataFromQPI是从外部MCU发送到DA的数据。
谢谢你!
——潘文凯
嗨,LC,
我发现了我的问题。下面我必须将RX引脚配置为PULL_UP:
GPIO_配置引脚(GPIO_UART2_RX_端口、GPIO_UART2_RX_引脚、输入_上拉、PID_UART2_RX、假);
谢谢
——潘文凯
嗨,LC,
现在,RX上拉线路已被排除,我在将RX线路上的数据读取到DA缓冲区时遇到了一个后续问题。下面是我从UARt2读取RX数据的代码:
bool readFromCIIf(BYTE* data, int data_len) {
Bool r = true;
短线idx = 0;
Int nbytes = 0, bytes_left = data_len;
而(idx<数据长度){
//等待1ms,让FPGA在CI UART数据寄存器中加载一个字节
Qpsimpincounter(勾选1毫秒);
//找出要发送到ASIC的CI输出缓冲区的字节数
//Khai:尝试使用CI_输出_缓冲_SZ而不是RX_回调_大小
如果(字节\u左>CI\u输出\u缓冲区\u SZ)
n字节=CI_输出_缓冲区_SZ;
其他的
nbytes = bytes_left;
//删除将从剩余总字节数中检索的字节
bytes_left - = nbytes;
//从ASIC读取字节
uart2_read(数据+ 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。
为每次读指定读缓冲区大小似乎很重要。要正确读取数据必须是什么?
谢谢
——潘文凯
你好,凯,
我无法复制我这方面的问题。因此,我不确定在这种情况下到底出了什么问题。不过,我想提出几点建议。
1.请检查你的GPIO是否被相应地分配,连接是否正确。我认为它们排列正确,因为你可以在逻辑分析仪上看到数据。
2.我附上了一个样本驱动程序,从实际驱动程序修改,以解决RX FIFO调整。尝试使用这个驱动程序来代替当前的驱动程序,并检查它是否解决了问题。请注意,这不是一个正式的发布驱动程序,仅用于测试目的。
最好的
信用证
嗨,LC,
在函数uart2_init(uint16_t baudr、uint8_t dlf_值、uint8_t模式)中新修改的_uart2.c文件中,第二个参数dlf_值的设置是什么?我的uart2.c文件中不需要此参数。
你不应该也把uart2.h文件发给我吗?
谢谢
——潘文凯
你好,凯,
请在此处使用附加的头文件。最新版本的uart驱动程序中几乎没有更新。
最好的
信用证