摘 要:在简单介绍嵌入式title="USB">USB芯片SL811HS的基础上,给出了DSP的嵌入式USB主机接口软、硬件设计的思路和方法,用以实现DSP和USB设备间的数据传输。
关键词:嵌入式USB DSP USB固件 海量存储器
近年来,通用串行总线(USB)发展非常迅速,它具有成本低、速度快、总线供电、可热插拔等特点,被认为是目前PC和外设连接的最佳方案,因而得到了广泛的应用。USB技术规范将USB数据传输双方划分为2种类型:HOST和SLAVE,即主机和从属设备。目前,USB主机一般都是由PC担任,而市场上各式各样的USB产品基本上都是SLAVE。USB技术在PC上应用获得成功的同时,USB开发者还为USB寻找到了新的应用空间——嵌入式系统领域,使嵌入式USB技术成为USB发展的新亮点。该技术可应用在多种场合,例如:数码相机可以将拍下的照片随时转移到移动存储器上或者直接在打印机上输出,手机和PDA等手持设备间可随意交换音频、视频等及其他各类文件……其市场前景巨大。
本文介绍采用TMS320VC54xDSP和嵌入式USB主机芯片的连接,实现USB设备和DSP的数据传输。
1 SL811HS芯片
SL811HS是Cypress公司的一款低价位的嵌入式USB主/从二用芯片。SL811HS支持USB1.1规范,工作在主机模式下,可以和低速或全速设备进行通信,可以很方便地和MCU、DSP等处理器或者和ISA、PCMCIA等总线建立连接。
SL811HS主机模式下的功能框图如图1所示。在片选信号nCS、读闸门信号nRD、写闸门信号nWR等控制信号、地址线A0和数据总线D0~D7的作用下,它可以映射到处理器的I/O空间或存储器空间。SL811HS片内有256字节的RAM,其中低16字节是控制寄存器和状态寄存器,剩下的240字节用作数据缓存。地址线A0的使用比较特殊,访问芯片时,首先将A0置0,通过D0~D7写入目标RAM地址,然后在下一次读写周期中,将A0置1,这样D0~D7上就变成访问的数据。在每次读写操作后,RAM地址指针会自动指向下一个数据单元。
SL811HS片内寄存器分为二部分,第一部分负责USB的传输,包括USB主机控制寄存器(USB Host Control Register)、USB主机基址寄存器(USB Host Base Address)、USB主机长度寄存器(USB Host Base Length)、USB主机令牌、端点寄存器(USB Host PID, Device Endpoint)、USB状态寄存器(USB Status)、USB主机设备地址寄存器(USB Host Device Address)、USB传输计数器(USB Transfer Count);第二部分负责SL811HS的工作,包括控制寄存器1(Control Register 1)、中断使能寄存器(Interrupt Enable Register)、中断状态寄存器(Interrupt Status Register)、SOF低位计数器(SOF Counter LOW)、硬件版本寄存器(HW Revision Register),SOF高位计数器(SOF Counter HIGH)、控制寄存器2(Control Register 2)。
处理器通过访问上述寄存器来进行数据传输控制和获取传输状态。另外,SL811HS提供了USB-A和USB-B二组USB主机控制寄存器,因此可以采用乒乓方式进行USB传输。而数据的CRC校验则由芯片自动完成。
2 硬件设计
本设计中采用的DSP是TI公司的TMS320VC5402,它有64KB的I/O空间,映射SL811HS非常简单。TMS320VC5402与SL811HS的硬件连接图如图2所示。
硬件设计很简单,SL811HS的M/S接高电平,工作在主机模式下;DSP的IOSTRB#作为片选nCS输入;读写信号的逻辑表达式分别为:nRD=IOSTRB#+(!R/W#),nWR= IOSTRB#+R/W#;二者的地址线A0和数据线D0~D7对应连接;DSP的输出XF提供硬件复位脉冲。此外,由于SL811HS的中断请求INTR高电平有效,而DSP的中断是下降沿触发,所以INTR要经过非运算后才能接到INT0#上。经过如上的映射,DSP向奇地址I/O空间写数据对选择SL811HS的目标RAM,访问偶地址I/O空间时则传输相应的数据。
3 软件设计
3.1 SL811HS存储器读写软件
SL811HS片内RAM的访问可以用2个函数实现:Wr811hsBuf(u16 address,u16*buffer、u16 length)和Rd811-hsBuf(u16 address,u16*buffer,u16 length),其中的参数分别为SL811HS的RAM地址、DSP数据单元指针和访问字节数,以下给出它们的源代码。
void Wr811hsBuf(u16 address,u16*buffer,u16 length)
{ port0000=address;//选择SL811HS要写
//的第1个RAM单元
While(length--)//将DSP缓冲区的数据
//逐一写入SL811HS
port0001=*buffer++;//每写1次,SL811HS
//自动指向下一个RAM单元
}
void Rd811hsBuf(u16 address,u16*buffer,u16 length)
{ port0000=address;//选择SL811HS要读的
//第1个RAM单元
While(length--) //将SL811HS的数据
//逐一读出放到DSP缓冲区
*buffer++=port0001;//每读1次,SL811HS
//自动指向下一个RAM单元
}
3.2 USB主机的Firmware设计
USB的设计最困难的就是Firmware(固件)设计,固件编程要遵循复杂的USB规范,所以比硬件设计工作量大得多。
主机端的固件编程可以基于WINCE、VxWorks、Linux等嵌入式操作系统。Cypress公司网站上有SL811HS在这些RTOS平台上的驱动源码。但如果系统资源较少,功能比较简单,也可以不用RTOS,而直接自己编写SL811HS的USB底层驱动。笔者就是采用了这一方法,故工作量并不大。
USB事务处理一般由3个阶段组成:令牌阶段、数据阶段和握手阶段。令牌阶段定义了事务处理的类型,包括SETUP、IN和OUT;数据阶段负责运送和传输相关的数据,Data0和Data1二种数据包交替使用,以支持双方的传输同步;握手阶段由收方向发方提供反馈,告知数据是否正确接收。
在嵌入式USB设计中,固件的核心部分是USB传输函数usbXfer。usbXfer管理着USB的事务处理,其入口参数有:设备地址UsbAddr、端点地址Endpoint、令牌包类型PID、端点最大负荷Payload、传输数据总长度Length、DSP数据缓存区指针*Buffer。USB传输函数程序流程图如图3所示。
USB主机检测到设备连接好后要对其进行配置,称为设备的枚举,该部分固件的核心是设备请求函数VendorCmd。VendorCmd构建在usbXfer函数之上,通过调用usbXfer进行若干次的控制传输来实现。控制传输由3个阶段组成:建立阶段、数据阶段和状态阶段。建立阶段,主机进行SETUP事务处理,向目标设备发送标准设备请求;数据阶段,由若干个IN事务处理或OUT事务处理组成;状态阶段,主机则完成与数据阶段相反的事务处理,结束本次控制传输。
设备的枚举过程主要包括以下步骤:(1)主机请求设备控制端点0,以确定缺省管道支持的最大数据量。(2)主机给USB设备分配1个惟一的地址。(3)主机从描述符中读取配置信息并加以执行。(4)主机验证设备所需要的资源是否可以获得。(5)主机给USB设备发送1个配置值,指出如何使用该设备。
枚举成功后,主机和设备就可根据设备接口类型,采用相应的接口协议进行数据控制和传输。USB设备类型主要划分为:音频设备类、显示设备类、人机接口类、海量存储器类等。特定的设备类又划分为若干个子类,它们又有可能采用不同的接口协议传输指令和数据。以U盘为例,类代码08h(海量存储器类),子类代码06h(SCSI指令集子类),传输协议50h(Bulk-Only传输协议)。按照这些标准,则U盘的操作过程可分为指令、数据和状态3个阶段,也就是主机首先向设备Bulk-Out端点写包含SCSI的指令块(CBW),然后从Bulk-In读数据或向Bulk-Out端点写数据,最后从Bulk-In端点读取传输状态(CSW)。
4 结束语
DSP加上嵌入式USB主机接口后,一方面可以和设备之间传输数据,另一方面又可对数据进行压缩和变换等算法处理。这对于音视频信号等数据采集系统,是一个很好的接口方案。故该系统非常适用于数据采集并进行信号处理的场合。
参考文献
1 Anderson D.USB系统体系.北京:中国电力出版社,2000
2 Universal Serial Bus Specification Revision 1.1.www.usb.
org,1998
3 Cypress Semiconductor Corporation.SL811HS Datasheet.2002