我有两个使用XUartLite进行通信的FPGA。其中一个是Spartan,另一个是Kintex-7。 Kintex在发送端,Spartan在接收端。
Kintex的相关代码,用于读取内存并通过uart发送:
static volatile uint32_t data=0;
while(len<cnt ){
data = XIo_In32(adr);
XUartLite_Send(&UartLite, (u8 *)&data, sizeof(uint32_t));
adr+=sizeof(uint32_t);
len++;
}
在Sparatan /接收方面:它一直接收,直到达到寄存器给出的整个长度(len):
static volatile uint32_t RBuf;
while(bt<len){
XUartLite_DisableInterrupt(&UartLite);
XUartLite_Recv(&UartLite, (u8 *)&RBuf, sizeof(uint32_t));
xil_printf("Recv: %x \n\r",RBuf);
XIo_Out32(ADDR+bt, RBuf);
XUartLite_EnableInterrupt(&UartLite);
bt+=sizeof(uint32_t);
}
出于某种原因,Recv: %x
在第5个数据包之后停止到之前的值。见下文(我正在阅读10个地址值):
Recv: 0
Recv: 1D /*This is a control character here*/
Recv: 1
Recv: 2
Recv: 3
Recv: 3
Recv: 3
Recv: 3
Recv: 3
Recv: 3
我相信它正在发生,因为Kintex传输速度太快而Spartan接收速度很慢。任何想法如何解决这一点将不胜感激!
答案 0 :(得分:1)
您滥用此功能。
XuartLite_Recv()被记录为非阻塞功能。
此函数将尝试从UART接收指定数量的字节数据并将其存储到指定的缓冲区中。此功能适用于轮询或中断驱动模式。它是非阻塞的,如果UART没有收到任何数据,它将返回。
如果您在默认的轮询模式下使用设备,则需要检查Martin James建议的返回值。
虽然文档对此不清楚,但您还应该考虑这样的可能性,就像在其他系统上使用此类型的方法一样,您最终可能会在结果中获得4字节值的未对齐分数 - 例如,您可能得到1个字节,然后是4个字节,其中4个字节是一个值的剩余3个字节和下一个字节的第一个字节。
如果您在中断模式下使用该设备,事情仍然更复杂
在中断模式下,此功能将开始接收,然后驱动程序的中断处理程序将继续接收数据,直到收到缓冲区为止。将调用由应用程序指定的回调函数,以指示接收缓冲区的完成或发生任何接收错误或超时。必须使用SetOptions函数启用中断模式。
另请注意,当在大概8位uart上发送多字节值时,您需要一些方案来确保您的发送器和接收器就它们之间的边界在哪里达成一致。