USB论坛
直播中

刘满贵

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

cy7c68013a异步slave fifo模式,外部mcu无法读写fifo怎么解决?

cy7c68013a 异步  slave fifo 模式,外部mcu无法读写fifo

上位机发送bulk数据,flag标志是对的,SLCS也拉低了,是设置的低有效, 检测到了flag不为空的标志后,一直循环 SLOE 低 SLRD 低  读数据 SLRD 高 SLOE高,是EP8,也设置了地址为11,  但是flag 空标志一直也不会变回低,EP8FIFOBCH 的值也不会变回到0

请问大家,这个要检查什么呢,要注意什么呢,谢谢。 有没有哪里是介绍外部mcu  异步读写 slave fifo的?

回帖(1)

马占云

2025-6-9 18:10:04

针对 CY7C68013A 在异步 Slave FIFo 模式下外部 MCU 无法读写 FIFO 的问题,结合你描述的情况(SLCS 拉低,检测到非空 FLAG,执行读操作后 FLAG 状态不变且 EP8FIFOBCH 始终不归零),以下是一个系统性的排查方案和注意事项:




核心排查点




  1. USB 端点配置 (固件端):



    • 端点模式: 确认固件已将 EP8 配置为 ASYNC Slave FIFO OUT 模式 (IN 相对于 FX2LP)。检查 FIFOPINPOLAR (0xE6xx) 寄存器低位字节,确保 SLCSx# 极性设置正确。代码示例:
      EP8FIFOCFG = 0x1C; /* Async Slave FIFO, 16-bit data, OUT endpoint (FX2 direction)*/
      PINFLAGSAB = 0x08; // 例如 EP8FF(EF) 标志分配到 FLAGB
      FIFOPINPOLAR &= ~0x03; // SLCSx# 低有效 (默认可能是高有效,根据设计调整)

    • 端点缓冲: 确保 EP8 配置了足够的缓冲区启用了自动输出/手动输出模式EPxAUTOINLENH/L 或手动提交 OUTPKTEND 模式需一致。

    • 端点使能与复位:

      • 固件初始化必须 启用端点: EP8OUTCFG = 0xA0; (Valid+Out)

      • 确保固件执行了 FIFO 复位:
        SYNCDELAY;
        FIFORESET = 0x80; // Reset all FIFOs
        SYNCDELAY;
        FIFORESET = 0x00;
        SYNCDELAY;
        FIFORESET = 0x00;
        SYNCDELAY;
        FIFORESET = 0x04; // Reset EP8 OUT FIFO (DIR=OUT, EP=8, 0x84)
        SYNCDELAY;
        FIFORESET = 0x00;

      • EPxFIFOBCH/L 不变往往是端点未准备好或数据卡在缓冲区。





  2. 外部 MCU 接口时序与信号:



    • FLAG 检测逻辑:

      • 再次确认你读取的是 EP8 对应的 FLAG 引脚 (根据 PINFLAGSAB/ CD 寄存器配置)。

      • FLAG 极性: 确保 MCU 检测的是 非空标志 EF# (低有效)PINFLAGSAB/ CD 配置需与硬件连接匹配。


    • 异步读操作时序 (至关重要!):

      • 典型顺序:

        1. 检测 EF# = 0 (有数据)

        2. 拉低 SLCS# (选通芯片)

        3. 拉低 SLOE# (输出使能)

        4. 等待 Toe (Output Enable Access Time,约 20-30ns)

        5. FD[15:0] 读取有效数据

        6. 拉高 SLRD# (产生读脉冲,宽度需 > Trpw,典型 30ns)

        7. 等待 Trdoe (Data Hold After RD#)

        8. 拉高 SLOE#

        9. 拉高 SLCS# (可选)


      • 关键点:

      • SLRD# 是上升沿触发数据指针递增。一个完整的数据读取需要 SLRD# 产生一个有效的负脉冲。

      • SLOE# 必须在数据稳定后才能读取。最简操作:SLRD#SLOE# 同时拉低,延迟后读数据,然后先拉高 SLRD# 再拉高 SLOE#**。

      • 时序违规 (频率太高或太短) 会导致数据指针不动或错误!

      • 用示波器测量: SLCS#, SLOE#, SLRD#, EF# 和一条 FD 线。确认:

        • EF# 在检测时为低。

        • SLCS#SLOE# 在读操作期间为低。

        • SLRD# 有清晰、宽度足够的低脉冲 (>30ns)。

        • SLOE# 低且 SLRD# 上升沿之后,EF# 应该在下一个系统时钟周期或稍后拉高 (数据被取出)。如果 EF# 永远不拉高,说明读取操作未被识别,或端点内部无数据。

        • FD 总线在 SLOE# 有效期间应有稳定数据输出 (如果不是0x0000)。如果一直是高阻或0,说明没数据输出。






  3. FPGA/MCU 端的 FIFO 控制器:



    • 地址匹配: MCU 必须将 FIFOADR[1:0] 设置为 11 (EP8),并在整个传输过程保持此地址不变 (除非配置了自动切换)。Slave FIFO 模式下地址通常只在初始化时设置一次。

    • SLRD#SLOE# 的驱动:

      • 确保 MCU/FPGA 不是以过高频率切换 SLRD#。尝试将读操作间隔拉大 (如每5ms读一次) 排除速度问题。

      • SLRD# 必须是干净的负脉冲,避免毛刺。


    • 数据总线: 检查 MCU 是否将 FD[15:0] 配置为输入模式。Slave FIFO 读操作时 FX2LP 驱动总线。




  4. 数据流与端点状态:



    • 验证数据是否到达 EP8:

      • 使用 Cypress Suite 工具监视: 连接设备后,在 Control Center 打开 EP8 OUT 端点,手动发送数据包。观察 DEBUG 标签下 EP8FIFOBCH/L 是否增加。如果上位机发数据后 BCH/L 不增加,说明数据未到达端点缓冲区 (可能是固件端点配置错误、USB 枚举问题、驱动程序问题)。

      • 检查 EPxBCL/H 寄存器: 固件可在 DEBUG 模式读取 EP8BCH/LOUTPKTENDCNT 等寄存器判断是否有数据提交给硬件 FIFO。







重点注意事项



  1. SYNCDELAY 宏: 所有访问核心寄存器的操作 必须SYNCDELAY; 隔开,尤其 FIFO 配置/复位操作。

  2. FX2LP 主频: 固件必须运行在内部或外部有效时钟 (如 48MHz IFCLK)。

  3. 端点缓冲区管理:

    • AutoOUT 模式: 固件设置 EP8AUTOINLENH = 0x80;(512字节),FX2LP 自动提交缓冲区。通常推荐。

    • 手动模式: 固件需在每次准备好接收新数据时,执行 OUTPKTEND。MCU 读数据不会自动释放缓冲区给主机。


  4. FLAG 更新延迟: 异步模式下,EF# 更新有延迟。SLRD# 上升后 需等待数个 IFCLK 周期 EF# 才会变高。不要期望立即改变。

  5. IO 电平匹配: MCU 与 FX2LP 的电压是否一致?5V容忍?确保逻辑电平有效。




解决步骤建议



  1. 固件端验证:

    • 使用官方 SlaveFifo 示例固件 (如 slavefifoOUT) 下载测试。排除自定义固件配置错误。

    • Control Center 测试: 用工具确认主机数据能正常发送到 EP8。


  2. MCU/FPGA 端:

    • 简化读逻辑: 改为手动触发一次读取 (按钮触发),并用 示波器严格检查时序

    • 检查 FIFOADR 和极性配置。


  3. 联合调试:

    • 测量关键信号: 示波器同时抓取 IFCLK, EF#, SLCS#, SLOE#, SLRD#, FD[0],观察数据何时被驱动、EF# 何时更新。

    • 检查 EP8FIFOBCH 变化: 主机发送后,固件打印该寄存器值,确认数据实际写入 FIFO。





参考资料



  • CY7C68013A Datasheet:

    • 第 9 章: Slave FIFOs

    • 第 10 章: FIFO Registers (重点:EPxCfg, FIFOPinPolar, PinFlagsAB/CD, EPxFifoCFG)

    • 第 11 章: Programming Considerations (同步延迟,FIFO复位流程)


  • AN61345 - EZ-USB® FX2LP™ Slave FIFO Interfaces

  • Cypress Suite 安装包中的 slavefifo 工程示例 (C:CypressUSBTargetDriversSlaveFifo)




总结诊断思路



数据完全卡在端点缓冲区,未被外部MCU读走 → EF#不更新 → SLRD#信号未被正确识别或端点压根无数据。


优先检查:



  1. 固件端点配置: EP8是否设为ASYNC Slave FIFO OUT? 执行FIFO Reset流程了吗?

  2. MCU时序: SLRD# 是否产生干净、足够宽度(>30ns)的负脉冲? 检查SLOE#SLRD#时序,务必用示波器验证。

  3. 数据存在性: 主机发数据后,FX2LP的EP8BCH/L寄存器是否增大? (固件打印/Suite工具监测)



按此方法逐步排查,必能定位故障点!建议先用Cypress Suite和示波器联合验证数据流与信号完整性。

举报

更多回帖

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