一、特点
1. USB1.0和USB1.1
只有两种模式:
(1)1.5Mb/s低速(low-speed)模式(电压传输),可以不使用屏蔽和双绞线,长度不超过3米。
(2)12Mb/s全速(full-speed)模式(电压传输),需要使用带屏蔽的双绞电缆,长度不超过5米。
2. USB2.0
增加了480Mb/s高速(high-speed)模式(电流传输),需要使用带屏蔽的双绞电缆。
注意:高速模式不是强制的,而是可选的。
二、拓扑结构
1. 主从结构
主机叫做Host,从机叫做Device(设备)。
主机具有一个或多个 USB主控制器(host controller)和根集线器(root hub)。
USB集线器(usb hub)可对原有的USB口在数量上进行扩展,而不能扩展出更多的带宽。
USB的数据交换只能发生在主机与设备,主机与主机、设备与设备之间不能直接互连和交换数据。所有的数据传输由主机主动发起,而设备只是被动地负责应答。
在USB OTG中,一个设备可以在从机与主机之间切换。
2. 完整传输过程
(1)USB主控制器发出命令和数据,通过根集线器,再通过下面的集线器(如果有)发给USB设备。
(2)设备对接收的数据进行处理,返回到其上一层的集线器,层层上交直到USB主控制器为止。
(3)USB主控制器将数据交给计算机的CPU。
三、电气特性
1. NRZI编码
数据为0时电平翻转;数据为1时电平不翻转。为了防止出现长时间电平不变化,在发送数据前要经过位填充处理:当遇到连续6个1时就强制插入一个数据0。
2. 电流特性
USB协议规定:设备在未配置之前,最多从VBUS上获取100mA电流;在配置之后,最多从VBUS上获取500mA电流。VBUS是5V的电压。
3. 常规信号
信号线颜色:VBUS为红色,D-为白色,D+为绿色,GND为黑色。
四、插入检测机制
在USB集线器的每个下游端口的D+和D-上分别接了一个15kΩ的下拉电阻到地。
在USB设备端,在D+或者D-上接了一个1.5kΩ的上拉电阻到3.3V的电源。根据模式的不同,速度快的上拉电阻接正的,速度慢的上拉电阻接负的。
五、描述符
USB1.1协议定义的标准描述符:设备描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端点描述符(Endpoint Descriptor)和字符串描述符(String Descriptor)。
USB2.0协议中增加了两个新的标准描述符:Device Qualifier Descriptor和Other Speed Configuration Descriptor。
一个USB设备只有一个设备描述符。设备描述符是配置描述符的集合,配置描述符是接口描述符的集合,接口描述符是端点描述符的集合。如果有类特殊描述符,它跟在相应的接口描述符之后。
1. 设备描述符
设备所使用的USB协议版本号、设备类型、端点0的最大包大小、厂商ID(VID)和产品ID(PID),设备版本号、厂商字符串索引、产品字符串索引、设备序列号索引、可能的配置数等。
2. 配置描述符
配置所包含的接口数、配置的编号、供电方式、是否支持远程唤醒、电池需求量等。
3. 接口描述符
接口的编号、接口的端点数、接口所使用的类、子类、协议等。
4. 端点描述符
端点号及方向、端点的传输类型、最大包长度、查询时间间隔等。
5. 字符串描述符
提供一些方便人们阅读的信息,它不是必须的。
六、枚举
枚举就是从设备读取各种描述符信息,这样主机就可以根据这些信息来加载合适的驱动程序,从而知道接入的是什么样的设备。
1. 状态详解
(1)连接(Attached)
设备可以连接到USB或者从USB上拔出。USB设备从总线上拨出后的状态在规范没定义,只说明一旦USB连到总线要求的操作以及属性。
(2)上电(Powered)
USB设备的电源可来自外部电源,也可从USB接口的集线器而来。电源来自外部电源的USB设备被称作自给电源式的(self-powered)。尽管自给电源式的USB设备可能在连接上USB接口以前可能已经带电,但它们直到连线上USB接口后才能被看作是加电状态(Powered state),这时候VBUS已经对设备产生作用了。
设备对电源支持的能力是通过配置描述表(configuration descriptor)来反映的。
(3)默认状态(Default)
设备上电后,它不响应任何总线处理,直到总线接收到复位信号为止。接收到复位信号后,用默认的地址可以对设备寻址。
当用复位过程完成后,USB设备在正确的速度下操作(即低速/全速/高速)。低速和全速的数据选择由设备的终端电阻决定。能进行高速操作的设备决定它是否在复位的过程的一部分执行高速操作。
能进行高速操作的设备在全速的电气环境中操作时,必须能以全速成功复位。设备成功复位后,设备必须成功响应设备和配置描述符请求,并且返回适当的信息。当在全速下工作时,设备可能或者不能支持预定义的功能。
(4)地址(Address)
所有的USB设备在加电复位以后都使用缺省地址。每一设备在连接或复位后由主机分配一个唯一的地址。当USB设备处于挂起状态时,它保持这个地址不变。
USB设备只对缺省通道(Pipe)请求发生响应,而不管设备是否已经被分配地址或在使用缺省地址。
(5)配置状态(Configured)
在USB设备正常工作以前,设备必须被正确配置。从设备的角度来看,配置包括一个将非零值写入设备配置寄存器的操作。配置一个设备或改变一个可变的设备设置会使得与这个相关接口的终端结点的所有的状态与配置值被设成缺省值。这包括将正在使用(date toggle)的结点(end point)的 (Date toggle)被设置成DATA0。
(6)挂起状态
为节省电源,USB设备在探测不到总线传输时自动进入中止状态。当中止时,USB设备保持本身的内部状态,包括它的地址及配置。
2. 枚举过程
USB协议定义了设备的6种状态,仅在枚举过程中,设备就经历了4个状态的迁移:上电状态(Powered),默认状态(Default),地址状态(Address)和配置状态(Configured)。
(1)USB设备连接到主机,设备迁移到上电状态(Powered)。
(2)主机了解连接的设备,检测设备速度模式,然后对设备进行复位,设备迁移到默认状态(Default)。
(3)主机向地址为0的设备的端点0发送获取设备描述符的标准请求(控制传输的建立过程)。
(4)设备接收到请求后,按照主机请求的参数,在数据过程将设备描述符返回给主机。
(5)主机在成功获取到一个数据包的设备描述符并确认无误后,返回一个0长度的确认数据包(状态过程)给设备。当主机获取到设备描述符的前8个字节之后就知道了端点0的最大包长度。
(6)主机对设备又一次复位,进入地址设置阶段。
(7)主机向地址为0的设备的端点0发送设置地址的请求(控制传输的建立过程),新的设备地址包含在建立过程的数据包中。
(8)设备在接收到这个建立过程之后,因为这个控制传输没有数据过程,直接进入状态过程。
(9)主机发送请求状态包(一个输入令牌包)。
(10)设备获取并确认无误,返回0长度的状态数据包。
(11)主机获取并确认无误,发送应答包ACK。
(12)设备接收到ACK后,启用新的设备地址,设备迁移到地址状态(Address)。
(13)主机使用新设备地址再次获取设备描述符。这次主机需要获取全部的18字节的设备描述符。如果设备的端点0最大包长小于18字节,就会有多次请求数据输入(即发生多个IN令牌包)。
(14)主机获取配置描述符。配置描述符共9字节。主机在获取到配置描述符后,根据配置描述符中所描述的配置集合总长度,获取配置集合。
(15)主机通过解析描述符后,选择一个最合适的驱动给设备,然后声明已找到设备(announce_device),最后调用设备模型提供的接口将设备添加到总线设备列表(device_add)。
(16)总线遍历驱动列表中的每个驱动,调用自己的match函数查看是否匹配设备或者接口(usb_device_match),匹配的话调用device_bind_driver函数,将控制权交到设备驱动。
(17)驱动根据前面设备回复的信息,发送Set_Configuration请求来正式选择设备的哪个配置作为工作配置,设备迁移到配置状态(Configured)。
七、包结构及分类
1. 包结构
USB使用的是LSB在前MSB在后的方式。以包为基本单位,一个包被分成不同的域(field),而LSB、MSB就是以域为单位来划分。包只能在帧内传输。高速USB总线的帧周期为125us,全速以及低速USB总线的帧周期为1ms。帧起始为SOF,帧尾为EOF。SOF是一个特殊的包,但EOF不是一个包,而是一种电平状态,EOF期间不允许有数据传输。
USB包由五部分组成,即同步域(SYNC)、包标识符(PID)、数据、循环冗余校验(CRC)和包结尾(EOP),包的基本格式如下图:

USB包结构的共性:同步域 | 包识别PID | … | 包结尾EOP。
包标识符(PID)类型如下:

2. 令牌包
用来启动一次USB传输,总是由主机发送。有4种类型,分别为输出(OUT)、输入(IN)、建立(SETUP)和帧起始(SOF Start Of Frame)。
OUT、IN、SETUP令牌包结构:
同步域 | 8位包标识PID | 7位地址 | 4位端点号 | 5位CRC5校验 | EOP
SOF令牌包结构:
同步域 | 8位包标识PID | 11位帧号 | 5位CRC5校验 | EOP
3. 数据包
用来传输数据。可以从主机到设备,也可以设备到主机,方向由令牌包决定。
数据包结构:
同步域 | 8位包标识PID | 字节0 | 字节1 | … | 字节N | 16位CRC16校验 | EOP
4. 握手包
用来表示一个传输是否被对方确认。握手包只有同步域、PID和EOP。种类有ACK(正确接收数据),NAK(没有数据需要返回),STALL(设备无法执行这个请求)和NYET(高速设备输出事务中表示设备本次数据成功接收但是没有足够的空间来接收下一次数据)。
握手包结构:
同步域 | 包标识PID | EOP
5. 特殊包
特殊场合使用的包,总共4种,分别为PRE、ERR、SPLIT和PING。其中PRE、ERR和SPLIT为令牌包,PING为握手包。
八、包的传输类型
USB协议规定了4中传输类型:批量传输、等时传输(同步传输)、中断传输和控制传输。批量传输、等时传输、中断传输每传输一次数据都是一个事务。控制传输包括三个过程,建立过程、数据过程(可选)和状态过程,其中建立过程和状态过程分别是一个事务,数据过程则可能包含多个事务。
一个传输(控制、批量、中断、等时)由多个事务组成;一个事务(IN、OUT、SETUP)由两个或者三个包组成:令牌包、数据包(可选)和握手包。
1. 事务
1.1 输入(IN)事务处理
输入事务处理:表示USB主机从总线上的某个USB设备接收一个数据包的过程。
【正常】的输入事务处理

【设备忙】的输入事务处理

【设备出错】的输入事务处理

1.2 输出(OUT)事务处理
输出事务处理:表示USB主机把一个数据包输出到总线上的某个USB设备接收的过程。
【正常】的输出事务处理

【设备忙】的输出事务处理

【设备出错】的输出事务处理

1.3 设置(SETUP)事务处理
【正常】的设置事务处理

【设备忙】的设置事务处理

【设备出错】的设置事务处理

2. 控制传输
在设备的枚举过程中都是使用控制传输,它要保证数据的正确性。控制传输分为三个过程:建立过程、数据过程(可选)和状态过程。
2.1 建立过程
(1)主机发送指令包:SETUP
(2)主机发送数据包:DATA0
(3)设备返回握手包:ACK或不应答

2.2 数据过程(可选)
可以包含多个数据事务,但所有数据事务必须是同一方向的。若数据方向发送了改变,则认为进入状态过程。数据过程的第一个数据包必须为DATA1包,然后每次正确传输一个数据包后就在DATA0和DATA1之间交替。
根据数据过程的传输方向可分为3种类型:控制写入(Control Write)、控制读取(Control Read)和无数据控制(No-data Control)。

2.3 状态过程
用来表示整个传输的过程已完全结束。
只使用DATA1包,并且传输方向与数据过程相反。即原来是IN令牌封包,这个阶段应为OUT令牌封包;反之,原来是OUT令牌封包,这个阶段应为IN令牌封包。
对于控制读取,主机先发送OUT令牌封包,再发送0长度的DATA1封包;设备接收后发送ACK握手封包、NAK握手封包或STALL握手封包。
对于控制写入,主机先送出IN令牌封包;设备接收后发送表示完成状态过程的0长度的DATA1封包;主机接收后发送ACK握手封包、NAK握手封包或STALL握手封包。
3. 批量传输

3.1 批量传输输入流程
(1)主机发送IN令牌包(包含设备地址、端点号),然后切换到接收数据状态,等待设备返回数据。
(2)设备处理令牌包。如果设备检测到错误,不做任何响应,主机等待超时。如果有地址和端点匹配的设备,并且没有检测到错误,则做出响应。如果有数据需要返回,将一个数据包放到总线上;如果没有数据需要返回,则直接返回NAK握手包;如果该端点处于挂起状态,则返回STALL握手包。
(3)如果主机接收到设备发出的数据包并解码正确后,返回ACK握手包。如何主机检测到错误,则不做任何响应,设备会检测到超时。
3.2 批量传输输出流程
(1)主机发送OUT令牌包(包含设备地址、端点号)。
(2)主机发送数据包,然后切换到接收模式,等待接收设备返回的握手包。
(3)地址和端点匹配的设备接收数据包。
(4)设备处理令牌包和数据包。如果令牌包数据包都准确无误,并且有足够的缓冲区来保存数据,就会使用ACK握手包或者NYET(只有高速模式,表示本次接收成功但是没有能力接收下次传输)握手包来应答主机。如果没有足够的缓冲区来保存数据就返回NAK握手包,主机会在稍后的时间重试该批量处理事务。如果据正确但是端点处于挂起状态,则返回一个STALL握手包。如果设备检测到有错误,则不作任何响应,让主机等待超时。
3.3 PING令牌包
PING令牌包是USB2.0高速模式输出特有的。用来探测设备是否有空间接收数据,它没有数据阶段,只有握手阶段,设备根据实际的情况返回握手包。ACK握手包表示有空间接收数据,NAK握手包表示无空间接收数据,STALL握手包表示端点挂起。
4. 中断传输

中断传输由IN或OUT事务组成。
中断传输也采用PID翻转的机制来保证收发端数据同步。
中断传输是一种保证查询频率的传输。总是用于对设备的查询,以确定是否有数据需要传输。因此中断传输的方向总是从USB设备到主机。
中断端点在端点描述符中报告它的查询间隔,主机会保证在不小于这个时间间隔的范围内安排一次传输。中断传输有较高的优先级,仅次于同步传输。
中断传输可以用来不断检测某个状态,当条件满足后,再使用批量传输来传送大量的数据。
除不支持PING之外,中断传输和批量传输的结构基本上一样。他们之间的区别也仅在于事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。
5. 等时传输

等时传输主要用在数据量大,对实时性要求较高的场合。如视频设备、音频设备等。
等时传输是不可靠的传输,所以它没有握手包,也不支持PID翻转。主机在排定事务传输时,等时传输有最高的优先级。
九、端点
1. 端点类型
通常用工作模式来命名端点。例如,控制端点、批量端点等。
端点0是每个USB设备都必须具备的默认控制端点,它一上电就存在并且可用。设备的各种描述符以及主机发送的一些命令,都是通过端点0传输的。其他端点时可选的,需要根据具体的设备来决定。非0端点只有在Set Config之后才能使用。
2. 端点支持的最大包长
对于控制传输的端点,低速模式最大包长固定为8字节,高速模式最大包长固定为64字节,全速模式可在8、16、32、64字节中选择。
对于等时传输的端点,全速模式最大包长上限为1023字节,高速模式最大包长上限为1024字节,低速模式不支持等时传输。
对于中断传输的端点,低速模式最大包长上限为8字节,全速模式最大包长上限为64字节,高速模式最大包长上限为1024字节。
对于批量传输的端点,高速模式固定为512字节,全速模式最大包长可在8、16、32、64字节中选择,低速模式不支持批量传输。