USB论坛
直播中

戚歆敦

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

使用CY7C68013A GPIF和FIFO的疑问求解

   我想把这样使用 CY7C68013A 的GPIF 和 FIFO功能:
1. 两路数据传输,CY7C68013都作为从机接收数据
2. 每一路都数据格式为:1个clock pin,8个数据pin
3. 数据速率为9MHZ
4. 接收到的数据都通过USB传输到PC电脑上
请问上述功能能做到吗?能的话需要有什么特殊注意的地方吗?有相关例程吗?
                                                                                                                                                                        

回帖(1)

尚文清

2025-6-9 18:10:50

基于你的需求,这里是对使用 CY7C68013A (FX2LP) 实现双路 9MHz 数据接收并通过 USB 传输到 PC 的可行性和注意事项的分析:


核心结论:理论上可以实现,但挑战很大,且需要深度定制,无现成例程完全匹配




  1. 技术可行性:



    • GPIF/FIFO能力: FX2LP 的设计主要用于 单路 高速数据传输 (Slave FIFO 或 GPIF Master)。GPIF 本身是一个高度灵活的 串行执行 的状态机,一次只能处理一个数据流的方向和时序。

    • 双路并行接收: 这是最大的难点。你希望两路独立时钟(各 9MHz)和数据(各 8 bit)同时输入。

      • 物理连接: 芯片有足够的 I/O 引脚连接两路的 CLK(2个)和 DATA(16个)。

      • 逻辑处理: FX2LP 的 GPIF/FIFO 控制器核心本质上是单线程的。它无法同时响应两个完全独立的、异步的时钟源进行数据接收到两个不同的 FIFO 缓冲区。GPIF 状态机一次只能被一个触发条件(如一个 FIFOADRREADY 信号)驱动执行。


    • 数据速率:

      • 单路带宽:9 MHz * 1 Byte = 9 MB/s

      • 总带宽:18 MB/s。

      • USB 2.0 高速 (480 Mbps) 理论最大 约 53 MB/s,实际有效 通常在 30-45 MB/s 之间。18 MB/s 在 USB 有效带宽范围内。理论上 USB 带宽足够

      • 内部 FIFO 带宽: FX2LP 内部 FIFO 在最优配置下可以达到 96 MB/s (16-bit, GPIF Master)。即使两路加起来 18 MB/s,FIFO 带宽也不是瓶颈





  2. 实现路径与巨大挑战:




    • 方案 A:尝试用 GPIF 模拟双路从机接收 (最复杂且风险最高)



      • 思路: 编写极其复杂的 GPIF 波形描述符,试图通过条件跳转 (基于 CTL / RDY 信号) 在两个 FIFO (FIFOADR) 和两套时序/控制信号之间快速切换。

      • 核心问题:

        • 异步时钟与同步难题: 两个外设的时钟是独立/异步的。GPIF 运行在 IFCLK (典型 30MHz 或 48MHz)。尝试在 9MHz 外部时钟边沿采样不同源的 8-bit 数据,同时在两者之间切换而不丢失任何一个时钟边沿的数据,非常非常困难,几乎不可能稳定实现。状态机切换延迟会导致漏采数据或时序冲突。

        • 仲裁逻辑缺失: FX2LP 没有内置硬件仲裁器来解决两个外部主机同时请求写入其 FIFO 的冲突。

        • 中断/状态更新: GPIF 在执行描述符时无法轻易中断来处理另一个数据流,状态机按节拍执行。


      • 结论:不推荐。 极难稳定工作,可靠性差。




    • 方案 B:使用两个 PORT (非 GPIF/FIFO) - 此路不通



      • 想法: 用 PORT A/B/C/D 的普通 GPIO 模式。

      • 问题: 无法实现 9MHz 的稳定采样和 FIFO 缓冲。普通 GPIO 没有 FIFO 缓冲或 DMA 支持,需要 CPU 轮询或中断。CPU 最高 48MHz,处理单端口 9MHz 轮询就几乎耗尽资源(一个周期 111ns,CPU 执行一条指令都需要几十 ns),更别提两路完全不可行




    • 方案 C:单 GPIF/Slave FIFO 接口,外部分时复用/仲裁 (较实际)



      • 思路:

        1. 使用外部的 FPGA/CPLD 或逻辑器件作为仲裁器和数据整合器

        2. 外部逻辑:

          • 接收两路独立的数据流(CLK1+ DATA1, CLK2+DATA2)。

          • 使用一个更高频率的时钟(>> 18MHz,例如 48MHz 或 72MHz)。

          • 将两路数据串行化或交织成单路数据流(例如,将 DATA1 和 DATA2 交替,或在每个 IFCLK 周期发送两路数据,或者定义一个共享总线协议)。

          • 根据共享总线协议(可能引入 RDYCTL 信号),用 IFCLK 输出整合后的数据流给 FX2LP。


        3. FX2LP 配置为 Slave FIFO 输入模式或 GPIF Master 输入模式。GPIF 波形变得相对简单,因为它只需要处理一个时钟 (IFCLK) 和一个逻辑上合并的数据流。


      • 优点: 克服了 FX2LP 无法原生处理双异步时钟源的难题。外部仲裁/整合是解决此类问题的标准方法。

      • 缺点:

        • 需要增加额外的硬件(FPGA/CPLD/逻辑芯片)。

        • 设计复杂度转移到外部逻辑,需要设计该逻辑及其与 FX2LP 的接口。

        • 在合并数据流中需要定义帧结构(标记哪个数据属于哪一路)或保证顺序性。


      • 结论:最可行、最可靠的方法。 利用 FX2LP 的单路高速 Slave FIFO/GPIF 能力,通过外部逻辑解决多路整合。




    • 方案 D:两个 FX2LP 芯片



      • 思路很简单,每个通道用一个独立的 FX2LP 芯片。

      • 问题:

        • 成本翻倍。

        • PC 端需要识别和管理两个独立的 USB 设备/端点。

        • 系统集成更复杂。


      • 结论: 在方案 C 不可行时可以考虑(比如无法加入外部逻辑),但非首选。






  3. 特殊注意事项 (针对方案 C,这是主要推荐方案):



    • 带宽保证: 确保合并后单路数据流的速率 IFCLK * BusWidth <= FX2LP FIFO 吞吐能力 (在所需配置下) 和 USB 有效带宽。18 MB/s 在 USB 2.0 高速下通常可行,但需考虑驱动效率和实际传输。

    • 外部逻辑设计: 外部整合逻辑需要可靠处理两路独立时钟域(CLK1, CLK2)到内部工作时钟域(>18MHz)的同步和可能的数据缓存/队列,避免溢出。通常需要 FIFO 或双缓冲。

    • 信号完整性: 9MHz 虽然不算极高,但并联在 PCB 上的时钟线和数据线走线仍需注意长度匹配、阻抗控制和串扰。尤其是如果使用 FX2LP 的 Slave FIFO 模式(SLRD/SLWR/IFCLK 需严格同步)。

    • IFCLK 来源: 通常使用 FX2LP 输出的 IFCLK(比如 30MHz 或 48MHz)同步外部逻辑和 FX2LP。确保外部逻辑能在这个频率下可靠工作。

    • 数据打包: 需要设计合并数据流的格式。在 USB 固件和 PC 驱动/应用程序端需要解释此格式以分离出两路原始数据。

    • GPIF 波形/Slave FIFO 配置: 配置会相对简单,类似于标准的输入传输。

    • 固件优化: 确保固件(TD_Poll())和驱动能高效地将数据从端点 FIFO 通过 USB 传输出去,避免 FIFO 溢出。批量传输通常足够,但需要正确设置数据包大小。

    • 电压电平: 确保所有连接信号(CLKx, DATAx, IFCLK, FD[15:0], CTL, RDY)的电压电平兼容(FX2LP I/O 是 3.3V)。

    • 引脚分配: 仔细规划 FX2LP 的引脚连接,将 FD[15:0], CTL[5:0], RDY[5:0], IFCLK 分配给整合数据流、控制信号和同步时钟。




  4. 相关例程:



    • Cypress FX2LP SDK(现在归 Infineon)提供了丰富的示例。虽然没有直接匹配你双路独立时钟需求的例程,但以下示例非常相关:

      • SlaveFifo 示例: 这是基础。展示如何将 FX2LP 配置为 Slave FIFO(8-bit 或 16-bit)。你需要理解如何配置输入模式、FIFOPINPOLARAUTOIN/OUTLEN 等寄存器,以及如何处理 EP2/4/6/8 FIFO。

      • GpifSnglGpifApp 示例: 展示如何设计 GPIF 波形描述符(使用 GPIF Designer 工具)。即使你最终采用 Slave FIFO 模式或需要修改 GPIF 波形,理解这些示例也是必要的。


    • 你需要做的是:

      • 基于 SlaveFifo 或简单的 GPIF 输入波形示例作为起点。

      • 修改固件初始化代码,配置所需的端口、FIFO 和时钟(将 IFCLK 配置为内部 48MHz 输出通常是个好选择)。

      • 根据方案 C,GPIF 状态机或 Slave FIFO 控制的波形/信号会非常简单。主要工作量在外部逻辑的设计数据合并协议的制定

      • 修改固件(TD_Poll())处理从端点 FIFO 读入的合并数据,或者让 PC 端应用程序来处理拆包。

      • 使用 Cypress Suite USB 3.4.7 及更高版本中的 GPIF Designer 工具进行波形设计(如果使用 GPIF Master 模式)。





总结与建议



  1. 直接使用单个 FX2LP 芯片原生支持两个独立的异步 9MHz 数据流接收是极其困难甚至不可能的。主要瓶颈在于其 GPIF/Slave FIFO 引擎无法同时响应两个异步时钟源。

  2. 推荐且最可行的方案是方案 C:使用外部 FPGA/CPLD 或高速逻辑芯片进行数据整合。

    • 外部芯片处理两路异步输入(CLK1+DATA1, CLK2+DATA2)。

    • 在更高的同步时钟 (IFCLK) 下将数据整合/交织成单路数据流。

    • FX2LP 配置为 Slave FIFO 输入或使用简单的 GPIF 输入状态机接收这个合并流。

    • 在固件或 PC 端解析合并流,恢复出两路原始数据。


  3. 实现关键: 成功的关键在于外部整合逻辑的可靠设计和实现。选择一个合适的 FPGA/CPLD 并仔细设计其内部逻辑(跨时钟域处理、同步、数据打包、FIFO管理)和接口时序。

  4. 例程参考: 仔细研究 Cypress SDK 中的 SlaveFifo 示例代码和文档,以及 GPIF 相关的例子和 GPIF Designer 工具文档。这些为你配置 FX2LP 的 FIFO、端点和接口模式提供了基础。但它们不能直接解决双独立时钟源的问题。


综上所述,目标功能可以通过“FX2LP + 外部整合逻辑”的方案实现,总带宽 18MB/s 可行,但需要付出设计和实现外部逻辑的努力。纯 FX2LP 方案(无外部逻辑)用于双路异步接收几乎不可行。 开始前务必认真规划外部逻辑部分的设计。

举报

更多回帖

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