【问题标题】:how to make xuartlite transmit slower如何使xuartlite传输速度变慢
【发布时间】:2013-12-13 18:15:55
【问题描述】:

我有两个使用 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 的接收速度很慢。任何解决此问题的想法将不胜感激!

【问题讨论】:

  • 猜测:XUartLite_Recv() 返回一个值,您没有检查它是否为 sizeof(uint32_t)。
  • 可以在IP的配置中配置每个xuartlite的码率。
  • @MartinJames check os sizeof(uint32_t) 应该总是返回正确的数字,因为它被之前的值停止了。
  • XUartLite_Recv() 是否记录在收到请求的字节数之前不返回?传统上,阻塞“接收”方法将返回已收集到的任何非零数据量,或在任何错误条件下。就此而言,这种方法是否被证明是阻塞的?
  • 嗯.. 如果它总是接收到与请求一样多的字节,为什么还要费心返回接收到的字节数?

标签: c embedded fpga xilinx uart


【解决方案1】:

你误用了这个功能。

XuartLite_Recv() 被记录为一个非阻塞函数。

此函数将尝试从 UART 接收指定字节数的数据并将其存储到指定缓冲区中。此功能设计用于轮询或中断驱动模式。它是非阻塞的,因此如果 UART 尚未接收到数据,它将返回。

source

如果您在默认轮询模式下使用设备,则需要按照 Martin James 的建议检查返回值。

虽然文档对此并不清楚,但您还应该考虑以下可能性,与其他系统上的此类方法一样,您最终可能会在结果中获得 4 字节值的未对齐部分 - 例如,您可能会得到 1 个字节,然后是 4 个字节,这 4 个字节是一个值的剩余 3 个字节和下一个值的第一个字节。

如果你在中断模式下使用设备,事情就更复杂了

在中断模式下,此函数将开始接收,然后驱动程序的中断处理程序将继续接收数据,直到接收到缓冲区为止。应用程序指定的回调函数将被调用以指示接收缓冲区完成或发生任何接收错误或超时。必须使用 SetOptions 函数启用中断模式。

还要注意,当通过大概 8 位的 uart 发送多字节值时,您将需要一些方案来确保您的发送器和接收器就它们之间的边界位置达成一致。

【讨论】:

  • 我也看了。文档非常混乱。 OP 代码对我来说也有点“关闭”......
  • 中断的禁用和启用对我来说看起来很可疑。至于文档,我同意它可能会更好,我至少要警惕它表现得像典型的类 unix 非阻塞串行 read() 的可能性,直到我通过针对病态时间案例的测试证明或检查它不会的源代码。
  • 我的意思是 - 为什么要禁用中断?有时,需要短暂关闭 tx 中断以确定 tx FIFO 是否需要用数据“启动”以启动 tx,但在 rx 端,我从不关闭它们。
  • 好吧,如果我在原始嵌入式系统上从头开始构建它,我可能会在从缓冲区中提取数据时关闭 RX 中断,但这应该隐藏在调用的实现中(我希望)。无论如何,还有其他同步访问的方法。
  • 哦 - 我们似乎在同一个页面上:) 在那个循环中几乎没有真正启用中断 - 它们刚被启用就再次被禁用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 2016-06-16
  • 1970-01-01
  • 2012-02-25
  • 2011-06-27
相关资源
最近更新 更多