ABSTRACT: Using CY7C6801 as the control chip, the communication between DSP and PC in the voice signals processing system is realized. A brief introduction of the basic features of EZ2USB CY7C68013 and the designing of interface to TMS320C6203B is provided. The development of Programming Firmware、device driver and application are thoroughly researched.
Key words: EZ-USB FX2; CY7C68013; TMS320C6203B; data transmission
0 引言
由于DSP的工作频率较高,如TMS320C6203B时钟频率高达250MHZ,故其数据读写周期很短,然而PC机串口读写速度较低,最大数据吞吐量约为115kbps,尽管DSP在与这些慢速外设进行数据交换时可以加入额外的等待周期,但是在实时性要求苛刻,算法复杂的场合,将DSP从这些冗长的等待周期中解放出来,将其时间重点放在处理关键的实时任务中去,有着重要的实际意义[1]。为了提高系统的实时性, 高速接口电路设计显得尤为重要。目前流行的EZ-USB FX2芯片的传输速率为480Mbps,较好地解决了DSP与PC机间高速数据传输时的带宽瓶劲问题。本文设计并实现了TMS320C6000 系列DSP上, 利用EZ-USB FX2系列芯片CY7C68013 的接口技术, 实现了DSP 与计算机之间的高速数据传输。
1 CY7C68013结构特点
CY7C68013是Cypress公司研制开发的EZ-USB FX2系列芯片,该芯片符合USB2.0规范,同时兼容USB1.0的全速工作模式[2],它的功能框图主要包括5个部分(图1):
(1)收发器。USB和PC机通过D+和D-两根信号线进行数据传输,数据以480Mbit/s的全速信号或者以240Mbit/s的半速信号在D+和D-信号线上差分传输。
(2)智能接口引擎(SIE)。SIE通过包排序、信号产生、信号检测、CRC产生、CRC校验、NRZI数据编码、位填充、包标识产生和解码等功能来处理USB通信协议,并保证传送到USB电缆上的数据字节以LSB开头。
(3)通用微控制器以及片上RAM。USB控制器采用通用的8051微控制器,即编程语言为51系列单片机的通用语言,可使实际操作更加灵活方便。
(4)I2C总线控制器。主要为完成将USB控制器作为主设备时必须的配置。
(5)片内FIFO。其容量为4KB,可以快速实现与不同速度的外设通信。
2 CY7C68013与TMS320C6203B的接口电路设计
CY7C68013是一个非常方便的USB2.0实现方案,它提供与DSP连接的接口,连接方式有两种:Slave FIFOs和Master可编程接口GPIF[3]。本文采用Slave FIFOs异步读写方式。Slave FIFOs方式是从机方式,DSP可以象读写普通FIFO一样对CY7C68013内部的多层缓冲进行读写。具体的电路连接如图2所示:
图1 CY7C68013功能框图
图2 CY7C68013与TMS320C6203B电路连接图
FLAGA、FLAGB和FLAGC是CY7C68013内部FIFO的状态标志,TMS320C6203B通过通用I/O口获得CY7C68013内部FIFO的空、半满(由用户设定半满阈值)和满这3个状态信号,EMIF接口的CE2空间对CY7C68013进行读写操作。其工作过程为:DSP通过USB向PC发送数据时,首先查看空、半满和满这3个状态信号,然后向USB写入适当大小的数据,以保证数据不会溢出;PC机通过USB向DSP发送命令字时,USB通过中断方式通知DSP读取命令字。
3 软件设计
系统的软件设计包括3部分:C8051固件设计、设备驱动程序没计和应用软件设计。CY7C68013的功能具体实现过程如下:
(1)当设备连接时,Windows的设备管理器自动检测到该设备,并读取由CY7C68013核心(并非C805l固件)传回的设备描述符,根据它提供的厂商和产品ID号VID/PID(存放在FX2外接E2PROM中)与.inf文件进行比较,找到固件下载驱动程序(ezloader.sys),从主机将C8051固件下载到CY7C68013的RAM中。
(2)C8051固件下载到RAM后,CY7C68013仿真一个脱离再连接至USB总线的过程,执行重新枚举过程,让C805l固件控制USB传输。Windows的设备管理器会检测到新的USB设备的连接,并根据C8051固件提供的厂商ID(VID)/产品ID(PID)(不同于CY7C68013核心提供的VID/PID)来加载该USB设备的设备驱动程序。
(3)应用软件调用CreateFile()API函数,使用识别该设备的符号链接来取得该设备的代号。取得设备的句柄后,应用软件通过DeviceIoControl()向I/O系统服务发出要求传入数据的I/O请求,I/O管理器将此请求构造成一个合适的IRP传递给CY7C68013设备驱动程序。CY7C68013设备驱动程序根据该IRP中包含的具体操作来构造相应的USB请求块,并据此形成新的IRP传递给USB总线驱动程序。USB总线驱动程序根据该USB请求块从CY7C68013设备读取数据。操作的结果再用IRP一层一层地返回给应用程序,应用程序再对数据进行分析和处理[4]。
3.1 C8051固件设计
Cypress公司为了简化固件开发,缩短时间,加速USB外围的开发,在EZ-USB FX2软件开发包里提供了固件架构。该固件架构利用C8051的程序代码来实现CY7C68013芯片起始设置、USB标准设备请求的处理以及USB闲置模式的电源管理服务。用户仅需提供其USB描述符表(即dscr.a51)及实现外围功能的程序代码(periph.c),即可完成完全兼容的USB设备。
固件的编译在Kei的集成开发环境中进行,在建立的项目中包含5个文件ez_usb.lib、
usbjmptb.obj、dscr.a51和periph.c,其中:
固件架构程序流程如图3所示。该程序首先初始化所有的内部状态变量,然后调用TD_Init函数进行初始化,初始化主要包括:
(1)使CY7C68013工作于异步从FIFO模式。相应的寄存器操作为IFCONFIG=0xCB。
(2)将4KB的FIFO对应到两个端点(EndPoint),即EndPoint2和EndPoint6。相应的寄存器操作为:EP2(:FG=0xA0,EP6(:FG=0xE2。EndPoint2与EndPoint6分别对应21kB的内部FIFO(下面分别称作FIF02,FIF06),存放LJSB需要上传与接收的数据。其中EndPoint2为OUT型,负责从主机接收数据;EndPoint6为IN型,负责向主机发送数据。另外EndPoint2
与EndPoint6均采用批量(BULK)传输方式,这种方式相对于其他LJSB2.0定义的传输方式
具有数据可靠、传输速率高等特点,是最常用的传输方式。www.51kaifa.com/
(3)对FIF0进行配置。相应的寄存器操作为E192FIFO(:FG=0xl 1,EP6FIFOCFG=0x0D。本案例将FIF02,FIF06设置成自动方式。
图3 固件架构程序流程
初始化完成后,打开中断,之后固件程序开始枚举USB设备,直至端点0上接收到通信建立包时为止[5]。一旦收到通信建立包,将重复执行下面的任务分配过程:
(1)调用TD_Poll()函数,以完成用户指定的任务。
(2)判断是否有USB设备请求?如果有,则调用ParseControlTransfer()函数进行相应的处理;如果没有,则继续向下执行。
(3)检测USB总线是否空闲。如果空闲,则调用TD_Suspend()函数,交由用户处理。在TD_Suspend返回真值后,8051处于空闲状态。这时,只有USB总线活动或芯片Wakeup管脚活动,才能将8051重新激活。
(4)8051被激活后,固件程序将首先调用TD_Resume()函数,以使8051从空闲状态中恢复出来,然后再处理用户指令。
3.2 设备驱动程序设计
开发USB设备驱动程序,可采用Numege公司的开发包DriverWorks和Mitmsoft公司的
Windows 2000 DDK.并以VC++6 0作为辅助开发环境。
CY7C68013的设备驱动程序有两种:一种用来在设备接人时从主机下载困件到RAM中,称为固件下载驱动程序(ezloader.sys);另一种是在设备重新枚举后加载的设备驱动程序(ezusb.sys),应用软件通过该设备驱动程序与CY7C68013通信。固件的程序代码既可以通过外部E2PROM下载,也可通过主机下载。本文以从主机下载为例进行说明,若选择主机下载方式,则此时外接E2PROM中存放的是固件下载的PID/VID,且第1个字节是0xC0H,系统通过该PID/VID找到固件下载驱动程序(ezloader.sys),将相应的固件代码下载到FX2的RAM中。
在将固件下载到RAM中后,系统清除内存中的固件下载驱动程序.并进行重新枚举,让C8051固件控制CY7C68013。此时,系统获得由C8051固件提供的PID/VID(与E2PROM中的不同),认为有新的USB设备接入,并据此加载相应的设备驱动程序。
3.3 应用软件设计
应用软件满足系统与用户的接口,它通过通用驱动程序完成对外设的控制和通信,如开启/关闭USB设备、检测USB设备、设置USB数据管道等。它由动态链接库和应用程序两部分组成:动态链接库负责与USB设备驱动程序通信,响应应用程序的各种请求;应用程序则则以定时查询的方式将TMS320C6203B后的数据读入计算机事先开辟的大容量内存缓冲区, 同时从缓冲区读出数据实时显示, 处理结束后再将内存缓冲区的数据存盘以及向TMS320C6203B发送控制命令。
动态链接库对设备驱动程序的访问都是通过I/O Control调用来实现。首先调用Win32函数CreatFile()得到设备驱动程序的句柄,然后调用Win32函数DeviceIocontrol (),通过得到的句柄把IOCTL和相关的输入输出缓冲区提交给驱动程序。当应用软件退出时,用
CloseHandle()函数关闭设备。
在编写应用程序时,先建立与外没的连接,然后实施数据的传输。在系统启动信号处理算法后,为保证不丢失数据,用户程序应建立一个新的工作线程专门获取外没传来的数据。程序中主要用到两个API函数CreateFile()和DeviceIoControl()。CreatFile()取得设备句柄后,DeviceIoControl()根据该句柄完成数据传输。,
部分程序代码如下:
hDevice=CreateFile(“.EZUSB_0”,
GENERIC_READ| GENERIC_WRITE,
FILE_SHARP_WRITE,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORAL,NULL);
If(hDevice= =INVALID_HANDLE_VALUE)
{ Application->MessageBoxA(“创建设备失败,请确认设备是否连接上!”,NULL,IDOK);}
else{DeviceControl(hDevice,IOCTL_ EZUSB_BULK_WRITE,
&blkctl,sizeof(BULK_TRANSFER_CONTROL),
&inBUFFER,
sizeof(inBuffer),
&nBytes,
NULL);
…}
4 结论
采用两种方法对本系统的数据传输速度进行测试:
(1) DSP 将ADC 采集的语音信号进行处理后,将其频率、相位等数据上传给计算机进行分析处理;
(2)计算机将控制指令传给DSP。结果显示, 两种方法的传输速度均可达到64Mb/s以上, 完全可以满足实时数据处理的需要。
该接口电路在本人开发的基于DSP的语音信号采集与处理系统中, 实现了数据高速传输的任务, 工作性能良好。
本文作者创新点:传统的信号处理系统中数据传输接口在低速时常采用标准串行口或并行口, 高速时一般采用PCI总线接口。但标准串行口或并行口数据传输速率较低; PCI总线尽管数据传输速率可以达到1Gbps , 但是硬件设计和驱动开发难度较大,USB总线具有快速、双向、低价并可热插拨等特性,而且支持各种PC与外设之间的连接,本文将USB2.0接口芯片CY7C68013用于信号处理系统中,处理后的数据经USB 向计算机传输,速度得到了大大提高, 并且系统可靠性也达到了理想效果。本文所述的方法具有一定的普遍性, 可用于多种微处理扩展USB 接口的方案中。
参考文献:
[1] 徐庆元,张天序,钟胜. 基于USB 总线的高速视频采集系统设计[J].微计算机信息,2006,22(10-1):247-249.
[2] Cypress Semiconductor Corporation. EZ2 USB Technical Reference Manual[R]. 2002.
[3] Cypress Semiconductor Corporation. EZ2 USB Series FX2 Getting Started[R]. 2002.
[4] 李爽,张鸣瑞. 一种带USB接口的便携式语音采集卡的设计[J].计算机应用研究,2001,18 (5):146-148.
[5] 刘少峰,韦克平. USB 软件系统的开发[J].计算机应用研究,2002,19(3):102-104.