本站小编为你精心准备了USB接口设计论文参考范文,愿这些范文能点燃您思维的火花,激发您的写作灵感。欢迎深入阅读并收藏。
1EZ⁃usbFX2CY7C68013A固件程序设计
CY7C68013A固件程序是指在EZ⁃USB芯片内部RAM中运行的程序代码,固件程序是USB接口设计的核心部分。固件代码的作用就是控制芯片执行指定的设备功能,即处理上位机下传的各种USB设备请求,控制芯片与外围电路进行数据传输。EZ⁃USB芯片内部集成增强型8051内核,USB芯片的固件程序实际上就是单片机程序文件,可以采用汇编语言或C语言编写。CYPRESS公司提供的EZ⁃USBFX2固件程序开发包中提供了固件程序的基本框架,这为用户开发基于EZ⁃USBFX2芯片的USB设备提供了很大的方便。
1.1固件框架固件程序框架主要包括设备初始化,处理标准USB设备请求和USB挂起时的电源管理等。程序框架使用KeilC51编写,它是现成的直接可以编译为HEX文件的8051程序代码,使用者只需要改写USB描述表,在一些固定函数下添加功能代码,主要是EZ⁃USB芯片的初始化配置和实现USB外设功能的代码。固件框架的流程图如图2所示[4]。复位后固件先初始化一些全局变量,然后调用初始化函数TD_Init(),该函数初始化USB设备到没有配置的状态,并打开中断。循环1s进行一次设备重枚举,直到端点0收到一SETUP包,然后进入while循环语句,开始TD_Poll任务处理函数。依次执行下列过程:(1)TD_Poll()用户任务调度函数;(2)如果发现USB设备请求,则分析该请求并执行;(3)如果收到USB挂起信号,则调用TD_Suspend()挂起函数,内核挂起,直到出现USB远程唤醒信号,调用TD_Resume(),内核唤醒,从新进入while循环。固件框架包含的文件如表1所示。
1.2固件代码编写USB固件程序主要的功能有2个:一是PC机的Windows系统能够检测与识别相应设备;二是数据的上传与下传。Cypress公司为EZ⁃USBFX2系列芯片提供的固件程序框架极大的简化了固件开发。一般的固件开发只需要修改用户调度函数文件Periph.c与USB描述符列表文件Dscr.a51,这两个文件在KeilC51编程器中都可打开。Periph.c文件中只需要修改TD_Init()与TD_Poll()函数。在本设计中为了能进行高速的数据传输,EZ⁃USB芯片采用SlaveFIFO接口方式。此方式下,USB内核不参与数据的传输,所以TD_Poll()函数不用写代码,设置成空函数就可以了。这样USB固件程序的开发主要任务就是改写TD_Init()函数与USB描述符列表文件Dscr.a51。在本设计中配置端点6传输方向为IN,传输方式为块传输,缓冲大小设置为1024B,深度为2级,作用是上传采集的数据。配置端点2传输方向为OUT,传输方式为块传输,缓冲大小设置为1024B,深度为2级,作用是下传FPGA的命令配置参数。固件程序的编译使用KeilμVision2集成编译环境,集成编译环境中包括有C51编译器,A51汇编器等工具与调试器。代码中还需包含头文件FX2.h与Fx2regs.h,库文件Ezusb.lib。对修改后的代码进行编译与链接,最后生成HEX文件。HEX文件可直接下载到EZ⁃USB中运行。HEX文件也可根据需要通过CYPRESS公司提供的EZ⁃USBFX2固件开发包中的Hex2bit.exe应用工具生成IIC文件,IIC文件用于烧写到EEPROM中。
2固件程序的装载
CY7C68013A芯片集成增强型8051内核,内部无ROM等永久性存储器,每次上电后需要从新将固件程序载入到片内RAM中。EZ⁃USBFX2固件程序有3种加载方式:(1)如果没有片外存储器连接到EZ⁃USBFX2上,或者所读取的首字节不是0xC0或0xC2,则芯片枚举为缺省的USB设备,其中描述符,VID,PID由芯片内部硬件逻辑提供。然后固件程序与描述符表由主机下载,EZ⁃USBFX2开始执行下载的代码,首先模拟物理电路的断开与连接,此时EZ⁃USBFX2将再次进行设备枚举,这称为重枚举,重枚举将根据下载的代码对设备进行从新定义。(2)如果USB检测到一个E2PROM,其首字节为0xC0时,芯片也枚举为缺省的USB设备,但VID与PID值将从此EEPROM中读取,USB描述符由芯片内部提供。这种模式称为“C0”加载。主机根据读得的VID与PID值,由固件下载驱动程序将指定的固件程序下载到EZ⁃USBFX2,然后再重枚举。(3)如果USB检测到一个E2PROM,其首字节为0xC2时,固件程序将从此E2PROM中自动下载到FX2芯片上,CPU通过复位后运行下载的程序代码。这种模式称为“C2”加载。其中第一种方式主要是开发阶段使用,它需要主机上有CYPRESS公司提供的开发软件USBCONTROLPANEL,每次手动将程序下载到USB上。第二种方法需要开发者另外再编写一个固件下载驱动程序,而且也需要在电路中外加一小容量的E2PROM。第3种方法是将固件程序烧写到E2PROM中,每次上电自动加载,这种方式简单直接。本设计采用第3种方式。
3驱动程序及INF文件的编写
设备驱动程序是应用程序和硬件之间的连接,应用程序通过驱动程序与设备通信,数据交换,从而获取数据和对设备进行控制。CYPRESS公司为EZ⁃USBFX2提供一通用的驱动程序CYUSB.SYS,其功能完备,使用者不需要修改直接使用[5]。USB设备都具有一个VID和PID,此处的VID和PID与在固件程序转载阶段的值不同,这两个值是用来安装设备驱动程序的,VID和PID放到设备描述符表中,通过设备请求读入到Windows系统中。同时,Win⁃dows操作系统通过INF文件将一VID和PID绑定到某一设备驱动程序。当设备连接到主机上时,读得设备的VID和PID,通过存储在INF文件中的信息找到设备驱动。此后,Windows会将设备的VID和PID值保存到注册表,设备再次连接时,系统就会在注册表中查找设备驱动程序信息。具体操作方法是将驱动安装的模板INF文件的MODEL节中的VID与PID值修改成与USB设备的VID和PID值相同。相应STRING节中也修改。
4与应用程序的接口
图3是驱动程序流程图,从图中可以看到功能驱动程序的位置。用户通过一种规范的方式调用WIN32API函数来访问硬件,不用考虑如何控制硬件的具体细节。USB开发过程主要应知道应用程序调用驱动程序的接口函数,如下介绍,应用程序直接调用这些函数来实现与硬件设备的数据交换。CREATEFILE通过设备名打开设备,获得设备句柄,有设备句柄就可以读写设备。通过下面语句获得设备句柄。DEVICEIOCONTROL读写控制设备,应用程序调用此函数并加以不同的I/O控制码参数,完成应用程序与驱动程序将的数据交换。主要用到的I/O控制码有:IOCTL_EZUSB_BULK_READ该控制码从指定的批量管道中读取数据。读操作阻塞调用进程,直到数据传送完成。IOCTL_EZUSB_BULK_WRITE该控制码向指定的批量管道中写入数据。写操作阻塞调用进程,直到数据传送完成。CLOSEHANDLE通过句柄关闭设备,设备请求完成后通过此函数关闭。
5结语
本文基于实际的USB接口应用开发,较详细地介绍了EZ⁃USBFX2芯片的固件编写,代码下载方式,设备驱动程序安装,上位机程序对硬件的控制方法,并给出相应的代码。采用EZ⁃USBFX2芯片开发USB接口在很大程度上降低了开发的难度,缩短开发周期,从而大大提高用户的开发效率。
作者:王东李公平潘小东方登富单位:兰州大学核科学与技术学院