嵌入式USB主机



《嵌入式USB主机》由会员分享,可在线阅读,更多相关《嵌入式USB主机(19页珍藏版)》请在文档大全上搜索。
1、嵌入式系统TCP/IP网络解决方案嵌入式USB主机陈智荣(研04)温英林张辉勇摘要:本文以一个实际USB设备枚举的数据过程,讲述了USB协议中的一些关键概念和重要的数据结构、时序;在此基础上,简单介绍本系统的硬件设计,然后围绕如何实现USB设备枚举,从底层到高层详细地介绍了本系统的软件设计。关键词:USB主机 SL811HS 51单片机 枚举 嵌入式1前言USB(通用串行总线)是最近几年逐步在PC领域广为应用的新型接口技术。USB接口通用性好、实时性强、传输方式多样、成本低、易于扩展且便于使用,这些优点使它受到许多硬件厂商的青睐,其相关设备种类越来越多,数量越来越大。然而,USB的拓扑结构中居
2、于核心地位的是主机,任何一次USB的数据传输都必须由主机来发起和控制,所有的USB外设都只能和主机建立连接,任何两个外设之间无法直接通信。目前,大量扮演主机角色的是个人电脑PC机。目前使用的USB移动设备,如U盘,MP3随身听,USB接口的移动硬盘、移动光驱及数码相机等等,都只能在PC机上使用,只能通过PC机来进行数据传输和文件交换,这无疑给USB移动设备的应用带来了局限性。因此,如果能抛开PC机,使用轻便、廉价的设备就能读写操作USB外设,这将拓宽USB接口的应用范围,使人们享受更多更方便的USB接口电子产品。本设计使用51系列单片机对USB主机接口芯片SL811HS进行控制,实现了USB主
3、机的一项重要功能:枚举USB设备。2关于USB协议在本设计中,由于采用了USB主机的接口芯片,所以不需要详细了解USB传输的底层物理特性,但必须深入理解USB的数据传输的协议层,具体来说,就是USB传输中数据包,数据字段的格式和时序是如何的。2.1设备的枚举主机对USB设备的枚举指的是主机对设备的检测和配置。 在说明主机的枚举功能前,需要说明一下USB传输的数据基本结构和格式。从表1可见,在USB的数据传输中:主要有四种传输事务类型(控制、批量、中断、同步),而主机枚举设备的功能是只需要通过控制传输实现的。控制传输有三个传输阶段(建立、数据、状态,其中数据阶段是可选的)。每个传输阶段又由三个包
4、组成(令牌包、数据包、握手包、特殊包)。表 1 USB传输的数据基本结构和格式传输事务类型阶段包控制建立令牌包数据包握手包数据令牌包数据包握手包状态令牌包数据包握手包批量(不分阶段)令牌包数据包握手包中断(同上)同步(同上)其中,包是由域来组成的,共有7种域,每种域的子类型如下表所列:表 2 域和域的子类型域类型名域子类型名同步域SYNC标识域(PID)SETUP、OUT、IN、SOF、DATA0、DATA1、ACK、NAK、STALL、PRE地址域ADDR端点域ENDP帧号域FRAM数据域DATA校验域CRC5、CRC16其中,同步域的实际二进制编码为”_0000 0001”;另外,每个包是
5、以SE0态作为结束标志的。下面,就以一个实际设备枚举的全过程为例,说明USB数据传输的一些具体细节(在这里,将不列出每个包的同步域和结束标志)。2.1.1主机检测到有设备插上,总线复位当设备与主机连接时,主机就会检测到一个连接条件(USB接口芯片向CPU发出中断请求),主机就开始进行总线复位(主机强制输出SE0,即强制把D和D两信号线拉为低电平)。2.1.2主机第一次读取设备描述符主机使用默认地址(地址0)读取设备描述符,如表3所示。表 3 主机第一次读取设备描述符阶段包序号(包类型)数据内容建立包1(令牌包)主机向默认地址(地址0)设备发送建立包SETUPADDRENDPCRC50xB40x
6、000x00x08包2(数据包)主机发出建立阶段的数据包(请求获取设备描述符GET_DESCRIPTOR)DATA0DATACRC160xC380 06 0001 0000 40000xBB29包3(握手包)设备应答ACK0x4B数据包4(令牌包)主机读取数据INADDRENDPCRC50x960x000x00x0B包5(数据包)设备返回设备描述符DATA1DATACRC160xD212 01 0001 DC 00 00 10 7104 6606 0001 00 000x42C6包6(握手包)主机应答ACK0x4B状态包7(令牌包)主机发送状态响应OUTADDRENDPCRC50x870x00
7、0x00x08包8(数据包)主机发送0字节数据作状态响应DATA1DATACRC160xD20x0000包9(握手包)设备应答ACK0x4B其中,包#2中的DATA含义如下:bmRequestType=0x80:所请求数据将是从设备传到主机;标准请求命令;该命令接受者为设备bRequest=0x06:请求命令代码是GET_DESCRIPTORwValue=0x0001:描述符索引值0x00;描述符编号0x01wIndex=0x0000:接收者为设备,所以此字段为0wLength=0x4000:要求设备返回的数据长度2.1.3地址分配在地址分配事务中,主机分配给设备一个地址,如表4所示,分配的地
8、址为0x02,在以后的通信里,设备就只对0x02地址的信息作出应答,而把0地址让出来。从这个地址分配事务中也可见,控制传输的数据状态是可选的。表 4 地址分配阶段包序号(包类型)数据内容建立包10(令牌包)主机向默认地址(地址0)设备发送建立包SETUPADDRENDPCRC50xB40x000x00x08包11(数据包)主机发出建立阶段的数据包(请求设置设备的地址)DATA0DATACRC160xC300 05 02 00 00 00 00 000xD768包12(握手包)设备应答ACK0x4B状态包13(令牌包)主机要求读取传输状态INADDRENDPCRC50x960x000x00x08
9、包14(数据包)设备返回0字节数据作状态响应DATA1DATACRC160xD20x0000包15(握手包)主机应答ACK0x4B2.1.4主机从新的地址获取设备描述符(第二次读取设备描述符)分配好地址后,主机就从新的地址获取设备描述符,如表5所示。由于设备返回的第一个设备描述符中声明了该设备的端点0最大包尺寸为16个字节(0x10),所以设备分2次把设备描述符经过端点0发送出去,第一次发送16个字节,第二次发送2个。最后主机发送0字节的数据包给设备作为传输装态应答。表 5 主机从新的地址获取设备描述符(第二次读取设备描述符)阶段包序号(包类型)数据内容建立包16(令牌包)主机向新的地址(地址
10、0x02)设备发送建立包SETUPADDRENDPCRC50xB40x020x00x15包17(数据包)主机发出建立阶段的数据包(请求获取设备描述符GET_DESCRIPTOR)DATA0DATACRC160xC380 06 0001 0000 12000x072F包18(握手包)设备应答ACK0x4B数据包19(令牌包)主机读取数据INADDRENDPCRC50x960x020x00x15包20(数据包)设备返回设备描述符(前16个字节)DATA1DATACRC160xD212 01 0001 DC 00 00 10 7104 6606 0001 00 000x42C6包21(握手包)主机应
11、答ACK0x4B数据包22(令牌包)主机读取数据INADDRENDPCRC50x960x020x00x15包23(令牌包)设备返回设备描述符(后2个字节)DATA0DATACRC160xC300190FCA1包24(令牌包)主机应答ACK0x4B状态包25(令牌包)主机发送状态响应OUTADDRENDPCRC50x870x020x00x15包26(数据包)主机发送0字节数据作状态响应DATA1DATACRC160xD20x0000包27(握手包)设备应答ACK0x4B2.1.5主机读取配置描述符主机读取完设备描述符后就读取设备的配置描述符,如表6所示:表 6 主机读取配置描述符阶段包序号(包类