黄国忠
(哈尔滨威克科技股份有限公司,黑龙江 哈尔滨 150000)
现在我们讨论一种基于USB 协议的高速图像数据传输方法。该方法以接口芯片CY7C68013A 为数据传输核心,解决了计算机和外设之间高速、大容量的图像传输问题。
传统的图像传输普遍采用由PC 机主板所提供的各类接口来实现,如PCI 接口、EPP接口、IEEE 1394 接口等。以上三种接口分别存在无法作电磁屏蔽,传输慢,与外围PC 无法兼容的等缺点。
该系统基于USB 总线技术,将CY7C68013A 芯片的Slave FIFO 块传输接口模式和FPGA 技术相结合,实现了计算机与外设之间高速的图像数据传输。
USB 接口单元的主要芯片是CY7C68013A,负责完成硬件系统与PC 之间的图像传输。它与外设有三种接口方式:端口模式、可编程接口GPIF 和Slave FIFO。Slave FIFO 方式是从机工作方式,在具有外部数据处理逻辑的设备中,USB 数据在主机和外部逻辑设备中传输,通常不需要FX2LP的CPU参与,而是经过FX2LP 内部端点FIFO 来传输。外部控制器可对多个端点的FIFO 选择读写。FX2LP的Slave FIFO 工作方式可设为同步或异步;工作时钟均可由内部产生或外部输入。基于该系统处理的是高速图像的传输,需要外部控制器直接对FIFO 进行控制,故采用从机,即Slave FIFO 方式。
高速图像传输的原理:首先图像可由计算机上层应用软件发送或者接收,再通过USB 接口芯片连接高速缓存。
USB 接口采用CY7C68013A 芯片的SlaveFIFO 接口模式,使得上层PC 与缓冲器之间能够高速通信,并利用FPGA 控制USB的高速传输。CY7C68013A的主要功能信号及与FPGA 之间的握手信号。IFCLK 为时钟信号,可以选择由外部输入或者内部输出;FIFOADR[1:0]引脚选择 4 个 FIFO(2,4,6 或 8)中的一个与USB 数据总线FD 连接。定义该系统中上行数据传输为FIFOADR[1:0]=10,即为EP6 端口;下行数据传输为FIFOADR[1:0]=01,即为EP2 端口。FLAGB,FLAGC 为所选择FIFO的标志信号,FLAGB 代表FIFO 为满;FLAGC 代表FIFO 为空;默认低电平有效。FPGA 可以通过不断查询这两个标志信号决定是否进行读或写操作。SLOE 为读/写使能信号;SLWR,SLRD 分别为读写控制信号,在同步和异步模式下,控制信号不一;FD[15:0]为16位的双向数据总线。PA0,PA1 为输出信号,作为硬件系统工作状态的控制信号。
图像传输系统的软件设计主要包括三个部分:固件程序设计、驱动程序设计和计算机上层应用软件。固件程序是硬件中的软件部分,主要包括初始化、处理标准的USB 设备请求以及USB 挂起时的电源管理等。固件首先初始化内部的状态变量,然后调用用户初始化函数TD_Init()从该函数返回后,固件初始化USB 接口到未配置状态并使能中断然后每间隔进行一次设备重枚举直到端点0 接收到一个SETUP 包。一旦检测到SETUP 包,固件函数将开始交互下述任务调度:调用用户函数TD_Poll();判断是否有标准设备请求等待处理。如果有,分析该请求并响应;判断USB 内核是否收到USB 挂起信号。如果有,则调用用户函TD_Suspend()。从该函数成功返回TRUE 值后,在检测是否发生USB 唤醒事件。如果未检测到,则处理器进入挂起方式;如果有,则调用用户函数TD_Resume(),程序继续运行。如果从TD_Suspend 函数返回FALSE,则程序继续进行。TD_Init 函数负责CY7C68013A 进行初始化,首先设置时钟为48 MHz,然后设置芯片工作于从属FIFO 块传输模式,并配置端点6 工作于自动块传输IN,端点2 自动块传输OUT 模式。其主要程序段如下:
图1 接收机应用程序流程图
DR_VendorCmnd 函数负责处理上位机发出的用户自定义请求,通过控制PA0,PA1的高低电平,以控制整个硬件系统的运行。该系统中,使用0xB3 使PA0 置低进行图像数据的上行操作,用0xB4 使PA0 置高进行图像数据的下行操作,使用0xB5 使PA1 置低来通知硬件开始传输,使用0xB6 请求使PA1置高以通知硬件系统停止传输。USB 设备驱动程序负责建立起主机端和设备端的联系。驱动程序主要有两个:一是开机自动将固件程序下载至芯片RAM 中,以由增强性8051执行。结合CYPRESS 开发包EZ-Loader Drivers 以及HEX2C 和Windows DDK 即可生成所需要固件自动下载程序*.sys 文件。二是完成上位机应用程序和硬件设备之间的数据传输。其主要包括驱动程序入口例程、即插即用例程、分发例程、电源管理例程和卸载例程。本系统根据通用驱动结合自身需要,在DDK 环境下修改编译,生成自己需要的驱动程序。USB 上层应用程序都通过I/O 控制来访问设备驱动程序。上层应用程序首先通过调用Win32 函数CreaFile()来取得访问设备驱动程序的句柄;然后应用程序使用Win32函数DeviceIo-Control()来提交I/O 控制码,并且为CreaFile()函数返回的设备句柄设置I/O缓冲区。该系统中,设置USB 端口缓冲区FIFO 为1 024 B,端口非空即读取,保持了传输的连续性,并且每次以帧结构包形式传输,每包的大小为512 B。以实验中为例,每传输大小为245 KB的一幅图像,需要490 个包进行传输。接收端应用程序流程图如图1 所示。发送端应用程序流程类似,少了判断图像是否完整一幅,而多了传输完毕之后的图像数据校验。
接收端应用程序流程图如图1 所示。发送端应用程序流程类似,少了判断图像是否完整一幅,而多了传输完毕之后的图像数据校验。
[1]赵鞭,唐俊,徐兴.基于USB2.0的高速图像传输系统设计[J].电子测试,2009-11-06.