基于端口模式的CY7C68013固件程序设计
扫描二维码
随时随地手机看文章
1引言
通用串行总线( USB)自从 1994年由微软等公司共同提出到现在人们所熟知的USB2.0,USB技术不断发展成熟。由于具有传输速度快、支持热插拔、即插即用、扩展性强等诸多优点,USB已经被广泛应用于各种 PC标准外设和用户自定义开发设备中。正是由于 USB拥有其他接口(如并口、串口)无法比拟的优势,将 USB接口应用到弹载测量系统地面测试台的设计中,其通用性可扩展性强,能够提高读数速度、简化电路设计及驱动程序开发。
完整的 USB系统除了硬件电路外,还包括驱动程序、单片机固件程序。固件是 USB系统的核心,它要响应各种来自系统的 USB设备请求,完成各种数据的交换工作和事件处理,直接影响到 USB接口的数据传输速度[1]。因此,固件程序的编写是开发 USB设备的关键环节。
本测试台上采用的是Cypress公司的EZ-USB FX2系列单片机 CY7C68013。实现 USB接口的数据通信,CY7C68013可以配置为3种模式:端口模式、 GPIF和Slave FIFO[2]。后两种模式由于使用FX2的管道连接方法,单片机的 CPU不参与数据传输,提高了数据传输速率,从而广泛应用于图像、视频信号采集等大批量数据的传输中。但使用这两种模式进行 USB设备的开发相对较复杂,开发周期长。至于端口模式,文献中很少有介绍,由于这种模式下 CPU参与了数据传输,因此传输速率相对较慢 [3],不过端口模式开发简单,可以降低工程人员的开发难度,缩短开发周期。本测试台中传输数据量较少,传输速率也要求不高,因此本设计采用端口模式。 测试台系统总体框图弹载测量系统地面测试台由模拟信号源、数字信号源、图像信号源、 PCM码解调模块、实时监测等几部分组成,系统总体框图如图 1所示。
500)this.style.width=500;" border="0" />
上位机通过 USB接口分别下载模拟量、数字量及图像数据到各自的信号源存储器中,而解调出的PCM码数据和实时监测数据也是经由 USB接口读回到上位机,从而实现了USB接口的双向数据传输。 3硬件连接
CY7C68013与外围电路连接如图 2所示。
500)this.style.width=500;" border="0" />
测试台下载信号源数据时,USB单片机将数据先写入 FIFO1中,FPGA(XC2S50)通过判断 FIFO1的空信号将数据读出;而回读时 FPGA将数据写入 FIFO2,当 FIFO2半满时, USB单片机产生 FIFO2的读信号将数据读出送至上位机。USB单片机通过 PE口产生不同的状态信号(Status[7:0])使系统进行上述不同操作。 4固件程序设计
所有基于微控制器及其外围电路的功能设备的正常工作都离不开固件的参与,固件程序是基于微控制器设备运行的核心。固件设计的目标就是控制硬件来完成预期的设备功能。USB设备也不例外,用户必须编写固件程序来辅助硬件完成USB通信任务。CY7C68013芯片的固件程序负责处理上位机发来的各种 USB设备请求,并负责控制 CY7C68013与外围电路进行数据传输,其工作主要包括以下几点[4]:
(1)初始化工作,包括设置一些特殊功能寄存器的初值以实现所需的设备属性或者功能; (2) 对设备进行重新列举(ReNumeration),主要的工作有:模拟设备的断开与重新连接、对接收到的设置包进行分析判断、对主机的设备请求作出适当的响应,完成主机对设备的配置任务;
(3)响应中断,并对中断作相应的处理。USB接口在设备列举、响应主机标准请求和厂商请求、数据传送等动作过程中都会向微控制器申请中断,因此微控制器必须正确处理这些中断才能保证 USB传输的正常进行;
(4)数据的接收与发送。USB设备的主要任务就是进行数据的接收和发送,因此CY7C68013的固件程序必须要对接收和发送数据的端点进行正确的配置及控制,才能正确地接收和发送数据;
(5)外围电路的控制。USB接口要进行数据传输,CY7C68013就必须对外部 FIFO进行读写控制,因此固件程序中包含对外围电路进行控制的代码也是必要的。
在使用 EZ-USB FX2芯片进行应用开发中,利用其固件框架可以简化开发工作。用户在这个固件框架的基础上只需要再提供一个 USB描述符表,配置一些相关的寄存器,添加所使用的端点接收和发送数据的通信代码,以及控制外围电路的程序代码就可以完成 USB设备的固件开发工作。本设计中采用的固件框架流程图如图 3所示 [5]。
500)this.style.width=500;" border="0" />
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模式相比,传输速率比较低,但对于具备一定单片机基础的开发人员而言,这种模式开发周期短,稳定性强,不失为一种有效的数据传输方式。该固件程序已成功应用到某弹载测量系统地面测试台中,多次试验证明固件运行可靠,数据回读误码率低,满足系统技术要求。