你好,
我们设置一个连接到外部单片机DA14580 UART。DA14580和单片机使用协议相互通信设计。
DA14580等待uart读5字节的头。单片机发送的头(5字节)data_length。DA14580然后与data_length字节uart_read是否被接受。
观察:
假设,单片机已经发送5字节头和32字节数据。
使用的内部缓冲区UART HW似乎是16字节。因为我们看到的是DA14580接收头正确然后试图读取32字节如果部分数据已经存在的UART HW缓冲DA14580读回调是从来不叫ie。32个字节是从来不读完全。
如果uart阅读前的32个字节称为实际数据从单片机接收整个读成功和读回调被正确执行。
我们也试着阅读后从DA14580一对一的字节的头是阅读。在这种情况下,发生的是,(16 - 5)即11字节读取正确。虽然,其他字节是从来没有收到DA14580虽然他们已经由单片机发送的。
与DA14580 UART似乎是一个问题。请检查和回复。
注意:我们还启用了HW水平流控制,仍然看到这个问题。你能请确认如果HW流控制工作正常,打开使用API uart_flow_on ()
——Hrishikesh
设备:
你好Hrishikesh,
我正在调查这个问题,将提供一个更新来解决这个问题。
最好的,
信用证
你好Hrishikesh,
16字节的硬件FIFO和按标准提供中断1、4、8和14个字节。你用的是什么当前中断水平?如果你有一个问题与当前interrup水平,那么你可以做以下选项
禁用FIFO和读取数据通常从接收缓冲区。这可以通过监视Rx数据已经具备中断和Rx超时中断。这样你会控制你接受多少数据。基于长度字段在你的头,你可以阅读递增,许多字节。
另一个选择是配置您的RTL中断触发的每个字节接收FIFO,包括接收头(最好以较低的速度(高达115200)。这样你将读取数据根据您的需要。
请提供更多的洞察应用程序实现当前的波特率,什么是你的RTL中断等,以及如何阅读第一头下数据,然后将多经验找出实际问题。请让我知道如果你有任何问题
最好的,
信用证
uart相关问题解决。问题是,uart流控制是不启用。
我们使用uart_flow_on () API调用后uart_init ()
这应该是记录在uart_flow_on SDK头文件():这个API uart_init之前需要被称为()生效。
你好dhrishi,
的顺序uart_flow_on ()和uart_init ()不应由硬件流控制来启用。应该有其他原因这可能发生。
请证实如果你面临的问题完全解决。
最好的,
信用证
是的。我们面临的问题是完全解决。尽管如此,当我交换的序列uart_flow_on()和uart_init()我能看出流控制不生效。
无论如何,我将再次试一试和更新的任何新的观察/结果。
谢谢,
Hrishikesh
你好Hrishikesh,
好,这是解决。我将回顾它如果不是指定和确保它是更新相关的地方。
最好的,
信用证
你好,信用证,
我有类似问题UART从外部读取单片机。
阅读这篇文章之后,我试着每建议通过调用uart_flow_on uart_init后()()。这并没有帮助我。
我是一个UART2设置与外部通信MCU 57.6 kbps。从DA外部单片机发送数据很好。它能够接收所有哒发送。然而,当从外部单片机接收UART数据回达已经为每笔交易错误帧。我要给你附加Saleae捕获。
捕捉,从DA DataToQPI数据发送到外部单片机而DataFromQPI DA从外部单片机发送的数据。
谢谢你!
——潘文凯
你好,信用证,
我找出我的问题。我必须配置RX销如下上拉:
GPIO_ConfigurePin (GPIO_UART2_RX_PORT GPIO_UART2_RX_PIN、INPUT_PULLUP PID_UART2_RX,假);
谢谢,
——潘文凯
你好,信用证,
现在,处方上拉的,我有一个追随问题处方上的数据行解读DA缓冲区。下面是我的代码阅读UARt2的处方数据:
bool readFromCIIf(字节*数据,int data_len) {
bool r = true;
短idx = 0;
int nbytes = 0, bytes_left = data_len;
而(idx < data_len) {
/ / 1 ms等待FPGA CI UART加载一个字节的数据寄存器
qpiSpinCounter (TICK_1MSEC);
/ /找出多少字节发送ASIC的CI输出缓冲区
/ /潘文凯:尝试使用CI_OUTPUT_BUFFER_SZ代替RX_CALLBACK_SIZE
如果(bytes_left > CI_OUTPUT_BUFFER_SZ)
nbytes = CI_OUTPUT_BUFFER_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调整。尝试使用这个驱动程序的当前,检查是否能解决这个问题。请注意,这不是一个官方发布的司机和仅用于测试目的。
最好的,
信用证
你好,信用证,
在新的modified_uart2。c文件中函数uart2_init (uint16_t baudr, uint8_t dlf_value, uint8_t模式),设置为第二个参数dlf_value是什么?在我uart2这个参数不是必需的。c文件。
难道你也不得不把uart2寄给我。h文件吗?
谢谢,
——潘文凯
你好潘文凯,
请使用所附的头文件。很少有更新uart驱动程序的最新版本。
最好的,
信用证