整个系统的工作原理:主机通过应用软件设置将相应的测试指令和数据经USB总线下载到68013A内部FIFO中,按照同件代码配置相关寄存器、端口和中断,实现与FIFO和FPGA的数据通信。外部使用两片FIFO匹配数据传输速率,由外部控制信号RD(或RD2)/WR(或WR2)来控制数据的读/写。为防止数据的空读或写溢出,用标志端EF和HF标明FIFO状态。这种内外FIFO双缓冲设计为大容量、高速数据传输提供更大的缓冲空间和时序匹配。 FPGA从FIFO1接收数据的同时,按照从PE口收到的Status[7:0]指令,判断所接收数据的类型和职能,将数据传输到相应的测试调理和输出电路,执行相应操作,判断被测试对象的工作情况;如从PE端口收到的是自检命令,则将测试数据回采,判断系统自身工作情况。被测试对象反馈的信号和测试采集的数据,自检数据经FPGA数据融合处理,从FIFO2传到68013A的GPIF接收端口,所有CY7C68013A的内部数据和端口操作全部由固件程序描述。
4 固件程序设计
68013A固件负责处理主机各种USB设备请求,控制68013A与外围电路FPGA进行数据传输,协调主机和FPGA 之间的通信。设计利用Cypress公司生产的EZ-USB固件程序框架,其中包括初始化、处理USB设备请求、中断和USB电源管理等任务,固件的编译在KeilμVision2的集成开发环境中进行。68013A固件设计流程如图3所示。该设计主要包括5个部分:fw.c(框架源文件)、 periph.c(用户任务调度函数文件)、dscr.a51(描述符表)、USBJmpTb.OBJ(中断跳转表)、Ezusb.lib(EZ_USB 库文件)。用户仅需对dscr.a51和pe-riph.c修改文件中部分代码即可完成USB设备的各种功能。periph.c文件通过调用任务分配、标准设备请求和中断处理等函数来处理USB事件。其中主要修改TD_Init()和TD_Poll()两个任务分配函数。TD_Init()函数用于负责初始化端点状态变量,配置外围I/O接口及设置端口初始值。TD_Poll()主要是初始化功能寄存器,并对设备进行重新列举,完成主机对设备的配置任务;执行过程中响应中断,对中断作相应处理并控制外围电路。