1 CY7C68001芯片特点描述
CY7C68001是用来连接微处理器或DSP的DMA从装置,其内部不含微处理器;集成有USB2.0收发器(物理层)、USB2.0串行接口引擎SIE(链路层、实现底层通信协议)、4kB的FIFO和电压调节器、锁相环;支持高速(480Mb/s)或全速(12Mb/s)传输;3.3V操作电压,24MHz外部振荡频率;可以选择8位或16位总线方式;具有同步与异步的FIFO接口;他可以向用户提供足够的端口,缓冲区和传输速度,提供USB2.0协议要求的全部4种传输方式(控制传输、中断传输、批量传输和同步传输),可以满足用户对各种类型数据传输的需求。片上的串行接口处理器(SIE)能完成大部分的USB协议操作,使用户可以摆脱复杂的协议细节,简化了用户配置代码,加快了程序开发过程。但是由于采用的是不带MCU内核的USB接口芯片,USB的应用层协议应该由TMS320VC5416编程实现,USB固件的加载必须靠DSP控制CY7C68001完成。
2 CY7C68001芯片寄存器
2.1 CY7C68001配置寄存器
USB的配置寄存器主要有IFCONFIG,FLAGSAB,FLAGSCD,POLAR,REVID。IFCONFIG配置USB的接口方式;FLAGSAB与FLAGSCD确定FLAGX所代表的状态;POLAR确定FIFO接口信号的极性;REVID读版本号。
2.2 ENDPOINT配置寄存器
配置USB四个节点,主要有EPxCFG,EPxPKTLENH与EPxPKTLENL,EPxPEH与EPxPEL,EPxISOINPKTS几类寄存器(x的值为2,4,6,8):EPxCFG配置每一个Endpoint的类型;EPxPKTLENH与EPxPKTLEN设置每个节点包的大小;EPxPFH与EPxPFL确定每个节点的可编程的标志位;EPxISOINPKTS确定等时同步传输时,每一帧的数据包个数。
2.3 状态寄存器
状态寄存器有EP24FLAGS与EP68FLAGS;EP24FLAGS确定节点2与4的FIFO的状态;EP68FLAGS确定节点6与8的FIFO的状态。
2.4 USB帧状态寄存器
USB总线配置寄存器主要有USBFRAMEH、USBFRAMEL、MICROFRAME、FNADDR来确定USB每一帧的状态,USBFRAMEEH/L寄存器确定每一帧的数据长度;MICROFRAME寄存器确定每一个微帧的数据个数;FNADDR寄存器保存自举时的7位地址。
2.5 节点0(Endpoint0)操作寄存器
节点0(Endpoint0)操作寄存器主要包括FP0BUF,SETUP,EP0BC三个寄存器:EP0BUF寄存器是节点0的缓冲寄存器,通过他可以完成对节点0数据的访问;SETUP寄存器从计算机接收set-up数据包;EP0BC,节点0中的数据的个数。
2.6 其他寄存器
INPKTEND/FLUSH寄存器强制数据包结束或清空FIFO;INTERRUPTS寄存器为中断使能寄存器;DESC寄存器可以完成对描述表的操作。
3 TMS320VC5416与CY7C68001的硬件接口
本设计将CY7C68001配置在TMS320VC5416的I/O空间,采用CY7C68001的并行异步读写方式完成二者之间数据和命令的交换。其原理
CY7C68001除了存储器接口外,还有1个中断信号USBINT反和4个状态信号(READY,FLAGA,FLAGB和FLAGC),中断信号USBINT反,扩展总线的XINT2反,操作复用TMS320VC5416的外部中断INT2反被配置在系统状态寄存(sysstat1)中,可由TMS320VC5416查询,以确定真正的中断源,状态信号READY,FLAGA,FLAGB和FLAGC配置在本系统状态寄存器0(sysstat0)中,可由TMS320VC5416查询,由于采用了CPLD,增强了系统的灵活性和可扩充性。在实际操作中,由于通信速度达到了480Mb/s,所以采用4层板设计,而且对电源要进行很好的退耦处理,对DSP所需的16MHz有源晶振和CY7C68001用到的24MHz有源晶振要进行铺铜处理。
4 TMS320VC5416对CY7C68001的操作
CY7C68001有2个外部接口:
(1)命令接口:用来访问CY7C68001寄存器、Endpoint0缓冲器及描述表;
(2)FIFO数据接口:用来访问4个1kB的FIFO中的数据。
这两个外部接口均可以通过同步或异步的方式进行访问。在本系统中均采用异步的方式进行访问的
AD:地址/数据选择,为0时表示本操作为数据读或写,为1时表示本操作为地址写;
R/W:读/写操作选择,为0时进行写,为1时进行读;
D[5:0]:地址/数据,当AD=0时,D[3:0]为数据半字节,D[5:4]未用,命令字为8位,故命令字数据分二次读出或写入;当AD=1时,D[5:0]包含将要寻址的命令寄存器的地址。
4.1 命令口的读/写操作
系统中CY7C68001作为TMS320VC5416的外设,占用TMS320VC5416的I/O空间,地质为0x0007-0x0000。地址分配如下:FIFO2,FIFO4,FIFO6,FIFO8和命令口的地址分别为000,001,010,011,100,而地址101,110,111则保留。CY7C68001的地址线FIFOADR[2:0]为100B时,选中CY7C68001的命令口。通过CY7C68001的命令口,可以访问37个寄存器、Endpoint0缓冲器(64个字节FIFO)和描述表(500个字节FIFO)等,如果将Endpoint0缓冲器和描述表也看成是寄存器,那么单个命令口下内含了众多的寄存器,对这些寄存器进行读/写访问采用二次寻址方式,即首先通过命令口将要寻址寄存器子地址和操作类型(读操作还是写操作)写入,然后再通过命令口将数据读出或写入相应的寄存器,写入命令口的内容称为命令字,命令字包含要寻址的寄存器的子地址,或是要写入寄存器数据的高位4位或低4位,读命令口必须在给命令口写入命令字之后,所读出的为相应寄存器的8位数据。在这里,对寄存器的操作均以8位数据宽度进行。
4.1.1 TMS320VC5416对CY7C68001寄存器的写操作过程
(1)将TMS320VC5416对I/O空间访问的等待周期设为7;
(2)通过检查系统状态寄存器0(sysstat0)位2(USBRDY)等待CY7C68001的Ready线变高;
(3)寻址CY7C68001命令口(最低3位地址必须为100B),将10xx,xxxxB写命令字写入命令寄存器(xx,xxxxB代表需寻址的寄存器的子地址);
(4)通过检查系统状态寄存器0(sysstat0)位2(USBRDY)等待CY7C68001的Ready线变高;
(5)寻址CY7C68001命令口(最低3位地址必须为100B),将0xxx,D7D6D5D4B数据高4位命令字写入命令寄存器(D7D6D5D4B代表要写入的数据的高4位);
(6)通过检查系统状态寄存器0(sysstat0)位2(USBRDY)等待CY7C68001的Ready线变高;
(7)寻址CY7C68001命令(最低3位地址必须为100B),将0xxx,D3D2D1D0B数据低4位命令字写入命令寄存器(D3D2D1D0B代表要写入的数据的低4位)。
4.1.2 TMS320VC5416对CY7C68001寄存器的读操作过程
(1)TMS320VC5416对I/O空间访问的等待周期设为7;
(2)通过检查系统状态寄存器0(sysstat0)位2(USBRDY)等待CY7C68001的Ready线变高;
(3)寻址CY7C68001命令口(最低3位地址必须为100B),将11xx,xxxxB读命令字写入命令寄存器(xx,xxxxB代表需寻址的寄存器的子地址);
(4)等CY7C68001申请TMS320VC5416的外部中断XINT2反;
(5)寻址CY7C68001命令口(最低3位地址必须为100B),读CY7C68001命令口。
4.2 FIFO数据接口的操作
对数据接口的写操作用到了SX2_FifoWriteSingle()函数,负责向USB的数据缓冲区中写数据,由于这个写程序是在主频为160MHz时的设置,为了满足数据保持时间最小为10ns,需要清空流水线,加入3个空操作NOP,I/O系统的等待周期为2个;对数据接口读操作用到了函数SX2_FifoReadSingle(),例如从端口4读一个字节
POPM AH POPM AL PSHM AL PSHM AH SUB#1,A BC fifo_r3rd,ANEQ PORTR usbfifo4,*AR0 POPM AH POPM AL B fifoReadExit
另外,程序中用到了中断函数int2_isr(),在读周期,主机申请读寄存器的值,此时产生中断,从SX2读进数据;
5 USB的编程
5.1 USB的初始化
CY7C68001有E2PROM自举和通过DSP自举2种自举方式,在本系统中这两种方式均可以,一般采用E2PROM来进行USB的初始化,在E2PROM中初始化的顺序如下:
0xC4通知EZ_USB SX2有一个有效的E2PROM存在;
IFCONFIG 设置IFCONFIG寄存器,其函数为Write_SX2reg();
POLAR设置各个信号的极性,其中SLOW,SLRD,SLWR只能由E2PROM来配置;
Descriptor 是否从E2PROM中装入初始化表。当值为0xc4时装入,反之等待Master装入;
Descriptor Length 这是两个字节的空间,指示E2PROM中Descriptor的长度;
Descriptor Data 描述表的内容,其函数为Load_descriptors()。
USB的编程主要分为2个部分,一是HOST方面驱动程序的编写,一是有关DSP与USB数据与命令的交换,
5.2 HOST端程序
HOST端需要编写USB设备驱动程序和应用程序。
USB设备驱动程序主要是通过调用微软的USBD.SYS来实现PC机与USB总线的数据交换。因而USB设备驱动程序主要完成的功能如下:
(1)对相应的USB设备建立设备驱动对象并完成对USB设备的初始化;
(2)完成USB设备的即插即用功能;
(3)完成USB设备电源的管理;
(4)实现对USBD.SYS的调用,完成对USB设备的控制与数据的交换;
(5)实现对USB通讯措施的处理。
USB设备应用程序主要用到以下几个函数:
OpenDriver()打开驱动程序;
CloseDriver()关闭驱动程序;
Sx2GetDeviceDesc()获取描述表;
Sx2GetconfigDesc()获取配置说明;
Sx2GetPipeInfo()获取接口信息;
Sx2SendVendorReq()向USB发送请求;
Sx2BulkdataTrans()在PC和USB间传递数据。
5.3 TMS320VC5416端程序
TMS320VC5416是通过其I/O口来完成CY7C68001的数据交换的,在这部分程序中主要完成以下功能:
(1)完成对命令接口的读与写;
(2)完成对FIFO接口的读与写;
(3)完成TMS320VC5416对USB的自举;
(4)完成TMS320VC5416与USB的控制命令的传输;
(5)完成TMS320VC5416与USB的各种方式的数据传输。
6 结语
本文以TMS320VC5416为核心,利用CY7C68001实现了USB2.0设备接口协议,试验证明该系统可以满足高速信号处理的要求,并具有速度快和可靠性高等优点。