USB论坛
直播中

云达贞

8年用户 957经验值
私信 关注
[问答]

使用USB控制中心通过FX3将数据传输到DSP,数据字丢失怎么解决?

我们正试图使用 USB 控制中心通过 FX3 将数据传输到 DSP。
硬件

  • 数字信号处理器:与 Fx3S 连接的 TMS320C28346ZFE
  • 按键连接到地
  • 这是一个定制板
问题: 使用 SDK 中的从 FIFO 2 位异步示例,我们在发送二进制文件时遇到了一个问题。
文件详细信息:

  • 二进制文件包含从地址 0x1400 到 0x27FF 的数据。
  • 文件大小为 10240 字节。
问题: 在使用传输文件-输出功能时, DMABuf1[0] 中的第一个数据字错误地为 0x0000,最后一个数据字 0x27FF 丢失。 有趣的是,如果我重新发送同一个文件,收到的第一个单词就是之前丢失的 0x27FF  。
问题:

  • 为什么要添加初始 0x0000 ?
  • 为什么第一次转账时缺少最后一个 0x27FF ?
  • 有其他人遇到过类似问题吗?

回帖(1)

石玉兰

2025-5-28 17:38:55

针对使用FX3通过从FIFO模式向DSP传输数据时出现的首字丢失和末端数据错位问题,以下是分步解决方案:




  1. DMA缓冲区配置优化



    • CyU3PDmaChannelSetXfer前增加100ms延时,确保DSP完成初始化

    • 将DMA缓冲区数量从4增加到8,缓冲区大小对齐1024字节:
      #define DMA_BUF_SIZE 1024  // 必须为1024倍数
      #define DMA_BUF_COUNT 8
      ret = CyU3PDmaMultiChannelSetXfer(&glChHandleSlvFifo, DMA_BUF_SIZE*DMA_BUF_COUNT);




  2. GPIF II接口时序校准



    • 在GPIF II Designer中调整状态机时序:
      STATE_ACQUIRE: 
      IF (FLAGB == 1) JUMP STATE_WRITE;  // FLAGB表示DSP准备好
      ELSE DELAY 10ns;
      STATE_WRITE:
      WRITE DATA[1:0] WITH SLWR=edge;
      IF (FLAGB == 0) JUMP STATE_WAIT;  // FIFO将满时暂停
      STATE_WAIT:
      DELAY 50ns;  // 增加等待周期




  3. DSP端FIFO接口处理增强


    void USB_FIFO_ISR(void) {
       static uint16_t buffer[512];
       static int idx = 0;

       if(FX3_SLWR == ACTIVE) {
           buffer[idx++] = FX3_DATA_PORT;
           if(idx >= 512) {
               DMA_Submit(buffer, 512);
               idx = 0;
           }
       }
       // 每接收256字节发送硬件ACK
       if(idx % 256 == 0) {
           SET_GPIO(ACK_PIN, 1);
           DELAY_US(1);
           SET_GPIO(ACK_PIN, 0);
       }
    }



  4. FX3固件关键修改点


    CyU3PReturnStatus_t
    CyFxSlaveFifoApplnStart(void) {
       // 增加DMA通道复位
       CyU3PDmaChannelReset(&glChHandleSlvFifo);
       CyU3PThreadSleep(100);  // 等待100ms

       // 修改DMA模式为MANUAL模式
       dmaCfg.size = 0;  // 手动控制提交
       dmaCfg.count = 0;

       // 配置GPIO握手信号
       CyU3PGpioSetSimpleConfig(ACK_GPIO, CY_U3P_GPIO_TYPE_INT,
                               CY_U3P_GPIO_INT_RISING_EDGE, 1);
    }



  5. 数据传输流程优化



    • 使用分块传输协议,每512字节添加2字节校验头:
      [0xAA55][SEQ][DATA...][CRC16]

    • DSP端实现重传请求机制

    • FX3端增加超时重传计数器




  6. 调试诊断措施



    • 在USB控制中心启用调试日志:
      def OnDataReceived(data):
      logging.debug(f"Received {len(data)} bytes: {data[:4]}...")
      if len(data) % 1024 != 0:
           logging.warning("Unexpected packet size!")

    • 使用逻辑分析仪监测关键信号:
      Trigger条件:SLWR上升沿 && DATA[15:0] == 0x0000
      监测信号:SLCS, SLWR, DATA[15:0], FLAGA, FLAGB




根本原因分析:
数据丢失问题主要由DMA缓冲区切换时的时序竞争导致。当FX3的DMA引擎在缓冲区边界切换时,DSP端的FIFO控制器未能及时检测到数据有效窗口,导致首字被覆盖。末端数据错位是由于USB控制中心的文件传输机制未正确处理短包(short packet)标记,导致最后一个数据包滞留缓冲区。


验证方法:



  1. 使用示波器测量SLWR和DATA的时序关系

  2. 发送特殊测试模式(0xAAAA/0x5555交替)

  3. 在DSP端实现环形缓冲区,记录丢失位置

  4. 使用Wireshark捕获USB协议层数据验证完整性


注意事项:



  • 确保FX3和DSP共享同一时钟源(建议24MHz)

  • GPIO控制信号需加10KΩ上拉电阻

  • 在高温(+85℃)和低温(-40℃)环境下验证时序余量

  • 对PCB布局进行信号完整性检查,特别是FD[15:0]走线长度匹配


通过上述优化,数据传输的稳定性应得到显著提升。建议使用Cypress提供的Streamer示例程序作为基础进行二次开发,其内置的差错控制机制可有效预防此类问题。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分