在使用 EZ-USB FX2芯片进行应用开发中,利用其固件框架可以简化开发工作。用户在这个固件框架的基础上只需要再提供一个 USB描述符表,配置一些相关的寄存器,添加所使用的端点接收和发送数据的通信代码,以及控制外围电路的程序代码就可以完成 USB设备的固件开发工作。本设计中采用的固件框架流程图如图 3所示 [5]。
Cypress公司为简化用户开发提供了 EZ-USB固件程序框架。本设计中固件包括五个部分:fw.c(框架源文件)、periph.c(用户任务调度函数文件)、dscr.a51(描述符表)、 USBJmpTb.OBJ(中断跳转表)、Ezusb.lib(EZ-USB库文件),其中主要对 periph.c和dscr.a51
进行了修改。dscr.a51中包含各种描述符,根据设计需要修改了设备的VID、PID。
periph.c中主要包括 TD_PreInit()、TD_Init()和TD_Poll()函数,TD_PreInit()中包含配置外围接口的输入/输出及设置端口初始值的代码。TD_Init()函数负责初始化端点状态变量,而实现数据通信的软件代码包含在TD_Poll()函数中。部分代码如下:
void TD_PreInit(void)
{ PORTACFG = 0x00; OEA = 0xfd; //使能 PA1为输入,其余 PA口为输出 IOA = 0xff;//置 PA口为 ffH IOA |= 0x0C; //由PA2口产生FIFO1的复位信号 PORTECFG = 0x00; OEE = 0xff;} //使能 PE口为状态输出
void TD_Poll(void)
{WORD i; if (PStatus == VCOMMAND_READ) //上位机发出读数命令 {for ( i=0;i<80;i++)
if (!(IOA & 0x02)) break; //等待外部 FIFO2半满 if (i<80) { if (!(EP2468STAT & bmEP6FULL)) //FIFO2半满、EP6不满,读 512字节
{for( i = 0x0000;i < EP6BUFSIZE;i+=16 ){ EXTAUTODAT2 = EXTAUTODAT1; ┆
EXTAUTODAT2 =EXTAUTODAT1;}//一次读出 16字节,加快读数速度设备请求部分修改了 DR_VendorCmnd()函数代码,由于篇幅有限,仅列出一部分。 BOOL DR_VendorCmnd(void) { switch(SETUPDAT[1])
{ case VCOMMAND_START_T: //上位机发出启动监测命令 PStatus = 0x22;//单片机产生 22H的状态信号
= SETUPDAT[1];
+ 1) = 0xaa;
+ 2) = PStatus; EP0BCH = 0; EP0BCL = 3; EP0CS |= bmHSNAK; //确认器件请求握手信号 SYS_MODE = PStatus; //通过 PE口发出相应的状态信号 Break;}
5结论
在弹载测量系统地面测试台的研制中,利用 CY7C68013实现了 USB接口的数据传输,本设计采用的端口模式,虽然与 GPIF模式和 Slave fifo模式相比,传输速率比较低,但对于具备一定单片机基础的开发人员而言,这种模式开发周期短,稳定性强,不失为一种有效的数据传输方式。该固件程序已成功应用到某弹载测量系统地面测试台中,多次试验证明固件运行可靠,数据回读误码率低,满足系统技术要求。