USB协议概述1USB总线拓扑结构2USB设备3USB主机4USB的四种传输方式4.1.控制传输4.2.中断传输4.3.批量传输4.4.同步传输5USB总线协议USBIntelUniversalSerialBus总线协议是以intel为主,并有compag,Microsoft,IBM,DEC,Northern,Telecom以及日本NEC等共七家公司共同制定的串行接口标准,199411年11月制定了第一个草案,1996年2月公布了USB规范版本1.0。USB可把多达127个外设同时联到你的系统上,所有的外设通过协议来共享USB的带宽,其12Mbps的带宽对于键盘,鼠标等低中高速外设是完全足够的。(注:在1999年2月发布的USB规范版本2.0草案中,已建议12Mbps的带宽提升到120—240Mbps。)USB允许外设在主机和其它外设工作时进行连接、配置、使用及移除,即所谓的即插即用(Plug&Play)。同时USB总线的应用可以清除PC上过多的I/O端口,而以一个串行通道取代,使PC与外设之间的连接更容易。下面简单介绍USB总线结构、原理,以使读者对USB有大致了解,如果需要了解其协议细节,请查阅USB总线规范。1USB总线拓扑结构USB体系采用分层的星型拓扑来连接所有USB设备,如下图所示:以HOST-ROOTHUB为起点,最多支持7层(Tier),也就是说任何一个USB系统中最多可以允许5个USBHUB级联。一个复合设备(CompoundDevice)将同时占据两层或更多的层。图12USB设备USB设备包括Hub和功能设备而功能设备又可以细分为定位设备字符设备等等。为了进一步叙述我们给出端点(endpoint)和管道(pipe)的概念。端点:每一个USB设备在主机看来就是一个端点的集合主机只能通过端点与设备进行通讯以使用设备的功能每个端点实际上就是一个一定大小的数据缓冲区这些端点在设备出厂时就已定义好在USB系统中每一个端点都有唯一的地址这是由设备地址和端点号给出的每个端点都有一定的特性其中包括传输方式总线访问频率带宽端点号数据包的最大容量等等端点必须在设备配置后才能生效(端点0除外)端点0通常为控制端点用于设备初始化参数等端点12等一般用作数据端点存放主机与设备间往来的数据管道:一个USB管道是驱动程序的一个数据缓冲区与一个外设端点的连接它代表了一种在两者之间移动数据的能力一旦设备被配置管道就存在了管道有两种类型数据流管道其中的数据没有USB定义的结构与消息管道其中的数据必须有USB定义的结构管道只是一个逻辑上的概念所有的设备必须支持端点0以作为设备的控制管道通过控制管道可以获取完全描述USB设备的信息包括设备类型电源管理配置端点描述等等只要设备连接到USB上并且上电端点0就可以被访问与之对应的控制管道就存在了一个USB设备可以分为三个层图2.3最底层是总线接口用来发送与接收包中间层处理总线接口与不同的端点之间的数据流通一个端点是数据最终的使用者或提供者它可以看作数据的源或接收端最上层就是USB设备所提供的功能比如鼠标或键盘等。3USB主机在USB框架中,规范主要定义了USB设备的各种状态、常用操作、USB设备请求、描述符、设备类等。这里重点介绍下枚举的过程。当设备连接到主机时,按照以下顺序进行枚举:1.连接了设备的HUB在HOST查询其状态改变端点时返回对应的bitmap,告知HOST某个PORT状态发生了改变。2.主机向HUB查询该PORT的状态,得知有设备连接,并知道了该设备的基本特性。3.主机等待(至少100mS)设备上电稳定,然后向HUB发送请求,复位并使能该PORT。4.HUB执行PORT复位操作,复位完成后该PORT就使能了。现在设备进入到defalut状态,可以从Vbus获取不超过100mA的电流。主机可以通过0地址与其通讯。5.主机通过0地址向该设备发送get_device_descriptor标准请求,获取设备的描述符。6.主机再次向HUB发送请求,复位该PORT。7.主机通过标准请求set_address给设备分配地址。8.主机通过新地址向设备发送get_device_descriptor标准请求,获取设备的描述符。9.主机通过新地址向设备发送其他get_configuration请求,获取设备的配置描述符。10.根据配置信息,主机选择合适配置,通过set_configuration请求对设备而进行配置。这时设备方可正常使用USB设备的常用操作包括:设备连接、设备移除、设备配置、地址分配、数据传输、设备挂起、设备唤醒等。USB的请求包括标准请求、类请求以及厂商请求三类。所有的请求都通过默认管道发送,按照控制传输的三个阶段进行。首先HOST通过一次控制事务传输向Device发送一个8字节的Setup包,这个包说明了请求的具体信息,如请求类型、数据传输方向、接收目标(Device/Interface/Endpoint等)。4USB的四种传输方式为了满足不同外设和用户的要求,USB提供了四种传输方式:控制传输、同步传输、中断传输、批传输。他们在数据格式、传输方向、数据包容量限制、总线访问限制等方面有着各自不同的特征:4.1.控制传输控制传输是一种可靠的双向传输,一次控制传输可分为三个阶段。第一阶段为从HOST到Device的SETUP事务传输,这个阶段指定了此次控制传输的请求类型;第二阶段为数据阶段,也有些请求没有数据阶段;第三阶段为状态阶段,通过一次IN/OUT传输表明请求是否成功完成。控制传输对于最大包长度有固定的要求。对于高速设备该值为64Byte;对于低速设备该值为8;全速设备可以是8或16或32或64。控制传输在访问总线时也受到一些限制,如:1高速端点的控制传输不能占用超过20%的微帧,全速和低速的则不能超过10%。2在一帧内如果有多余的未用时间,并且没有同步和中断传输,可以用来进行控制传输4.2.中断传输中断传输是一种轮询的传输方式,是一种单向的传输,HOST通过固定的间隔对中断端点进行查询,若有数据传输或可以接收数据则返回数据或发送数据,否则返回NAK,表示尚未准备好。中断传输的延迟有保证,但并非实时传输,它是一种延迟有限的可靠传输,支持错误重传。对于高速/全速/低速端点,最大包长度分别可以达到1024/64/8Bytes。高速中断传输不得占用超过80%的微帧时间,全速和低速不得超过90%。中断端点的轮询间隔由在端点描述符中定义,全速端点的轮询间隔可以是1~255mS,低速端点为10~255mS,高速端点为(2interval-1)*125uS,其中interval取1到16之间的值。除高速高带宽中断端点外,一个微帧内仅允许一次中断事务传输,高速高带宽端点最多可以在一个微帧内进行三次中断事务传输,传输高达3072字节的数据。4.3.批量传输批量传输是一种可靠的单向传输,但延迟没有保证,它尽量利用可以利用的带宽来完成传输,适合数据量比较大的传输。低速USB设备不支持批量传输,高速批量端点的最大包长度为512,全速批量端点的最大包长度可以为8、16、32、64。批量传输在访问USB总线时,相对其他传输类型具有最低的优先级,USBHOST总是优先安排其他类型的传输,当总线带宽有富余时才安排批量传输。高速的批量端点必须支持PING操作,向主机报告端点的状态,NYET表示否定应答,没有准备好接收下一个数据包,ACK表示肯定应答,已经准备好接收下一个数据包。4.4.同步传输同步传输是一种实时的、不可靠的传输,不支持错误重发机制。只有高速和全速端点支持同步传输,高速同步端点的最大包长度为1024,低速的为1023。除高速高带宽同步端点外,一个微帧内仅允许一次同步事务传输,高速高带宽端点最多可以在一个微帧内进行三次同步事务传输,传输高达3072字节的数据。全速同步传输不得占用超过80%的帧时间,高速同步传输不得占用超过90%的微帧时间5USB总线协议USB采用littleedian字节顺序,在总线上先传输一个字节的最低有效位,最后传输最高有效位,采用NRZI编码,若遇到连续的6个1要求进行为填充,即插入一个0。所有的USB包都由SYNC开始,高速包的SYNC宽度为32bit,全速/低速包的SYNC段度为8bit。实际接收到的SYNC产度由于USBHUB的关系,可能会小于该值。USB数据包的格式PID表征了数据包的类型,分为令牌(Token)、数据(Data)、握手(Handshacke)以及特殊包4大类,共16种类型的PID。对于令牌包来说,PID之后是7位的地址和4位的端点号。令牌包没有数据域,以5位的CRC校验和结束。SOF是一类特殊的令牌包,PID后跟的是11位的帧编号。对于数据包来说,PID之后直接跟数据域,数据域的长度为N字节,数据域后以16位的CRC校验和结束。Start-Split和Complete-Split包:在Start-Split和Complete-Split包中主要指定了此次分离传输所在的HUB的地址和下行端口编号以及端点类型(控制、中断、批量、同步)。以及此次传输中数据包在整个数据中的位置(第一个包、中间的包、末尾的包)。握手包包括ACK,NAK,STALL以及NYET四种,其中ACK表示肯定的应答,成功的数据传输;NAK表示否定的应答,失败的数据传输,要求重新传输;STALL表示功能错误或端点被设置了STALL属性;NYET表示尚未准备好,要求等待。数据在USB总线上的传输以包为单位,包只能在帧内传输。高速USB总线的帧周期为125uS,全速以及低速USB总线的帧周期为1mS。帧的起始由一个特定的包(SOF包)表示,帧尾为EOF。EOF不是一个包,而是一种电平状态,EOF期间不允许有数据传输。