数据采集和下传的系统结构USB部分USB基本概念和特点EZ-USBFX2(CY7C68013)简介EZ-USBFX2从属FIFO固件框架和程序FPGA部分设备驱动和主机应用程序部分总结USB数据采集系统PC上位机EZ-USBFPGA主机程序驱动FIFOADR[1:0]FULLSLWRFD[15:0]固件D+D—RAMCY7C68013XC5VSX50TUSB数据下传系统PC上位机EZ-USBFPGA主机程序驱动FIFOADR[1:0]EMPTYSLRDFD[15:0]固件D+D—RAMCY7C68013XC5VSX50TSLOEUSB是通用串行总线(UniversalSerialBus)的缩写。最早是由Compaq、Intel、Microsoft等多家公司于1994年11月共同提出的,其目的是用USB来取代PC现有各种复杂的外围接口,使外围设备的连接具有单一化、即插即用、热插拔、低成本等特点。USB基本概念USB协议定义了两种连接器:使用在电缆“上游”端的A系列和使用在电缆“下游”端的B系列。各种连接器的引脚和电缆颜色如图:系列A、B连接器导线电缆颜色1VCC(+5V)红2D-白3D+绿4GND(地线)黑USB2.0支持三种信道速率:低速的1.5Mb/s,全速的12Mb/s以及高速的480Mb/s。通常USB传输速率指的是信号或信道支持的位速率,每个USB设备的实际数据传输速率会比理想值低,除了数据之外,信道还需要传输状态控制和错误检查的信号,由于多个USB设备可能分享同一个信道,所以在实际应用中,对于单一传输最大速率,高速模式下为53Mb/s,全速模式下为1.2Mb/s,低速模式下则为800b/s。USB主机任何USB系统中,只有一个主机,主机是USB唯一的主控者,这是USB最基本的概念。USB设备将会等待主机的请求而加以响应。我们通常所用的USB主机设计即PC上位机。USB方向由于主机是USB主控者,这样很容易理解USB方向:OUT是指从主机到设备,而IN是从设备的到主机。例如,端点6发送数据到主机,则定义为IN端点。批量传输批量传输是一种突发的传输模式。此种传输方式中,在全速方式时,以8、16、32、64字节信息包传输;高速方式时,以512字节信息包传输。由于其具有自动的错误数据校验机制(CRC),所以批量传输能确保其正确性。使用于大批量数据的连续传输。控制传输控制传输用于配置设备,给设备发送命令。当USB设备初次安装时,USB系统软件采用控制数据对设备进行设置。中断传输中断传输数据是少量的,且其数据延迟时间也是有范围的。这种数据可由设备在任何时刻发送。同步传输同步数据的建立、传输和使用是连续且实时的,并以稳定的速率发送和接收实时的信息。适用于语音传输等实时性要求高的USB设备。EZ-USBFX2简介Cypress半导体公司的EZ-USBFX2芯片即CY7C68013,是新一代高速USB系列,可以用USB2.0最大数据传输速率传输数据。该芯片基于EZ-USBFX芯片开发,通过集成的收发器、SIE(串行接口引擎)、8051微控制器,存储器和可编程I/O接口,提供USB2.0支持。集成的USB收发器连接到USB总线中的D+和D-;串行接口引擎SIE进行译码、编码、错误纠正和位填充,变换USB所需要的信号电平;最终,从USB接口,SIE发送和接收数据。EZ-USBFX2的CPU采用增强8051,提高了运行速度,增强了功能。同时芯片还采用了内部RAM用于程序和数据存取。FX2共有三种接口工作模式,端口模式、从属FIFO(SlaveFIFO)模式和通用可编程接口模式(GPIF)。端口模式:FX2的CPU(增强型8051)使用特殊功能寄存器来控制I/O管脚的输出,读取或写入等功能。通用可编程接口模式(GPIF):GPIF作为内部的主控制器与FIFO直接相连,并产生用户可编程的控制信号与外部接口进行通信。从属FIFO模式:在SlaveFIFO模式下,外部逻辑或外部处理器直接与FX2端点FIFO相连。在这种模式下,GPIF不被激活,因为外部逻辑可直接控制FIFO。这种模式下,外部主控端既可以是异步方式,也可以是同步方式,工作时钟可选为内部产生或外部输入,其它控制信号也可灵活地设置为高有效或低有效。从FX2的角度来看,端点就是总线上接收或保持传输数据的缓冲区。FX2从OUT端点缓冲区读主机发出的数据,并且向IN端点缓冲区写要传输给主机的数据。FX2包含了3个64字节的端点缓冲区,加上可定义为不同端点方式的4KB缓冲区空间。3个64字节缓冲区是共有的,并且被设计成EP0、EP1IN和EP1OUT。其中,EP0是默认的控制端点0,是一个用于IN和OUT数据的单64字节缓冲区双向端点。端点1支持批量传输、中断传输和同步传输,且端点0和端点1只能由FX2的CPU进行访问。4KB可配置的缓冲区用于端点2、4、6、8(EP2、EP4、EP6、EP8)。端点2、4、6和8是大端点,用于高带宽的数据传输。他们能够配置成各种不同的方式,从而适应带宽的要求。如下图:从属FIFO模式下,外围设备电路可以像访问普通FIFO一样访问FX2的端点2、端点4、端点6和端点8的端点FIFO,也就是说,端点FIFO被外部控制器所控制。FX2Slave模式外部主控制设备IFCLKFLAGAFLAGBFLAGC#/SLCFLAGDSLOESLRDSLWRPKTEND]0:[xFD]0:1[FIFOADR异步方式下:SLRD和SLWR是读/写的选通信号;同步方式下:SLRD和SLWR作为IFCLK时钟引脚的使能信号。Cypress公司为FX2系列的产品提供了固件框架和固件库,是由KeilC51C编写的。固件框架和固件库提供了能够完成USB设备基本功能需求的参数和函数,大大提高了开发的效率。固件框架主要包括初始化、处理标准USB设备请求以及USB挂起时的电源管理等。上电复位初始化状态变量调用TD_Init(),使能中断是否收到SETUP包延迟1s,并重枚举调用TD_Poll()是否接到SETUP包是否设置USB总线总处于空闲态分析命令,执行设备请求调用TD_Suspend()挂起处理器调用TD_Resume()是否TRUEFALSE否否是是固件框架流程固件框架完成一个简单的任务循环。首先框架初始化内部的状态变量,然后调用用户初始化函数。该函数返回后,框架初始化USB接口到未配置状态并使能中断。然后每隔1s进行一次设备重枚举,直到端点0接收到一个配置包(SETUP)。一旦检测到SETUP包,框架将开始交互的任务调度,其任务调度如下:1.调用用户函数TD_Poll()函数,实现USB外设的主要功能。2.判断是否有标准设备请求等待处理,如果有,则分析该请求并响应。3.判断USB内核是否收到USB挂起信号,如果收到,则调用函数TD_Suspend()。该函数成功返回后(返回值为TRUE),再检测是否发生USB唤醒事件。如果未检测到,则处理器进入挂起方式;如果检测到,则调用函数TD_Resume()函数,程序继续运行。如果从TD_Suspend函数返回FALSE,则程序继续运行。本系统的固件程序设计,由于采用SlaveFIF0模式进行数据高速传输,因此,配置数据接收和发送端点为SlaveFIFO模式,CPU不再参与数据的传输。数据采集系统中,端点FIFO在接收到FPGA输入的信号后,等待PC读取,USB芯片只作为一个数据传输通道。由于FX2的EP2、EP4、EP6、EP8这四个端点共享4KFIFO缓冲区,故在该系统中,将EP6配置成Bulk块传输,大小为512B,2倍缓存,16位工作模式,并设置为AUTOIN模式,而用EP0作为控制参数传递。相反,数据下传系统中,打开EP2端点,同样设置成Bulk块传输,大小为512B,2倍缓存,16位工作模式,并设置为AUTOOUT模式,这样,固件程序就能完成主机和设备的双向数据传输。在自动输入输出模式下,对于IN端点,允许外部逻辑将数据连续传送到FIFO中,不需要外部逻辑或FX2固件程序来打包数据或发送信号到主机来确认;对于OUT端点,允许主机连续填充FIFO,而不需要外部逻辑或FX2固件与每一个引入的包进行握手即提供端点缓存区。因此,在固件程序中,我们只需要完成初始化函数TD_Init的配置,而用户函数TD_Poll程序代码则不是必需的。voidTD_Init(void){CPUCS=((CPUCS&~bmCLKSPD)|bmCLKSPD1);//设置CPU时钟为48MHzIFCONFIG|=0x4B;//异步,从属FIFO模式,选择外部时钟为30MHzFIFOPINPOLAR=0x00;//设置SlaveFIFO接口引脚为低电平有效SYNCDELAY;//同步时延//resetthefifosFIFORESET=0x80;//将0x80写入该寄存器不应答所有从主机来的传输,然后写SYNCDELAY;//0x02、0x04、0x06或0x08,复位FIFOFIFORESET=0x02;SYNCDELAY;FIFORESET=0x04;SYNCDELAY;FIFORESET=0x06;SYNCDELAY;FIFORESET=0x08;SYNCDELAY;FIFORESET=0x00;SYNCDELAY;PINFLAGSAB=0xE0;//设置FLAGB为EP6的FULL全满标志位SYNCDELAY;PINFLAGSCD=0x08;//设置FLAGC为EP2的EMPTY空标志位SYNCDELAY;//configtheendpointsdirectionEP1OUTCFG=0xA0;EP1INCFG=0xA0;SYNCDELAY;//激活端点1BULKEP2CFG=0xA2;SYNCDELAY;//激活端点2OUTBULK512字节2倍缓存EP6CFG=0xE2;SYNCDELAY;//激活端点6INBULK512字节2倍缓存//configtheendpoint6EP6FIFOCFG=0x0D;//EP6AUTOIN=1ZEROLEN=1WORDIDE=1SYNCDELAY;//配置EP6自动方式16位模式//FX2根据包的长度值自动打包并分派IN包,该长度在EP6AUTOINLEN寄存器中INPKTEND=0x06;SYNCDELAY;INPKTEND=0x06;SYNCDELAY;//强制IN包结束EP6AUTOINLENH=0x02;SYNCDELAY;EP6AUTOINLENL=0x00;SYNCDELAY;//setthepacketsize512字节//configtheendpoint2EP2FIFOCFG=0X11;SYNCDELAY;//EP2AUTOOUT=1ZEROLEN=0WORDIDE=1OUTPKTEND=0x82;SYNCDELAY;OUTPKTEND=0x82;SYNCDELAY;//强制OUT包结束EP2BCL=0x80;//通过写字节计数器来控制EP2OUTSYNCDELAY;EP2BCL=0x80;SYNCDELAY;}voidTD_Poll(void)//Calledrepeatedlywhilethedeviceisidle{}FIFOADR[1:0]FX2从属模式FPGA外部主控设备FLAGBFULLSLWRFD[15:0]PKTENDIDLE:当写事件发生时,转到状态1;状态1:指向INFIFO,激活FIFOADR[1:0],转向状态2;状态2:如果FIFO满标志为“假”(FIFO不满),则转向状态3,否则停留在状态2;状态3:传送总线驱动数据,激活SLWR,转向状态4;状态4:如果有更多的数据要写,则转向状态2,否则转向IDLE。FPGA控制器实现异步从属FIFO的读FIFOADR[1:0]FX2从属模式FPGA外部主控设备FLAGCEMPTYSLOESLRDFD[15:0]IDLE:当读事件发生时,转到状态1;状态1:指向OUTFIFO,激活