USB通信实现.docx
《USB通信实现.docx》由会员分享,可在线阅读,更多相关《USB通信实现.docx(18页珍藏版)》请在冰豆网上搜索。
![USB通信实现.docx](https://file1.bdocx.com/fileroot1/2023-1/28/b2f6c060-d223-41db-976d-879dadc06e34/b2f6c060-d223-41db-976d-879dadc06e341.gif)
USB通信实现
USB通信实现
一、CY7C68013A芯片简介
CYPRESS公司的EZ-USBFX2系列芯片是世界上第一个集成USB2.0协议的微处理器,它支持12Mb/s的全速传输和480Mb/s高速传输,可使用4种USB传输方式:
控制传输、中断传输、批量传输和同步传输;完全使用USB2.0,并向下兼容USB1.1。
芯片结构
EZ-USBFX2的前身是EZ-USB,其芯片固件也是存储在主机上而不是在芯片内部,显著特点是代码升级容易。
芯片结构也与EZ-USB类似,主要包括USB2.0收发器、串行接口引擎(SIE)、增强型8051、16KB的RAM,4KB的FIFO存储器、I/O口、数据总线、地址总线和通用可编程结构(GPIF),如图1.1所示:
图1.1EZ-USBFX2系列芯片的结构
CY7C68013A特点:
1、USB2.0单芯片解决方案,包括USB2.0收发器,串行接口引擎USB2.0和增强型51内核。
2、可“软配置”RAM,大小为16k,取代传统51的RAM和ROM,程序可通过下面方式下载:
●通过USB口下载
●通过外部E2PROM装载
●外界存储设备(只有128引脚封装技术)
3、通用可编程接口GPIF,GPIF是FX2的一个重要技术:
●可设置为主从模式,主模式下可对外部FIFO、存储器、ATA接口设备进行高速读写操作,从模式下外部主控制器(如DSP,MCU)可把GPIF端口当做FIFO进行高速读写操作。
●支持与外设通过并行8位或16位总线传输。
●支持通过GPIF工具编程,灵活产生各种波形。
支持多CTL输出和多RDY输入。
4、增强工业级8051内核,特点有
●支持48M时钟
●4个时钟指令周期,在时钟为48M时,单指令执行时间为83.3ns
●两个UART
●三个TIMER
●多中断系统
●多数据指针
5、3.3V工作电压,低功耗,在任何工作模式下电流小于85mA。
6、智能串行接口引擎(SIE)。
7、USB中断矢量。
8、100KHZ或400KHZI2C接口。
9、4个集成FIFO
●低成本与外设实现“胶连接”自动实现从16位FIFO转换
●支持主从工作模式
●FIFO支持内部时钟和同步数据触发
●轻松实现与ASIC,DSP连接
10、包括40个通用IO端口。
11、4种可选封装—56引脚SSOP和QFN,100引脚TQFP和128引脚TQFP。
功能特点
EZ-USBFX2拥有一个独特的结构,其串行接口引擎(SIE)负责完成独立串行数据的编解码、差错控制、位填充等于USB协议有关的功能,它把嵌入式MCU(增强型8051)解放出来,简化了固件代码的开发。
FX2中还包含一个通用可编程结构(GPIF),它支持所有通用的总线标准,如ATAPI(PIO和UDMA)、IEEE1284(EPP并行口)和UTOPLA等,并可与外部ASIC,DSP等直接连接。
EZ-USB系列芯片需要微处理器(增强型8051)参与端点FIFOS与外围电路间的数据传输,由于增强型8051本身的工作频率较低,这限制了传输速率的进一步提高。
虽然这种限制在12Mb/s全速模式下并不明显,但当速率提升至480Mb/s的告诉模式时,微处理器必将成为整个系统的带宽瓶颈。
为此,EZ-USBFX2中,USB接口和外围电路直接共享FIFO存储器。
这时增强型8051可不参与数据传输,但可通过FIFO或RAM的方式访问所传输的数据,另外,这些FIFOS与USB之间的传输是以数据包的形式实现的,而不是一次只传输1字节。
这种处理结构被成为“量子FIFO”,它较好地解决了USB告诉模式下的带宽问题。
二、SlaveFIFO控制器模块设计
采用CyPress公司的EZ-USBFX2接口芯片来传输数据,此芯片完全支持USB2.0协议,最高传输速率可以达到48OMB/S,非常适合传输大数据量的视频信号。
为了降低用户设计难度及缩短设计周期,CyPress公司为开发者提供了完整的开发套件,包括开发板及非常详尽的开发资源,使开发者可以在短期内开发出自己的USB设备。
在传输要求甚高的情况下,选用EZ-USBFXZ提供的SlaveFIFO的BULK(批量传输)模式,能很好的满足传输要求。
在这种模式下,USB芯片内存单元中划分出6个端点(endPoint),以下简称为EP。
Ep0和Ep1被保留作为芯片配置FIFO。
EP2、4、6、8可作为用户传输,并且4个EP采用双重FIFO(doubleFIFO)的方式组织构成。
图2.1FX2端点缓冲区
举例来说,如上图2.1所示,USB执行OUT传输,将EP2端点设成512字节双重。
在外部器件看来,USB端只要有1个512字节的FIFO为“半满”,就可以继续发送数据。
当操作的FIFO写“满”时,FX2自动将其转换到外部接口端,排除等候读取;并将USB接口队列中下一个为“空”的FIFO转移到USB接口上,供其继续写数据。
外部接口端与此类似,只要有1个FIFO为“半满”,就可以继续读取数据。
当前操作的FIFO读“空”时,FX2自动将其转换到USB接口端,排除等候写并将外部接口队列中下一个为“满”的FIFO转移到接口上,供外部器件使用。
图2.2所示为双重FIFO的工作过程。
当一个512字节的FIFO满时,FPGA可以取出里面的数据,同时PC可以向另一个FIFO写入数据(一组实箭头)。
当一个512字节的FIFO为空时,PC可以写入数据。
同时FPGA可以读取另一个仍然有数据的FIFO(一组虚箭头)。
图2.2双重FIFO工作过程
CY7C68013A与外设的数据传输模式
CY7C68013A有Ports模式、SlaveFIFO和GPIF三种接口模式。
(1)Ports模式是一种最基本地数据传输方式,其数据传输主要由固件程序完成,需要CPU的参与,因此数据传输速率比较低,适用于传输速率要求不高的场合。
(2)SlaveFIFO方式是从机方式,外部控制器,如FPGA,可像对普通FIFO一样对FX2的多层缓冲FIFO进行读写。
FX2内部的FIFO提供的时序信号、握手信号(满、空等)和输出使能等。
这里就是在SlaveFIFO模式下实现USB2.0接口和FPGA的数据通信。
(3)可编程接口GPIF是主机模式,GPIF作为内部主机控制端点FIFO,可以软件编程读写控制波形,几乎可以对任何8/16bit接口的控制器、存储器和总线进行数据的主动读写,非常灵活。
FIFO芯片中有一个大小为4K的FIFO存储器,USB接口和外围电路直接共享这个FIFO存储器。
下图为FIFO的传输模式示意图。
图2.3FIFO传输模式示意图
从图中可以看出,与外围电路的数据传输可以在没有8051干涉的情况下完成,8051也可以通过FIFO或RAM的方式访问所传输的数据。
FIFO存储器与USB之间的传输是以数据包的形式实现的,而不是一次只传输1字节。
这种处理结构被成为“量子FIFO”,它较好地解决了USB告诉模式下的带宽问题。
如果芯片时钟频率为48Mhz,使用FIFO存储器进行数据传输,最高速率可以达到96Mbyte/s。
采用FX2的SlaveFIFO方式来传输数据,在这种模式下,由于内部的增强型8051CPU不参加数据传输,所以只负责对FX2内部寄存器进行配置以及相应相关设备请求和生成相关控制信号。
从FPGA采集到的信号直接送往FX2内部端点FIFO中,同时PC端可以从FIFO中读取数据。
采用这种方式可以最大限度的提高数据传输的吞吐量。
图2.4USB数据传输示意图
每一总线执行动作最多传送三个数据包。
按照传输前制定好的原则,在每次传送开始时,主机控制器发送一个描述传输动作的种类、方向、USB设备地址和终端号的USB数据包,这个数据包通常被称为标志包(tokenpacket)。
USB设备从解码后的数据包的适当位置取出属于自己的数据。
数据传输方向不是从主机到设备就是从设备到主机。
在传输开始时,由标志包来标志数据的传输方向,然后发送端开始发送包含信息的数据包或表明没有数据传送。
接收端也要相应发送一个握手的数据包表明是否传送成功。
发送端和接收端之间的USB数据传输,在主机和设备的端口之间,可视为一个通道。
存在两种类型的通道:
流和消息。
流的数据不像消息的数据,它没有USB所定义的结构,而且通道与数据带宽、传送服务类型、端口特性(如方向和缓冲大小等)有关。
多数通道在USB设备设置完成后即存在。
USB中有一个特殊的通道——缺省控制通道,它属于消息通道,当设备一启动即存在,从而为设备的设置、查询状况和输入控制信息提供一个入口。
系统硬件框图
下图展示了SlaveFIFO方式下FX2USB和FPGA的典型连接。
其中,FD[15:
0]为16位双向数据总线;FLAGA-FLAGC为FX2内FIFO的标志管脚,映射FIFO的当前状态;SLCS为SlaveFIFO的片选信号;SLOE用于使能数据总线FD的输出;FIFOADR[1:
0]用于选择和FD连接的端点缓冲区(00代表端点2,01代表端点4,10代表端点6,11代表端点8);SLRD和SLWR可分别作为FIFO的读写选通信号。
图2.5USB与FPGA硬件连接图
FPGA是通过SlaveFIFO方式和USB控制器CY7C68013A相连的。
FPGA读写数据,通过查询CY7C68013A中FIFO的状态来判断是否可以进行读写数据,主要是查询状态标志位FLAGA和FLAGD。
在本项目中,FPGA作为整个核心,负责数据流的控制。
数据都要流经FPGA,上图中所有的信号都要连接到FPGA的I/O引脚。
IFCLK是接口的主时钟,在同步传输下,每个时钟上升沿都会传输16位的数据,这是一个非常重要的全局时钟,所以我们把此信号连接到FPGA的全局时钟引脚GCK。
其它引脚可以连接到普通I/O引脚。
图2.6SlaveFIFO模式硬件结构
图2.6说明在SlaveFIFO模式下,FX2FIFO的数据外部配置。
当FX2被设置为FIFO接口模式时,USB数据在PC机和FPGA中传输,不需要FX2的CPU参与,而是经过FX2的内部端点FIFO来传输。
对FPGA,端点FIFO提供了时序信号、握手信号(空、满和可编程级信号)读写信号和输出允许信号等。
在本设计中,我们将FX2设置为同步从属FIFO接口模式,上图中有四个从属FIFO,它们工作在16位模式,具体所需寄存器如下表所示。
表2.1SlaveFIFO模式寄存器
SlaveFIFO写数据传输
在数据传输模块中,为了保证较高的传输速度,使用不经过CPU的SlaveFIFO控制工作模式。
模块的基本工作过程为:
(1)上位机通过EZ-USBFX2的内部端点FIFO发送配置信息给FPGA;
(2)当A/D采样数据存储满FPGA中的FIFO后,FPGA根据SlaveFIFO的控制时序产生相应的控制信号,将在FIFO中的数据传输给EZ-USBFX2的内部端点FIFO,而当内部端点存储满后,FX2自动将数据传输到上位机。
EZ-USB的SlaveFIFO模式主要用于USB数据的传输,包括SlaveFIFO写和SlaveFIFO读两种。
另外从同步方式可以分为:
同步传输和异步传输。
这里所说的读和写都是指从外部逻辑的角度来看的。
读是写的逆过程,下面只介绍同步写的数据传输形式。
同步SlaveFIFO写的典型接口如图所示。
图2.7同步SlaveFIFO写接口
为了执行同步SlaveFIFO写,外部主机需要处理一系列的事件,下图为外部主机的同步SlaveFIFO写的状态机,状态描述如下:
图2.8同步SlaveFIFO写的状态机
外部主控器典型的进程如下:
IDLE:
空闲状态,此时如果写事件发生,将转向State1处理。
State1:
指向INFIFO,触发FIFOADR[1:
0],转向State2。
State2:
如果FIFO满标识为假(FIFO不满),则转向State3,否则停留在State2。
State3:
驱动数据到总线上,触发SLWR,然后转向State4。
State4:
如果还有数据写,则转向State2,否则转向IDLE。
SlaveFIFO写时序分析
外部主机实现同步FIFO写的操作,如写端点EP6。
首先将端点EP6配置为IN端点,BULK传输模式,512字节的缓冲区,4重缓冲,且置WORDWIDE=1即16位总线宽度,为了实现自动传输,置AUTOIN=1,EP6AUTOINLENH:
L=512,如果FIFO达到512字节后,便自动触发USB传输数据。
外部主机写第一个数据的时序图如下图所示。
外部主机通过将FIFOADR[1:
0]设置为10来选择端点EP6。
当通过FD数据总线写第一个数据后,FLAGC的空标志则变为非空状态,即从低电平跳变为高电平。
图2.9写第一个数据时序图
当外部主机写第一个写第256个字的时候,第一个512字节自动传输给USB。
当外部主机写512个字到端点EP6的FIFO后,第二个512字节则自动呈现给USB。
整个过程时序图如下图所示。
图2.10USB的自动传输时序图
PKTEND强制USB传输的时序图如下图所示。
这里端点EP6FIFO的第四个数据包通过PKTEND引脚手工触发传输。
当PKTEND有效时,第816个数据写入EP6,然后此小数据包将被强制触发USB传输,USB数据包中只有96个字节。
当第四个数据包被触发后,FLAGB的满标志将被触发,表示当前没有FIFO缓冲区可以写入,只有当USB主机将整个数据包读取完毕后才可以使用。
注:
在PKTEND触发的整个过程中FIFOADR[1:
0]必须保持恒定的值。
图2.11写第一个数据时序图
三、固件程序设计
固件主要有以下几种功能:
初始化工作,包括设置一些特殊功能寄存器的初值以实现所需的设备属性或者功能,例如开中断、使能端点、配置端口等;辅助硬件完成设备的重新枚举过程,包括模拟设备的断开与重新连接,对接收到的设置包进行分析判断,从而对主机的设备做出适当的响应,完成主机对设备的配置任务;对中断的处理;数据的接收和发送;外围电路的控制。
在设计中,采用C51语言对单片机固件部分进行编写,使用德国KeilSoftware公司的KeiluVision2编译器进行编译并产生下载的配置围巾(.HEX文件)。
固件的主要功能是控制CY7C68013A芯片接收并处理USB设备驱动程序的请求,通过CY7C68013A实时将FPGA处理完成送过来的数据上传给主机或者将主机下载的数据传给FPGA处理。
Cypress固件程序框架
Cypress提供了固件编程框架,在此基础上就可以根据需要完成固件编程。
这里我们采用KeilC51语言编写程序。
固件构架的流程图如下图所示。
在程序开始时,固件构架执行下列步骤:
1.首先,设置所有的内部状态,即设置起始的初值。
2.然后,调用用户的初始设置函数TD_Init()。
待返回后,固件架构就会设置USB接口成为未配置状态,并且使能中断。
3.接下来在1s的间隔内,开始重新枚举(ReNumerate)设备,并直到设置(SETUP)封包被端点0接收到为止。
4.一旦设置(SETUP)封包被接收到,固件架构就会启动与其合作的工作分配器。
而这个工作分配器就会顺序重复执行下面的步骤:
a.调用用户函数TD_Poll()。
b.是否决定设备请求是未定(或等待决定)的。
如果是已决定的,那么它将会剖析所收到的命令请求,并且紧跟着加以响应。
c.是否决定USB核心已经收到了USB挂起(Suspend)事件,如果已决定,它将调用用户函数TD_Suspend()。
若取得成功的返回,它将检测是否有唤醒(Resumen)事件。
反之如果没有检测到,那么它将把CPU进入中止模式中。
当唤醒事件被检测到时,它将会调用用户函数TD_Suspend(),并且连续的跳回到c,若从TD_Suspend()函数中未收到成功的返回,再连续的跳回到c
图3.1固件框架
建立框架所需的文件见下表固件搭建源文件和头文件
框架文件
表3.1框架文件
Reg80320
8051头文件,由KEIL提供
Ezusb.h
库函数声明,以及变量、宏定义
数据类型定义
Fx2regs.h
FX2寄存器头文件
Fw.c
固件框架文件
Periph.c
用户钩子函数,用户可以修改,在不同的文件中文件名不同
Dscr.a51
USB描述符列表,用户可以修改
Ezusb.lib
USBJmpTb.OBJ
EZ-USB库文件
中断跳转函数目标文件
该框架由一下几部分组成:
(1)Fw.c中包含了撑血框架的MAIN函数,管理整个51内核的运行,因为Cypress对这个部分的功能进行了精心划分,一般是不用改动的。
(2)用户必须将Periph.c实例化,它负责系统周边器件的互联。
固件的设计主要是针对这个文件,用户必须根据自己系统的需要,实例化这个文件,以实现自己的功能。
在这里文件中有几个函数是比较关键的,在这里做特别说明:
TD_Init()函数:
负责对USB端点进行初始化设置。
在FX2再次枚举和开始任务分配之间被调用,其目的是初始化各个端口以及各端口的先入先出缓冲区。
TD_Poll()函数:
负责系统中循环任务的处理。
它主要是对各个端点的状态进行查询,处理各种OUT或IN端点的交互。
值得说明的一点是,这种处理只是辅助性质的,大部分工作由硬件自动完成。
DR_VendorCmnd函数:
主要负责用户自定义命令的译码工作,用户请求通过端点0传输给内核。
由于CY7C68013A上SIE硬件的支持,用户只需查询固定地址单元即可获得当前的命令代码。
(3)Dscr.a51是描述表文件,负责USB设备的描述工作,CY7C68013A在上电后自动利用利用其中的VID和PID取代默认的VID和PID。
(4)两个包含文件EZ-USB.LIB和USB-JMPTB.OBJ,前者是EZUSB函数库的二进制文件,后者是USB的中断向量表。
四、固件的各个功能程序设计
FX2LP主要寄存器介绍
设计固件程序,是通过配置FX2LP的内部寄存器来实现特定功能的。
因此有必要了解FX2LP工作在SlaveFIFO模式下要用到的寄存器。
SlaveFIFO模式寄存器主要有IFCONFIG、PINFLAGSAB、PINFLAGSCD、FIFOSET、FIFOPINPOLAR、EPXCFG、EPXFIFOCFG、EPXAUTOINLENH:
L等。
下面介绍几个主要的寄存器:
1、接口配置寄存器IFCONFIG占一个字节,位7IFCLKSRC是时钟选择位,该位为1时,使用内部的时钟,否则用外部的时钟。
位630/48M是内部时钟选择位,当时钟选择的是内部时钟时,该位为1时,时钟频率为48M,否则为30M。
位5IFCLKOE是IFCLK管脚使能位,为1时使能。
位4IFCLKPOL是时钟信号IFCLK的选择位,该位为0时,IFCLK正常输出,否则翻转输出。
位3ASYNC是SlaveFIFO同步异步模式选择位,该位为1时,是异步模式,否则同步模式。
位2GSTATE是驱动GSTATE[2:
0]在端口E的0到2管脚上。
位1和位0是端口配置选择位,00是普通端口;01时保留,10时为GPIF接口,11是SlaveFIFO接口。
2、端点2、4、6、8的配置寄存器EPxCFG,它们共同的位有位7VALID是端口有效配置,当该位为1时,端点有效,否则无效。
位6DIR是端点方向选择位,该位是1时,表示输入端点,反之为输出端点。
位5和位4是传输类型的选择位,为00时,无效;01时,为同步传输;10时为批量传输;11时为中断传输。
端点4和8其它位可以保留。
端点2和6可以通过3SIZE选择端点缓冲区的大小,该位为0时,缓冲区为512字节;为1时,缓冲区为1024个字节。
通过位1和0选择缓冲区的个数,为00时,配置为四种缓冲区;01时,无效;10时为双缓冲区;11时为三缓冲区。
其它寄存器的说明可以参考文档,这里不再一一说明。
USB设备请求的设计
打开上面建立的工程,这个工程已经具备USB2.0规范的基本固件程序。
下面修改dscr.a51文件,主要修改的地方有:
1、PID和VID,dscr.a51文件定义的PID和VID是Cypress公司默认的。
2、端点的配置。
本系统只用到端点2和端点6,其它端点不用去设置。
将端点2设置为IN端点,缓冲区为4倍缓冲方式,大小为4*512字节;将端点2设置为OUT端点,缓冲区为4倍缓冲方式,大小为4*512字节。
3、USB供电。
考虑到本系统的硬件电路的整体功耗,将USB的功耗设置为400mA。
SlaveFIFO接口的设计
通过配置寄存器来实现SlaveFIFO接口模式。
本设计只用端点2和端点6传输数据,采用传输的方式是同步的批量传输方式。
在函数TD_Int()中完成寄存器的配置,代码如下:
voidTD_Init(void)
{//Calledonceatstartup
CPUCS=0x10;//CLKSPD[1:
0]=10,for48MHzoperation,outputCLKOUT
PINFLAGSAB=0x08;//FLAGA-EP6FF
SYNCDELAY;
PINFLAGSCD=0xE0;//FLAGD-EP2EF
SYNCDELAY;
PORTACFG|=0x80;
IFCONFIG=0xA3;
//EP4andEP8arenotusedinthisimplementation...
EP2CFG=0xA0;//out512bytes,4x,bulk
SYNCDELAY;
EP6CFG=0xE0;//in512bytes,4x,bulk
SYNCDELAY;
EP4CFG=0x02;//clearvalidbit
SYNCDELAY;
EP8CFG=0x02;//clearvalidbit
SYNCDELAY;
SYNCDELAY;
FIFORESET=0x80;//activateNAK-ALLtoavoidraceconditions
SYNCDELAY;//seeTRMsection15.14
FIFORESET=0x02;//reset,FIFO2
SYNCDELAY;
FIFORESET=0x04;//reset,FIFO4
SYNCDELAY;
FIFORESET=0x06;//reset,FIFO6
SYNCDELAY;
FIFORESET=0x08;//reset,FIFO8
SYNCDELAY;
FIFORESET=0x00;//deactivateNAK-ALL
//handlethecasewherewewerealreadyinAUTOmode...
//...forexample:
backtobackfirmwaredownloads...
SYNCDELAY;
EP2FIFOCFG=0x00;//AUTOOUT=0,WORDWIDE=1
//coreneedstoseeAUTOOUT=0t