1.引言
通用串行总线(USB)是一种高传输速率的串行接口总线,由于它具有即插即用、易于扩展、传输速率高、连接简单、使用方便的特点,被广泛的应用于各种计算机外设、数据采集、数字设备以及工业控制等领域中。选取合适的USB控制芯片是USB数据传输系统设计的重要环节,目前常采用USB控制芯片有两类,一类是不带MCU的控制芯片,如PDIUSBD12;而另一类是带MCU的,如EZ—USB系列等。这两类专用的控制芯片都需要通过芯片所提供的接口来与系统处理器进行通信,而本文介绍的USB接口方案没有采用专用的USB控制芯片,而是采用DSP芯片TMS320VC5509A内部集成的USB模块来完成USB通信,使系统硬件设计和调试难度都大大降低,同时也提高了系统的集成度和稳定性。
2.USB接口设计
2.1 TMS320VC5509A简介
TMS320VC5509A是TI推出的高性能、低功耗的定点DSP处理器,CPU频率最高可以运行在200MHz(内核电压工作在1.6v),每个时钟周期可执行一到两条指令,有两个算术逻辑单元(ALU),两个硬件乘法器,是一款具有较高性价比、高集成度、低功耗的DSP芯片,适用于便携式设备中。TMS320VC5509A集成了128K 16Bits RAM、32K 16Bits的ROM,且带有EMIF接口, 可实现与多种存储器之间的无缝连接。片内还有丰富的外设:2个20位的定时器;3个多通道缓冲串口(McBSP);USB全速接口(12Mbps);I2C接口;实时时钟等[1]。
2.2 TMS320VC5509A的USB模块介绍
TMS320VC5509A自带的USB模块支持USB1.1协议全速标准,该USB模块有两个控制端点(仅用于控制传输)和14个通用端点,通用端点支持中断、批量和同步传输。DSP的USB模块由串行接口引擎(SIE)、USB缓冲管理单元(UBM)、缓冲器RAM、USB的DMA控制器和缓冲器RAM仲裁器组成。DSP存储器与USB主机之间的数据传输模型如图(1)所示:在IN事务中,CPU或USB的DMA控制器将准备发送到主机的数据放到缓冲器RAM中,等待USB缓冲管理单元将数据取出后送到串行接口引擎(SIE),由SIE负责数据的发送;在OUT事务中,SIE接收到由主机发来的数据后送到UBM,再送入到缓冲器RAM中,等待CPU或USB的DMA控制器将数据取出后送到DSP的存储器中。
图(1)DSP存储器与USB主机之间的数据传输
2.3 USB 模块的时钟发生器:
USB模块有专门的时钟发生器,独立于CPU的时钟发生器,如图(2)所示,由DSP时钟发生器输出的时钟送入到CPU和其他外设(不包括USB模块),而USB模块的时钟由单独的时钟发生器为它提供。USB模块的时钟可选择用模拟锁相环(APLL)或数字锁相环(DPLL)来产生[3]。模拟锁相环与数字锁相环相比有它独特的优势,TI推荐使用模拟锁相环来产生USB模块的时钟。提供给USB模块的时钟必须设置为48MHz。
图(2)时钟发生器
2.4 USB接口硬件设计
如图(3)所示,DP、DN和PU端口接到5509A的USB模块端口引脚上,DSP的DP、DN端口以差分方式传送数据,PU端口通过1.5k的上拉电阻接到USB总线的D+端,DSP可以通过编程来控制PU端口,从而控制设备与USB总线的连接与断开。主机USB接口提供的电源经电阻分压后送入DSP,供DSP检测是否与主机的USB接口连接上。
图(3)USB接口硬件连接图
3.USB设备固件程序设计与实现
USB驱动程序主要包括两个部分:设备固件程序和主机端的设备驱动程序,设备固件程序是指运行在设备端CPU中的程序,它主要完成USB协议的处理及设备与主机的数据交换, 设备固件程序设计是重点也是难点,本文主要介绍设备固件程序的编写。
3.1 DSP 的CSL编程
在DSP系统软件设计中,一般会大量涉及到对片上外设的操作,而这往往要消耗过多的时间和精力。TI为5000系列和6000系列的DSP提供了各自的片级支持库CSL(chip support library),CSL库函数主要用于配置和控制DSP片上外设,使片上外设更容易使用,缩短开发时间,增加可移植性。用CSL来配置和管理DSP的USB模块可以使USB固件程序的开发变得更加方便和快捷。CSL已集成到CCS中,我们可利用CCS提供的图形用户接口(GUI)来对USB模块进行相应的初始化配置,或者直接调用CSL库函数来配置。
3.2 USB设备枚举过程
当主机检测到有设备连接到USB总线时,主机要向USB设备发出一系列的设备请求,获取USB设备的一些属性,如设备支持的最大传输速率、设备接口特性、设备端点个数以及每个端点支持的传输方式等。接着主机为USB设备分配一个唯一的设备地址,然后USB设备才可以正常使用,这个过程叫做枚举[4]。USB设备的枚举过程分以下几步:
1. USB设备加电,并连接上USB总线。
2. 主机检测到USB设备,总线复位,集线器发送复位信号并维持至少10毫秒。
3. 复位完成,USB设备处于缺省状态,此时设备将以缺省地址0响应主机请求
4. 主机发出请求,从缺省地址0读取USB设备的设备描述符。
5. 主机为该USB设备分配一个新的设备地址。
6. 主机从新的设备地址再次读取USB设备的设备描述符。
7. 主机读取设备的配置,包括配置描述符、该配置的所有接口描述符、接口的所有端点描述符以及字符串描述符号。
8. 主机加载设备驱动程序,USB枚举过程结束,USB设备可以正常使用了。
3.3 USB设备固件程序设计
USB设备固件程序主要包括两个部分:USB模块的初始化和USB中断服务程序,下面分别对这两个部分的实现做个简单的介绍。
3.3.1 USB模块的初始化
USB模块初始化流程为:首先关闭中断,然后设置API函数指针向量,设置USB模块时钟,初始化USB设备的端点,调用函数USB_init( )初始化USB模块,用函数IRQ_plug( )初始化中断向量表,再打开中断,最后调用函数USB_connectDev( )使USB的D+端通过1.5k电阻上拉,从而使设备接入USB总线,随后开始USB设备的枚举过程[5]。下面对USB模块初始化过程中涉及到的部分CSL库函数做个简单介绍:
USB模块时钟设置函数USB_initPLL( ),该函数有三个参数,分别是USB模块的输入时钟、USB模块的输出时钟(必须设置为48MHz)、输入时钟的分频数(该参数在USB模块的寄存器中用2 bit 来设置,即分频数只能设定为1,2,3或4,所以在硬件设计时需考虑好DSP的外部输入时钟频率,使USB模块的时钟能够设置为48MHz)。
端点初始化函数USB_initEndptObj( )有七个参数,该函数用于对端点的端点号、端点的传输方式(控制传输,中断传输,批量传输和同步传输)、端点能够接收的包的最大值、引发该端点产生中断的中断事件、产生该端点中断后去执行的函数等属性进行相应的设置。
初始化中断向量表函数IRQ_plug( )有两个参数[6],第一个参数为中断事件ID(DSP中各种类型的中断在CSL的头文件中都定义了不同的ID值),第二个参数为中断函数地址(产生与事件ID对应的中断时转而执行的中断函数的地址)。USB模块初始化的部分代码如下:
USB_EpObj usbEpObjOut0, usbEpObjIn0………; //创建USB端点
USB_EpHandle myUsbConfig[] = {&usbEpObjOut0, &usbEpObjIn0,……,NULL};
void USB_Init()
{ ……
CSL_init( ); //CSL 初始化
INT_DisableGlobal(); //关中断
USB_setAPIVectorAddress(); //初始化USB模块API函数向量指针
USB_initPLL(12,48,0); //设置USB模块时钟,必须设置为48MHz
event_mask = USB_EVENT_RESET | …...;//引发端点中断的事件
/////端点初始化
USB_initEndptObj(USB0, &usbEpObjOut0, USB_OUT_EP0, USB_CTRL,0x40, event_mask, USB_ctl);
USB_initEndptObj(USB0, &usbEpObjIn0, USB_IN_EP0, USB_CTRL,0x40, event_mask, USB_ctl);
…… //其它端点初始化程序
USB_init(USB0, myUsbConfig, 0x40); //USB模块初始化
IRQ_plug(usbId,&USB_isr); //初始化中断向量表
IRQ_globalEnable(); //开中断
USB_connectDev(USB0); //设备连接到USB总线上
……
}
3.3.2 USB中断服务程序
当产生USB中断时,程序会执行相应的USB中断程序,在USB中断程序中我们可以调用函数USB_evDispatch( )来处理中断事务,该函数会清除相应的中断标志位,并且发布USB中断事件,从而去执行相应的端点中断函数。若是控制端点0中断,则执行控制端点0的中断函数,完成相应的复位、挂起、SETUP(设备请求包)等操作。若是其他通用端点中断则按照该端点初始化时定义的传输方式来完成数据传输。USB中断函数及端点中断函数的部分程序如下:
interrupt void USB_isr() //USB中断
{ USB_evDispatch( ); }
//控制端点0中断处理函数
void USB_ctl(USB_DevNum DevNum, USB_EpHandle hEp0In,USB_EpHandle hEp0Out)
{ ……
if(USB_ctl_events & USB_EVENT_RESET) {…… } //复位处理
if(USB_ctl_events & USB_EVENT_SUSPEND) {…… } //挂起处理
if((USB_ctl_events & USB_EVENT_SETUP) == USB_EVENT_SETUP) //收到SETUP包
{
if(USB_getSetupPacket(DevNum,&USB_Setup) == USB_TRUE)
{…… } //处理SETUP包,完成相应的USB设备枚举操作
}
……
}
…… //其它端点中断函数
3.4 USB设备固件程序流程图
如图(4)所示,DSP及其USB模块的初始化完成后进入主循环,等待USB中断。若是控制端点中断则进入控制端点中断服务程序,完成设备枚举的相关操作;若是通用端点中断,则按照通用端点定义的传输方式来完成数据的传输。然后中断返回,进入主循环。
4.结论
本文介绍的采用TMS320VC5509A自带的USB接口来完成USB数据传输的方案,使系统硬件设计的复杂度和系统调试的难度都大大的降低,同时也提高了系统的集成度和稳定性,减小了系统体积和功耗,适合于在便携式产品中应用。
图(4)USB设备固件程序流程图 |
参考文献:
[1] TMS320VC5509A Fixed-Point Digital Signal Processor Texas Instruments Incorporated June 2006
[2] 滕岩峰 周雪峰 带USB接口的100MHZ高速数据采集系统的设计与实现[J].微计算机信息 2006.22.7-2
[3] Using the USB APLL on the TMS320VC5509A Texas Instruments Incorporated February 2004
[4] 陈启美、丁传锁编著 计算机USB接口技术 南京大学出版社 2003
[5] TMS320C55x CSL USB Programmer’s Reference Guide Texas Instruments Incorporated October 2001
[6] TMS320C55x Chip Support Library API Reference Guide Texas Instruments Incorporated September 2004