基于EZ?USB FX2的数据采集系统USB接口设计
   来源:现代电子技术     2021年01月22日 08:08

王东+李公平+潘小东+方登富

摘 要: 以CYPRESS公司的EZ?USB FX2芯片为基础,对工业CT数据采集系统的USB接口设计所涉及的几个方面进行了详细的介绍。该设计中为了能提高数据传输的速度,EZ?USB芯片采用Slave FIFO接口方式,在此方式下,USB内核不参与数据的传输。CY7C68013A芯片内部包含有4 KB的可配置端点缓冲区,这是大容量数据传输端点,可配置成不需要8051固件参与就同外围电路完成高速数据传输端。CYPRESS公司提供的EZ?USB固件程序开发包中包含有固件程序的基本框架。在此介绍CY7C68013A芯片的结构和特点,分析EZ?USB FX2固件程序框架,并给出固件程序实例代码,描述固件代码装载方式,应用程序调用驱动程序的接口函数。采用EZ?USB芯片开发USB接口,大大降低开发难度,提高开发效率。

关键词: USB 2.0; EZ?USB; FX2; 固件程序

中图分类号: TN919?34; TP334.7 文献标识码: A 文章编号: 1004?373X(2015)04?0073?04

0 引 言

在锥束工业CT系统中,数据采集系统用来获取探测器输出信号,转换为数字信号上传给计算机做图像重建,同时下传计算机的控制命令,是工业CT的关键部件。通用串行总线(Universal Serial Bus,USB)以其易插拔,无需配置,真正的即插即用等特性获得了广泛的认可,USB 2.0标准其高速传输模式的速率可达480 Mb/s,可以满足数据采集系统的速率要求。本文设计采用CYPRESS公司的EZ?USB FX2系列芯片作为数据采集系统与计算机间的USB接口芯片,具体型号为CY7C68013A[1?2]。数据采集卡整体结构如图1所示,本文只介绍USB接口软硬件设计部分。

USB接口设计主要涉及USB固件程序编写,装载,设备驱动程序的安装,应用程序与驱动程序间的接口等方面。CYPRESS公司提供包含有固件程序框架,通用的设备驱动程序的应用开发包,降低了USB接口的开发难度。下面就USB接口开发所涉及的几个方面进行详细介绍。

1 EZ?USB硬件介绍

CY7C68013A接口芯片是CYPRESS公司EZ?USB FX2系列芯片中的一种类型,它集成了USB2.0协议的微处理器,支持12 Mb/s的全速传输与480 Mb/s的高速传输,完全适用于USB2.0并向下兼容USB1.1。芯片内部集成增强型8051内核,指令周期为4个时钟周期,时钟频率可配置为12 MHz,24 MHz,48 MHz。集成智能SIE(串行引擎接口),由USB 2.0收发器与SIE完成USB协议的封包与解包功能[1]。CY7C68013A芯片内部包含3个固定的,64 B的端点缓冲区,分别是EP0,EP1IN,EP1OUT。EP0是默认的控制传输端点,EP1IN和EP1OUT支持块传输,中断传输与同步传输,此三端点只能由8051内核访问。还有4 KB的可配置端点缓冲区,分别是EP2,EP4,EP6,EP8,它们是大容量宽带的数据传输端点,不需要8051固件参与就同外围电路完成高速的数据传输[3]。这4个端点可以灵活的配置容量,满足多种数据传输要求。

2 EZ?USB FX2 CY7C68013A固件程序设计

CY7C68013A固件程序是指在EZ?USB芯片内部RAM中运行的程序代码,固件程序是USB接口设计的核心部分。固件代码的作用就是控制芯片执行指定的设备功能,即处理上位机下传的各种USB设备请求,控制芯片与外围电路进行数据传输。EZ?USB芯片内部集成增强型8051内核,USB芯片的固件程序实际上就是单片机程序文件,可以采用汇编语言或C语言编写。CYPRESS公司提供的EZ?USB FX2固件程序开发包中提供了固件程序的基本框架,这为用户开发基于EZ?USB FX2芯片的USB设备提供了很大的方便。

2.1 固件框架

固件程序框架主要包括设备初始化,处理标准USB设备请求和USB挂起时的电源管理等。程序框架使用Keil C51编写,它是现成的直接可以编译为HEX文件的8051程序代码,使用者只需要改写USB描述表,在一些固定函数下添加功能代码,主要是EZ?USB芯片的初始化配置和实现USB外设功能的代码。固件框架的流程图如图2所示[4]。

复位后固件先初始化一些全局变量,然后调用初始化函数TD_Init(),该函数初始化USB设备到没有配置的状态,并打开中断。循环1 s进行一次设备重枚举,直到端点0收到一SETUP包,然后进入while循环语句,开始TD_Poll任务处理函数。

依次执行下列过程:

(1) TD_Poll() 用户任务调度函数;

(2) 如果发现USB设备请求,则分析该请求并执行;

(3) 如果收到USB挂起信号,则调用TD_Suspend()挂起函数,内核挂起,直到出现USB远程唤醒信号,调用TD_Resume(),内核唤醒,从新进入while循环。固件框架包含的文件如表1所示。

表1 固件框架文件列表

2.2 固件代码编写

USB固件程序主要的功能有2个:一是PC机的Windows系统能够检测与识别相应设备;二是数据的上传与下传。Cypress公司为EZ?USB FX2系列芯片提供的固件程序框架极大的简化了固件开发。一般的固件开发只需要修改用户调度函数文件Periph.c与USB描述符列表文件Dscr.a51,这两个文件在Keil C51编程器中都可打开。Periph.c文件中只需要修改TD_Init()与TD_Poll()函数。在本设计中为了能进行高速的数据传输,EZ?USB芯片采用Slave FIFO接口方式。此方式下,USB内核不参与数据的传输,所以TD_Poll()函数不用写代码,设置成空函数就可以了。这样USB固件程序的开发主要任务就是改写TD_Init()函数与USB描述符列表文件Dscr.a51。在本设计中配置端点6传输方向为IN,传输方式为块传输,缓冲大小设置为1 024 B,深度为2级,作用是上传采集的数据。配置端点2传输方向为OUT,传输方式为块传输,缓冲大小设置为1 024 B,深度为2级,作用是下传FPGA的命令配置参数。固件程序的编译使用Keil μVision2集成编译环境,集成编译环境中包括有C51编译器,A51汇编器等工具与调试器。代码中还需包含头文件FX2.h与Fx2regs.h,库文件Ezusb.lib。对修改后的代码进行编译与链接,最后生成HEX文件。HEX文件可直接下载到EZ?USB中运行。HEX文件也可根据需要通过CYPRESS公司提供的EZ?USB FX2固件开发包中的Hex2bit.exe应用工具生成IIC文件,IIC文件用于烧写到EEPROM中。

初始化函数代码及注释如下:

3 固件程序的装载

CY7C68013A芯片集成增强型8051内核,内部无ROM等永久性存储器,每次上电后需要从新将固件程序载入到片内RAM中。EZ?USB FX2固件程序有3种加载方式:

(1) 如果没有片外存储器连接到EZ?USB FX2上,或者所读取的首字节不是0xC0或0xC2,则芯片枚举为缺省的USB设备,其中描述符,VID,PID由芯片内部硬件逻辑提供。然后固件程序与描述符表由主机下载,EZ?USB FX2开始执行下载的代码,首先模拟物理电路的断开与连接,此时EZ?USB FX2将再次进行设备枚举,这称为重枚举,重枚举将根据下载的代码对设备进行从新定义。

(2) 如果USB检测到一个E2PROM,其首字节为0xC0时,芯片也枚举为缺省的USB设备,但VID与PID值将从此EEPROM中读取,USB描述符由芯片内部提供。这种模式称为“C0”加载。主机根据读得的VID与PID值,由固件下载驱动程序将指定的固件程序下载到EZ?USB FX2,然后再重枚举。

(3) 如果USB检测到一个E2PROM,其首字节为0xC2时,固件程序将从此E2PROM中自动下载到FX2芯片上,CPU通过复位后运行下载的程序代码。这种模式称为“C2”加载。

其中第一种方式主要是开发阶段使用,它需要主机上有CYPRESS公司提供的开发软件USB CONTROL PANEL,每次手动将程序下载到USB上。第二种方法需要开发者另外再编写一个固件下载驱动程序,而且也需要在电路中外加一小容量的E2PROM。第3种方法是将固件程序烧写到E2PROM中,每次上电自动加载,这种方式简单直接。本设计采用第3种方式。

4 驱动程序及INF文件的编写

设备驱动程序是应用程序和硬件之间的连接,应用程序通过驱动程序与设备通信,数据交换,从而获取数据和对设备进行控制。CYPRESS公司为EZ?USB FX2提供一通用的驱动程序CYUSB.SYS,其功能完备,使用者不需要修改直接使用[5]。

USB设备都具有一个VID和PID,此处的VID和PID与在固件程序转载阶段的值不同,这两个值是用来安装设备驱动程序的,VID和PID放到设备描述符表中,通过设备请求读入到Windows系统中。同时,Windows操作系统通过INF文件将一VID和PID绑定到某一设备驱动程序。当设备连接到主机上时,读得设备的VID和PID,通过存储在INF文件中的信息找到设备驱动。此后,Windows会将设备的VID和PID值保存到注册表,设备再次连接时,系统就会在注册表中查找设备驱动程序信息。具体操作方法是将驱动安装的模板INF文件的MODEL节中的VID与PID值修改成与USB设备的VID和PID值相同。相应STRING节中也修改。

[Cypress]

%VID_04B5&PID_1015.DeviceDesc%=CYUSB, USB\VID_04B5&PID_1015

5 与应用程序的接口

图3是驱动程序流程图,从图中可以看到功能驱动程序的位置。用户通过一种规范的方式调用WIN32API函数来访问硬件,不用考虑如何控制硬件的具体细节。USB开发过程主要应知道应用程序调用驱动程序的接口函数,如下介绍,应用程序直接调用这些函数来实现与硬件设备的数据交换。CREATEFILE 通过设备名打开设备,获得设备句柄,有设备句柄就可以读写设备。通过下面语句获得设备句柄。

DEVICEIOCONTROL 读写控制设备,应用程序调用此函数并加以不同的I/O控制码参数,完成应用程序与驱动程序将的数据交换。

主要用到的I/O控制码有:IOCTL_EZUSB_BULK_

READ 该控制码从指定的批量管道中读取数据。读操作阻塞调用进程,直到数据传送完成。IOCTL_EZUSB_

BULK_WRITE 该控制码向指定的批量管道中写入数据。写操作阻塞调用进程,直到数据传送完成。CLOSEHANDLE 通过句柄关闭设备,设备请求完成后通过此函数关闭。

6 结 语

本文基于实际的USB接口应用开发,较详细地介绍了EZ?USB FX2芯片的固件编写,代码下载方式,设备驱动程序安装,上位机程序对硬件的控制方法,并给出相应的代码。采用EZ?USB FX2芯片开发USB接口在很大程度上降低了开发的难度,缩短开发周期,从而大大提高用户的开发效率。

参考文献

[1] 薛圆圆,赵建领.USB应用开发实例详解[M].北京:人民邮电出版社,2009.

[2] 苟新运,张禹,季仲梅.USB 2.0接口芯片CY7C68013的固件程序开发[J].微计算机信息,2005,21(4):182?183.

[3] 钱峰.EZ?USB FX2单片机原理、编程及应用[M].北京:北京航空航天大学出版社,2006.

[4] 呼媛,李自田,胡炳梁,等.EZ?USB FX2固件与设备驱动程序开发[J].微计算机信息,2010,26(20):162?164.

[5] 王辉,张小超,李良.基于EZ?USB FX2芯片的USB驱动程序设计[C]//中国农业机械学会2006年学术年会论文集.北京:中国农业学会,2006:1074?1076.

[6] 黄建斌,邱河波,戴祥.基于EZ?USBFX2的LED点阵图文显示屏[J].现代电子技术,2010,33(2):34?37.

文章 芯片 设备