你好,
我们的设置有一个通过UART连接到DA14580的外部MCU。DA14580与单片机之间通过设计的协议进行通信。
DA14580正在等待UART读取5个字节标题。MCU发送具有data_length的标题(5字节)。然后,DA14580将UART_RED与要接收的data_length字节进行。
观察:
假设,MCU必须发送5字节的头和32字节的数据。
UART HW使用的内部缓冲区似乎是16字节。因为我们看到的是,DA14580正确地接收头,然后尝试读取32字节,然后如果一些数据已经在UART HW缓冲区DA14580,那么读回调从来没有被称为ie。32个字节永远不会被完全读取。
如果在从MCU接收到实际数据之前调用的UART读取32个字节的UART,则整个读取成功,则读取回调已正确执行。
我们还尝试在读取头文件后从DA14580读取1 - 1个字节。在这种情况下,所发生的是,(16 - 5)即11个字节被逐个正确读取。尽管其他的字节已经被MCU发送,但是它们从来没有被DA14580接收。
似乎是DA14580 UART的一个问题。请检查并回复。
注意:我们还启用了HW级别流量控制,并仍然看到了这个问题。可以请确认HW流控制是否正常工作,并使用API UART_FLOW_ON()打开
——Hrishikesh
设备:
Hello Hrishikesh,
我目前正在调查这个问题,并将提供更新来解决这个问题。
最好的,
LC.
Hello Hrishikesh,
硬件FIFO是16字节,按照标准提供中断在1、4、8和14字节。您使用的当前中断级别是什么?如果您在当前的中断级别上有问题,那么您可以执行以下选项
禁用FIFO并正常从接收器缓冲区读取数据。这可以通过监视RX数据可移中断和RX超时中断来实现。这样你就可以控制你拍摄多少数据。基于标题中的长度字段,您可以读取多个字节的递增。
另一种选择是配置RTL中断来触发FIFO中接收到的每个字节,包括接收报头(在较低的速度下工作最好(高达115200)。这样你就可以根据你的需要来阅读这些数据。
请提供一些更深入的了解你的应用程序实现,如当前波特率,什么是你的RTL中断等,以及你如何读取第一个头,然后下一个数据,这将有助于发现实际的问题。如果你还有什么问题,请告诉我
最好的,
LC.
解决了UART相关问题。问题是UART流控制未启用。
我们在调用uart_init()之后使用了uart_flow_on() API
这应该在SDK标题文件中记录在UART_FLOW_ON()中:在UART_INIT()之前需要调用此API以生效。
你好Dhrishi,
命令uart_flow_on ()和UART_INIT()硬件流控制的启用应该无关紧要。发生这种事应该有其他原因。
请确认您所面临的问题是否已经完全解决。
最好的,
LC.
是的。我们面临的问题完全解决。虽然,当我互换UART_FLOW_ON()和UART_INIT()时,我可以看到流量控制没有生效。
无论如何,我会再次在一次新的观察/调查结果中再次尝试并更新。
谢谢,
Hrishikesh
Hello Hrishikesh,
很高兴听到问题解决了。如果没有说明,我会审核,并确保在相关地方更新。
最好的,
LC.
你好,信用证,
我也有类似的问题从外部MCU读取UART。
阅读此帖子后,我通过调用UART_INIT()之后调用UART_FLOW_ON()来尝试。这没有帮助我。
我拥有的是一个UART2设置,可以在57.6kbps的外部MCU通信。将数据从DA发送到外部MCU很好。它能够接收DA发送的所有内容。但是,当从外部MCU接收到DA的UART数据有每个事务的帧错误。我附上了Saleae捕获让你看看。
在捕获中,DataToQPI是从DA到外部MCU发送的数据,而DataFromQPI是从外部MCU发送到DA的数据。
谢谢,
- khai
你好,信用证,
我想出了我的问题。我必须将RX引脚配置为Pull_up以下:
GPIO_ConfigurePin(GPIO_UART2_RX_PORT, GPIO_UART2_RX_PIN, INPUT_PULLUP, PID_UART2_RX, false);
谢谢,
- khai
你好,信用证,
现在RX PULL_UP行已经解决了,我有一个关于将RX行上的数据读入DA缓冲区的后续问题。下面是我从UARt2读取RX数据的代码:
BOOL READFROMCIIF(字节*数据,int data_len){
bool r = true;
短IDX = 0;
int nbytes = 0,bytes_left = data_len;
While (idx < data_len) {
//等待1ms 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(数据+ 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
你好潘文凯,
我这边没办法复制那个问题。所以我不确定在这种情况下哪里出了问题。然而,我有几个建议。
1.请检查您是否相应地分配GPIO并且连接是正确的。我认为它们是正确的,因为您可以看到逻辑分析仪上的数据。
2.我附加一个来自实际驱动程序修改的示例驱动程序,以解决RX FIFO调整。尝试使用此驱动程序代替当前的驱动程序并检查是否解决了问题。请注意,这不是官方发布驱动程序,仅用于测试目的。
最好的,
LC.
你好,信用证,
在函数uart2_init(uint16_t baudr, uint8_t dlf_value, uint8_t mode)的新modified_uart2.c中,第二个参数dlf_value的设置是什么?这个参数在我的uart2.c文件中不是必需的。
你不应该还要发给我UART2.H文件吗?
谢谢,
- khai
你好潘文凯,
请在这里使用附加的头文件。在最新版本中,uart驱动程序有几个更新。
最好的,
LC.