在USB官方网站( http://www.usb.org/ )包含了我们必需的所有的USB协议规范。目前官网最新规范为USB 3.2。默认打开官网的 Document 菜单,显示的就是 USB 3.2 的相关规范文档,在 Document 菜单下有USB2.0相关规范。USB 2.0 的下载页面为http://www.usb.org/developers/docs/usb20_docs/。
其中 USB 规范定义了各种 USB Class,具体看见http://www.usb.org/developers/docs/devclass_docs/。该页面下面就是每个类对应的文档。
USB(Universal Serial Bus) 是一种支持热插拔的高速串行传输总线,它使用 差分信号 来传输数据。在 USB 1.0和 USB 1.1 版本中,只支持 1.5Mb/s 的低速(low-speed)模式和 12Mb/s 的全速(full-speed)模式,在 USB 2.0 中,又加入了480Mb/s 的高速模式,USB 3.0(super speed),传输速率最大5Gbps。USB 2.0 被设计成为向下兼容的模式,当有全速(USB 1.1)或者低速(USB 1.0)设备连接到高速(USB 2.0)主机时,主机可以通过分离传输来支持它们。一条USB 总线上,可达到的最高传输速度等级由该总线上最慢的“设备”决定。
由于USB是主从模式的结构,设备与设备之间、主机与主机之间不能互连,为解决这个问题,扩大USB的应用范围,出现了USB规范的扩展部分USB OTG(ON The Go)。USB OTG 同一个设备,在不同的场合下可行在主机和从机之间切换。
以下部分主要根据 USB 2.0 规范的第四章,USB 体系包括 USB host(主机) 、USB device(设备) 以及 物理连接(USB interconnect) 三个部分。其中,设备(USB device) 又分为 USB function 和 USB Hub。
(1)一个 USB HOST 最多可以同时支持128 个地址,地址0 作为默认地址,只在设备枚举期间临时使用,而不能被分配给任何一个设备,因此一个USB HOST 最多可以同时支持127 个地址,如果一个设备只占用一个地址,那么可最多支持127 个USB 设备。在实际的USB 体系中,如果要连接127 个USB设备,必须要使用USB HUB,而USB HUB 也是需要占用地址的,所以实际可支持的USB 功能设备的数量将小于127。
(2)ROOT HUB 是一个特殊的USB HUB,它集成在主机控制器里,不占用地址。ROOT HUB 不但实现了普通USB HUB 的功能,还包括其他一些功能。
(3)“复合设备(Compound Device)”可以占用多个地址。所谓复合设备其实就是把多个功能设备通过内置的USB HUB 组合而成的设备,比如带录音话筒的USB 摄像头等。
以HOST-ROOT HUB为起点,最多支持7 层(Tier),也就是说任何一个
USB 系统中最多可以允许5个USB HUB 级联。一个复合设备(Compound Device)将同时占据两层或更多的层。
管道(Pipe)是主机和设备端点之间数据传输的模型,共有两种类型的管道:***无格式的流管道(Stream Pipe)***和***有格式的信息管道(Message Pipe)***。任何USB 设备一旦上电就存在一个信息管道,即默认的控制管道,USB 主机通过该管道来获取设备的描述、配置、状态,并对设备进行配置。
该部分主要针对USB 2.0规范的第六章和第七章。在USB 2.0系统中要求USB传输线使用屏蔽双绞线。USB 支持“总线供电”和“自供电”两种供电模式。在总线供电模式下,设备最多可以获得500mA 的电流。一条USB传输线分别由地线、电源线、D+ 和 D- 四条线构成,*** D+ 和 D- 是差分输入线***。它使用的是 3.3V 的电压(与 CMOS 的 5V 电平不同),而电源线和地线可向设备提供 5V 电压,最大电流为 500mA (可以在编程中设置)。
在 USB2.0 规范中,定义了以下一些电平信号:
针对低速 / 全速模式,有以下几个重要信号:
(1)主机在挂起设备后可通过翻转数据线上的极性并保持20ms来唤醒设备,并以低速EOP信号结尾。
(2)带远程唤醒功能的设备还可自己发起该唤醒信号;前提是设备已进入idle状态至少5ms,然后发出唤醒K信号,维持1ms到15ms并由主机在1ms内接管来继续驱动唤醒信号
规范中给出的各信号电平如下图所示:
规范中给出的DC 电气特性如下图所示:
以下部分主要根据 USB 2.0 规范的第八章。数据在USB线里传送是由低位到高位发送的。USB采用 NRZI(非归零编码) 对发送的数据包进行编码。即:输入数据0,编码成“电平翻转”;输入数据1,编码成“电平不变”。
USB采用不归零取反来传输数据,当传输线上的差分数据输入0时就取反,输入1时就保持原值,为了确保信号发送的准确性,当在USB总线上发送一个包时,传输设备就要进行位插入操作(即在数据流中每连续 6 个 1 后就插入一个0) ,从而强迫 NRZI 码发生变化。接收方解码 NRZI 码流,然后识别出填充位,并丢弃它们。这些是由专门硬件处理的。
USB 数据是由二进制数字串构成的,首先 数字串组成域(有七种) , 域再组成包 , 包再组成事务(IN、OUT、SETUP) ,事务最后组成传输(中断传输、并行传输、批量传输和控制传输) 。下面介绍一下域、包和事务。
USB协议规定了四种传输(transfer)类型:批量传输、同步传输、中断传输和控制传输。其中,批量传输、同步传输和中断传输每传输一次数据都是一个事务,控制传输包括三个过程,建立过程和状态过程分别是一个事务,数据过程则可能包含多个事务。
首先介绍几个关键字:
注意:虽然高速USB总线和全速/低速USB总线的帧周期不一样,但是SOF包中帧编号的增加速度是一样的,因为在高速USB系统中,SOF包中帧编号实际上取得是计数器的高11位,最低三位作为微帧编号没有使用,因此其帧编号的增加周期也为 1mS。
域一个包被分为不同域,域是USB数据最小的单位,由若干位组成(多少位由具体的域决定)。根据不同类型的包,所包含的域是不一样的。但都要 以同步域SYNC开始 ,紧跟一个包标识符PID ,最终 以包结束符EOP 来结束这个包。
仅在帧首传输一次 SOF 包
包(Packet)是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。
包是USB总线上数据传输的最小单位,不能被打断或干扰,否则会引发错误。若干个数据包组成一次事务传输,一次事务传输也不能打断,属于一次事务传输的几个包必须连续,不能跨帧完成。一次传输由一次到多次事务传输构成,可以跨帧完成。
由域构成的包有四种类型,分别是令牌包、数据包、握手包和特殊包,前面三种是重要的包,不同包的域结构不同,介绍如下:
SYNC + PID + (ADDR + ENDP) + CRC5(五位的校验码)
SYNC + PID + 11位FRAM + CRC5(五位的校验码)
SYNC + PID + 0~1024字节 + CRC16
低速设备允许的最大数据有效载荷大小为8个字节。 全速设备的最大数据有效载荷大小为1023.高速设备的最大数据有效载荷大小为1024个字节。
SYNC + PID
在USB上数据信息的一次接收或发送的处理过程称为事务处理(Transaction),分别有IN、OUT和SETUP三大事务。一个事务由一系统packet组成,具体由哪些packet组成,它取决于具体的事务。可能由如下包组成:
事务的三种类型如下(以下按三个阶段来说明一个事务):
表示USB主机从总线上的某个USB设备接收一个数据包的过程。
令牌包阶段——主机发送一个PID为IN的输入包给设备,通知设备要往主机发送数据;
数据包阶段——设备根据情况会作出三种反应(要注意:数据包阶段也不总是传送数据的,根据传输情况还会提前进入握手包阶段)。
输出事务处理:表示USB主机把一个数据包输出到总线上的某个USB设备接收的过程。
令牌包阶段——主机发送一个PID为OUT的输出包给设备,通知设备要接收数据;
数据包阶段——比较简单,就是主机会往设备送数据,DATA0与DATA1交替
握手包阶段——设备根据情况会作出三种反应
令牌包阶段——主机发送一个PID为SETUP的输出包给设备,通知设备要接收数据;
数据包阶段——比较简单,就是主机往设备送数据,注意,这里只有一个固定为8个字节的DATA0包,这8个字节的内容就是标准的USB设备请求命令。
握手包阶段——设备接收到主机的命令信息后,返回ACK,此后总线进入空闲状态,并准备下一个传输(在SETUP事务后通常是一个IN或OUT事务构成的传输)。
以下部分主要根据 USB 2.0 规范的第五章和第八章 。USB系统中的数据传输,宏观看是在HOST和USB功能设备之间进行。微观看是在应用软件的Buffer和USB功能设备的端点之间进行。一般来说端点都有Buffer,可以认为USB通讯就是应用软件Buffer和设备端点Buffer之间的数据交换,交换的通道称为管道。通常需要多个管道来完成数据交换,因为同一管道只支持一种类型的数据传输。用在一起来对设备进行控制的若干管道称为设备的接口,这就是端点、管道和接口的关系。Host与Device之间的通信视图如下:
USB 采用“令牌包”-“数据包”-“握手包”的传输机制,在令牌包中指定数据包去向或者来源的设备地址和端点(Endpoint),从而保证了只有一个设备对被广播的数据包/令牌包作出响应。握手包表示了传输的成功与否。
USB 采用轮询的广播机制传输数据,所有的传输都由主机发起,任何时刻整个 USB 体系内仅允许一个数据包的传输,即不同物理传输线上看到的数据包都是同一被广播的数据包。
各种传输类型下,对于包长、速率限制如下:
传输由OUT、IN和SETUP事务构成,传输有四种类型,中断传输、批量传输、同步传输、控制传输,其中中断传输和批量传输的结构一样,同步传输有最简单的结构,而控制传输是最重要的也是最复杂的传输。
控制传输是一种可靠的双向传输,是最重要也是最复杂的。一次控制传输分为三(或两个)个阶段:建立(Setup)、数据(DATA)(可能没有)以及状态(Status)。每个阶段都由一次或多次(数据阶段)事务传输组成(Transaction)。在USB设备初次接到主机后,主机通过控制传输来交换信息、设备地址和读取设备的描述符,使得主机识别设备,并安装相应的驱动程序,这是每一个USB开发者都要关心的问题。
控制传输是双向的传输,必须有IN和OUT两个方向上的特定端点号的控制端点来完成两个方向上的控制传输
建立阶段: 主机从USB设备获取配置信息,并设置设备的配置值。建立阶段的数据交换包含了SETUP令牌封包、紧随其后的DATA0数据封包以及ACK握手封包。它的作用是执行一个设置(概念含糊)的数据交换,并定义此控制传输的内容(即:在Data Stage中IN或OUT的data包个数,及发送方向,在Setup Stage已经被设定)。
建立阶段,Device 只能返回ACK包,或者不返回任何包。
数据阶段: 数据过程是可选的。一个数据过程包含一笔或者多笔数据事务。数据过程的第一个数据包必须是DATA1包,然后每次正确传输一个数据包就在DATA0和DATA1之间交替。
根据数据阶段的数据传输的方向,控制传输又可分为3种类型:
控制读取(读取USB描述符): 是将数据从设备读到主机上,读取的数据USB设备描述符。该过程如上图的【Control Read】所示。对每一个数据信息包而言,首先,主机会发送一个IN令牌信息包,表示要读数据进来。然后,设备将数据通过DATA1/DATA0数据信息包回传给主机。最后,主机将以下列的方式加以响应:当数据已经正确接收时,主机送出ACK令牌信息包;当主机正在忙碌时,发出NAK握手信息包;当发生了错误时,主机发出STALL握手信息包。
控制写入(配置USB设备): 是将数据从主机传到设备上,所传的数据即为对USB设备的配置信息,该过程如上图的【Control Wirte】所示。对每一个数据信息包而言,主机将会送出一个OUT令牌信息包,表示数据要送出去。紧接着,主机将数据通过DATA1/DATA0数据信息包传递至设备。最后,设备将以下列方式加以响应:当数据已经正确接收时,设备送出ACK令牌信息包;当设备正在忙碌时,设备发出NAK握手信息包;当发生了错误时,设备发出STALL握手信息包。
无数据控制: 如上图
状态阶段: 用来表示整个传输的过程已完全结束。通过一次IN/OUT传输表明请求是否成功完成。
状态阶段传输的方向必须与数据阶段的方向相反,即原来是IN令牌封包,这个阶段应为OUT令牌封包;反之,原来是OUT令牌封包,这个阶段应为IN令牌封包。
对于【控制读取】而言,主机会送出OUT令牌封包,其后再跟着0长度的DATA1封包。而此时,设备也会做出相对应的动作,送ACK握手封包、NAK握手封包或STALL握手封包。
相对地对于【控制写入】传输,主机会送出IN令牌封包,然后设备送出表示完成状态阶段的0长度的DATA1封包,主机再做出相对应的动作:送ACK握手封包、NAK握手封包或STALL握手封包。
控制传输通过控制管道在应用软件和Device的控制端点之间进行,控制传输过程中传输的数据是有格式定义的,USB 设备或主机可根据格式定义解析获得的数据含义。其他三种传输类型都没有格式定义。控制传输对于最大包长度有固定的要求。对于高速设备该值为64Byte,对于低速设备该值为8,全速设备可以是8或16或32或64。
最大包长度表征了一个端点单次接收/发送数据的能力,实际上反应的是该端点对应Buffer的大小。Buffer越大,单次可接收/发送的数据包越大,反之亦反。当通过一个端点进行数据传输时,若数据的大小超过该端点的最大包长度时,需要将数据分成若干个数据包传输。并保证除最后一个包外,所有的包长度均等于该最大包长度。这也就是说如果一个端点收到/发送了一个长度小于最大包长度的包,即意味着数据传输结束。
控制传输在访问总线时也受到一些限制,如高速端点的控制传输不能占用超过 20%的微帧,全速和低速的则不能超过 10%。在一帧内如果有多余的未用时间,并且没有同步和中断传输,可以用来进行控制传输。
与批量传输相比,在流程上并没有多大区别,区别只在于该事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。
中断传输是一种轮询的传输方式,是一种单向的传输。HOST通过固定的间隔对中断端点进行查询,若有数据传输或可以接收数据则返回数据或发送数据。否则返回NAK,表示尚未准备好。中断传输的延迟有保证,但并非实时传输,它是一种延迟有限的可靠传输,支持错误重传。对于高速/全速/低速端点,最大包长度分别可以达到1024/64/8 Bytes。 高速中断传输不得占用超过 80%的微帧时间,全速和低速不得超过90%。 中断端点的轮询间隔由在端点描述符中定义,全速端点的轮询间隔可以是1 ~ 255mS。低速端点为10 ~ 255mS,高速端点为(2interval-1)*125uS,其中 interval 取 1到 16 之间的值。
除高速高带宽中断端点外,一个微帧内仅允许一次中断事务传输。高速高带宽端点最多可以在一个微帧内进行三次中断事务传输,传输高达 3072 字节的数据。
所谓单向传输,并不是说该传输只支持一个方向的传输。而是指在某个端点上该传输仅支持一个方向,或输出、或输入。如果需要在两个方向上进行某种单向传输,需要占用两个端点,分别配置成不同的方向。可以拥有相同的端点编号。
中断传输由OUT事务和IN事务构成,用于键盘、鼠标等HID设备的数据传输。
中断传输在流程上除不支持PING之外,其他的跟批量传输是一样的。他们之间的区别也仅在于事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。
主机在排定中断传输任务时,会根据对应中断端点描述符中指定的查询间隔发起中断传输。中断传输有较高的优先级,仅次于同步传输。同样中断传输也采用 PID 翻转的机制来保证收发端数据同步。
中断传输方式总是用于对设备的查询,以确定是否有数据需要传输。因此中断传输的方向总是从USB设备到主机。
下图为中断传输的流程图。
DATA0或DATA1中的包含的是中断信息,而不是中断数据
批量传输由OUT事务和IN事务构成,是一种可靠的单向传输,但延迟没有保证,它尽量利用可以利用的带宽来完成传输,适合数据量比较大的传输。低速USB设备不支持批量传输,高速批量端点的最大包长度为512,全速批量端点的最大包长度可以为8、16、32、64。
用于传输大量数据,要求传输不能出错,但对时间没有要求,适用于打印机、存储设备等
批量传输在访问USB总线时,相对其他传输类型具有最低的优先级,USB HOST总是优先安排其他类型的传输,当总线带宽有富余时才安排批量传输。高速的批量端点必须支持PING操作,向主机报告端点的状态。NYET表示否定应答,没有准备好接收下一个数据包,ACK 表示肯定应答,已经准备好接收下一个数据包。
它通过在硬件级执行“错误检测”和“重传”来确保host与device之间“准确无误”地传输数据,即可靠传输。它由三种包组成(即IN事务或OUT事务):
上图(USB2.0规范的8.5.2章节)中一个方框表示一个 Packet,灰色的包表示主机发出的包,白色的包表示Device发出的包。***批量传输是可靠的传输,需要握手包来表明传输的结果。***若数据量比较大,将采用多次批量事务传输来完成全部数据的传输,传输过程中数据包的PID按照 DATA0-DATA1-DATA0-…的方式翻转,以保证发送端和接收端的同步。若成功则将错误次数计数器清0,否则累加该计数器。
USB 允许连续 3次以下的传输错误,错误时会重试该传输,若成功则将错误次数计数器清零,否则累加该计数器。超过三次后,HOST 认为该端点功能错误(STALL),放弃该端点的传输任务。
一次批量传输(Transfer)由 1 次到多次批量事务传输(Transaction)组成。
上图(USB2.0规范的8.5.2章节)为批量读写时数据位和PID的变化情况。主机总是使用配置事件将总线传输的第一个事务初始化为 DATA0 PID。 第二个事务使用 DATA1 PID,并且在批量传输的其余部分中交替使用 DATA0 和 DATA1 传输数据。翻转同步:发送端按照 DATA0-DATA1-DATA0-…的顺序发送数据包,只有成功的事务传输才会导致PID翻转,也就是说发送段只有在接收到ACK后才会翻转PID,发送下一个数据包,否则会重试本次事务传输。同样,若在接收端发现接收到的数据包不是按照此顺序翻转的,比如连续收到两个DATA0,那么接收端认为第二个DATA0是前一个DATA0的重传。
同步传输是一种实时的、不可靠的传输,不支持错误重发机制。只有高速和全速端点支持同步传输,高速同步端点的最大包长度为1024,低速的为1023。由OUT事务和IN事务构成。有两个特殊地方,第一,在同步传输的IN和OUT事务中是没有返回包阶段的;第二,在数据包阶段所有的数据包都为DATA0。
它由两种包组成:
同步传输不支持“handshake”和“重传能力”,所以它是不可靠传输。
同步传输适用于必须以固定速率抵达或在指定时刻抵达,可以容忍偶尔错误的数据上。实时传输一般用于麦克风、喇叭、UVC Camera等设备。实时传输只需令牌与数据两个信息包阶段,没有握手包,故数据传错时不会重传。
除高速高带宽同步端点外,一个微帧内仅允许一次同步事务传输,高速高带宽端点最多可以在一个微帧内进行三次同步事务传输,传输高达 3072 字节的数据。全速同步传输不得占用超过 80%的帧时间,高速同步传输不得占用超过90%的微帧时间。同步端点的访问也和中断端点一样,有固定的时间间隔限制。
同步传输是不可靠的传输,所以它没有握手包,也不支持PID翻转。主机在排定事务传输时,同步传输有最高的优先级。
分离传输是在主机控制器和USB HUB之间的传输,它仅在主机控制器和HUB之间执行,通过分离传输,可以允许全速/低速设备连接到高速主机。分离传输对于USB设备来说是透明的、不可见的。
分离传输,顾名思义就是把一次完整的事务传输分成两个事务传输来完成。其出发点是高速传输和全速/低速传输的速度不相等,如果使用一次完整的事务来传输,势必会造成比较长的等待时间,从而降低了高速USB总线的利用率。通过将一次传输分成两次,将令牌(和数据)的传输与响应数据(和握手)的传输分开,这样就可以在中间插入其他高速传输,从而提高总线的利用率。