一、USB概述
USB(Universal Serial Bus):通用串行总线,是一项为了简化个人计算机与外围设备的连接而诞生的技术,有着即插即用(PnP:Plug and Play) 的特性,同时也具备方便携带、传输速度快、可拓展性强等优点。
根据传输速度(总线上每秒传输的位数),USB可分为低速(1.5Mbit/s)、全速(12Mbit/s)、高速(480Mbit/s) 三种模式。
在拓扑结构上,USB系统遵循 “主从结构”,即通讯双方由主机(Host) 和从机(Device) 构成,通讯只能由主机发起,且主机与主机、从机与从机不能互联:
- 主机通常由一个或多个USB主控制器(host controller)和根集线器(root hub)构成。其中,主控制器主要负责数据处理,而根集线器则提供一个连接主控制器和从机之间的接口和通路;
- 从机设备负责响应主机的各类请求;
- 值得一提的是,有一类特殊的USB设备——USB集线器(USB hub),它可以对原有的USB口在数量上进行拓展,获得更多的USB口 (只改变数量,但改变后的总带宽不变,总带宽由主控制器决定)。
传统的USB,设备的身份只能固定是主机或从机。USB OTG(On The Go),一种特殊的USB从机设备,可以在主机、从机之间,实现身份切换。
二、USB的硬件特性
2.1. USB线缆构成
标准的USB连接线,为四芯电缆(VCC、D+、D-、GND)。
USB OTG的连接线,则会再增加了一条身份识别(ID)线,用来表明自己的通讯身份。主机、从机的切换,就是通过更改该线的状态来实现的。
而所有USB连接线的插头中,VCC、GND的触点都会比其它线芯的触点稍长。这是专门为了支持热插拔而设计的硬件结构 —— 当USB插入时,先接通VCC和GND;USB拔出时,最后断开VCC和GND。该结构保证了插拔过程中,不会出现 “数据线早于电源线接通” 的情况,从而避免芯片闩锁现象。
线缆构成信息如下表:
电缆线芯 | 用途 | 备注 |
---|---|---|
VCC | 5V电源线 | USB电缆必备,一般为红色 |
D+ | USB差分传输,通讯数据线之一 | USB电缆必备,一般为绿色 |
D- | USB差分传输,通讯数据线之一 | USB电缆必备,一般为白色 |
GND | 地 | USB电缆必备,一般为黑色 |
ID | OTG设备是"主机"还是"从机"的识别标准 | USB OTG电缆特有 |
注意:备注中,各线芯对应的颜色记录,源于USB协议,但实际厂商不一定完全遵循标准设计,请以万用表实测为准。
2.2.USB插入检测
USB主机检测是否有从机设备插入,依靠的是D+、D-线芯的电平变化:
- USB集线器每个下游端口的D+、D-上,都分别接了一个15KΩ的下拉电阻到地。当集线器端口悬空(没有设备插入)时,D+、D-将会是低电平的状态;
- USB从机设备的D+或D-上,接了一个1.5KΩ的上拉电阻到3.3V电源(全速、高速设备,上拉电阻接到D+上;低速设备,电阻接到D-上)(速度快的接正,慢的接负),最终使该引脚呈现高电平状态;
- 当设备插入到集线器时,由于15KΩ下拉电阻、1.5KΩ上拉电阻的分压,主机的D+或D-会被拉高。集线器检测到该状态后,就会报告给USB主控制器(或它的上一层集线器),从而完成设备插入的检测;
- USB高速设备先是被识别为全速设备,然后通过集线器和设备两者的确认,再切换到高速模式下。
2.3. USB电气特性
在通讯时,USB信号使用的是NRZI编码格式(当数据为0时,电平翻转;数据为1时,电平不翻转)。
发送数据时,为了防止出现"电平信号长时间不变化"的情况(不利于时钟信号的提取),会先对数据进行位填充(bit stuffing) 处理(当遇到连续6个数据1时,强制插入一个数据0),然后由串行接口引擎(SIE)将数据串行化和NRZI编码后,再发送到差分数据线上。
接收数据时,则执行与发送相反的操作:接收端先从数据线采样并解码,再由串行接口引擎(SIE)将数据并行化(反串行化),然后去除位填充(反位填充),从而恢复出原来的数据。
实际上,上述位填充、串行化、NRZI编码、采样等操作,由现成的USB芯片内部硬件实现,软件开发工程师只需要了解过程即可。
三、USB的软件描述
USB作为一个总线,仅负责提供通讯的渠道。而设备希望实现什么功能、需要主机提供哪种配合,这都依靠描述符来实现。描述符中记录了设备的类型、厂商ID、产品ID(加载驱动程序的依据)、端点情况、版本号等信息。
USB1.1协议定义的标准描述符有:设备描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端点描述符(Endpoint Descriptor)及字符串描述符(String Descriptor)。
3.1 设备描述符
一个USB设备只能有一个设备描述符。
设备描述符主要记录的信息有:设备的USB协议版本号、设备类型、端点0的最大包大小、厂商ID(VID)、产品ID(PID)、设备版本号、厂商字符串索引、产品字符串索引、设备序列号索引、可能的配置数等。
3.2 配置描述符
配置描述符描述设备在不同场合下的不同形态。一个设备可以有多种配置,但某一时刻,只能有一个配置生效。
配置描述符主要记录的信息有:配置所包含的接口数、配置的编号、供电方式、是否支持远程唤醒、电流需求量等。
3.3 端点描述符
端点是USB设备控制的最小单位,而端点描述符负责描述的则是端点的相关信息。
端点描述符主要记录的信息有:端点号及方向、端点的传输类型、最大包长度、查询时间间隔等。
3.4 接口描述符
在设备的某一配置下,会按功能将设备的端点分成一类或几类,这些类,就是接口。接口描述符负责描述接口的相关信息。
对于同一端点,在一个配置下,只能属于一个接口,但在不同配置下,可以属于不同接口。(类比于:人在特定的场合下,只有一种特定的身份。但换了一个场合,身份也可能会跟着改变)
接口描述符主要记录的信息有:接口的编号、接口的端点数、接口所使用的类、子类、协议等。
3.5 字符串描述符
字符串描述符不是必须的。它主要提供一些方便人们阅读的信息。
四、USB的通讯传输
4.1 USB传输数据包
4.1.1 USB传输数据包概述
USB总线上,传输数据是以包为基本单位的。数据包有很多种类型,实际通讯时,收发双方会根据当前传输的用途、阶段,选用合适的数据包。
USB传输数据包为分成几个不同的域,不同类型的包,域的构成也不一样。
在所有类型的USB数据包中,存在一些共同的特点:都以同步域开始,而后紧跟着一个包标识符PID(Packet Identifier),最终以包结束符EOP(End Of Packet) 来结束:
名称 | 作用 | 数据形式 | 备注 |
---|---|---|---|
同步域 | ① 通知串行接口引擎(SIE),数据即将开始传输; ② 同步主机、从机的数据时钟。 | 起始于一串数据0,在NRZI编码下,表现为一连串的电平变化。 | 无 |
包标识符 | 标识数据包的类型。 | 共有8位:前4位为有效数据位;后四位为前4位的取反,用于校验。 | ① 令牌包; ② 数据包; ③ 握手包; ④ 特殊包 |
包结束符 | 表示数据包结束的标志。 | 由一定数据宽度的单端信号0(SE0:D+、D-同时为低电平)表示 | 无 |
4.1.2 令牌类数据包
令牌类数据包用来启动一次USB传输。
因为USB是主从结构的拓扑结构(所有数据传输都是由主机发起的,设备只能被动地接听数据),所以需要主机使用令牌包,来通知哪个设备进行响应、如何响应。
令牌类数据包有以下四种:
名称 | 作用 | 备注 |
---|---|---|
输出(OUT) | 通知设备,将要输出一个数据包 | 无 |
输入(IN) | 通知设备,返回一个数据包 | 无 |
建立(SETUP) | 通知设备,将要输出一个数据包 | ① 只用于控制传输; ② SETUP包后,只发送DATA0数据包,且只能发到设备的控制端点,设备必须接收 |
帧起始(SOF Start Of Frame) | 每帧(或微帧)开始时,以广播形式发送,所有全速、高速设备都可以接收到 | 无 |
令牌类数据包的构成如下:
-
输出(OUT)、输入(IN)、建立(SETUP)令牌包结构:
名称 同步域 包标识符 地址 端点号 CRC5校验 EOP 位数 \ 8 7 4 5 \ 注意:CRC校验只校验包标识符(PID)之后的地址域和端点域,不包括包标识符(PID)。
-
帧起始(SOF)令牌包结构:
名称 同步域 包标识符 帧号 CRC5校验 EOP 位数 \ 8 11 5 \ 注意:CRC校验只校验包标识符(PID)之后的地址域和端点域,不包括包标识符(PID)。
4.1.3 数据类数据包
数据类数据包是用来传输数据的。
数据类数据包结构:
名称 | 同步域 | 包标识符 | 字节0 | 字节1 | …… | 字节N | CRC16校验 | EOP |
---|---|---|---|---|---|---|---|---|
位数 | \ | 8 | 8 | 8 | …… | 8 | 16 | \ |
4.1.4 握手类数据包
握手类数据包是用来表示一个传输是否被对方确认。
握手类数据包有以下四种:
名称 | 意义 | 备注 |
---|---|---|
ACK | 正确接收数据,并且有足够的空间来容纳数据 | 正常状态 |
NAK | 没有数据需要返回,或正确接收数据,但没有足够空间来容纳 | 正常状态 |
STALL | 设备无法执行请求,或端点已经被挂起 | 错误状态 |
NYET | 正确接收数据,但没有能力接收下一次传输 | 正常状态,只在USB2.0的高速设备中使用 |
握手类数据包结构:
名称 | 同步域 | 包标识符 | EOP |
---|---|---|---|
位数 | \ | 8 | \ |
4.1.5 特殊类数据包
特殊包是一些在特殊场合使用的包。
特殊包有以下四种:
名称 | 意义 | 备注 |
---|---|---|
PRE | 令牌包,是通知集线器打开其低速端口的一种前导包 | 只用于全速模式中 |
ERR | 握手包,在高速分裂事务中表示错误使用 | USB2.0协议新增 |
PING | 令牌包,结构与OUT令牌包一致,但后面并不跟随发送数据,用于试探设备是否有空间接收数据 | USB2.0协议新增,只用于高速环境的批量传输和控制传输的输出事务中 |
SPLIT | 令牌包,用于高速分裂事务中,通知集线器将高速数据包转化为全速或者低速数据包,发送给其下面的端口 | USB2.0协议新增 |
4.2 USB传输类型
4.2.1 USB事务
虽然USB定义了数据在总线上传输的基本单位是包,但不能随意地使用包来传输数据,必须按照一定的关系,把这些把不同的包组织成事务,才能进行传输。
事务通常由两个或三个包组成:令牌包、数据包、握手包:
- 令牌包用来启动一个事务,总是由主机发送;
- 数据包传送数据,可以从主机到设备,也可以从设备到主机,方向由令牌包来指定;
- 握手包的发送者通常为数据接收者,当数据接收正确后,发送握手包,设备也可以使用NAK握手包来表示数据还未准备好。
USB协议规定了4种传输类型:批量传输、等时传输(同步传输)、中断传输和控制传输。其中,批量传输、等时传输、中断传输,每传输一次数据都是一个事务;控制传输包括三个过程,建立过程和状态过程分别是一个事务,数据过程则可能包含多个事务。
4.2.2 批量传输
批量传输通常用于数据量大、对数据的实时性要求不高的场合,例如USB打印机、扫描仪、大容量存储设备等。批量传输没有规定数据包中数据的意义和结构,具体的数据结构要由设备自己定义。
批量传输使用批量事务(bulk transaction)传输数据。一次批量事务有三个阶段:令牌包阶段、数据包阶段和握手包阶段,每个阶段都是一个独立的数据包。批量传输分为批量读和批量写,批量读使用批量输入事务,批量写使用批量输出事务。(读\输入、写\输出是以主机为参考的)
4.2.3 中断传输
中断传输是一种保证查询频率的传输。中断端点在端点描述符中,报告传输的查询间隔。主机会保证这个时间间隔的范围内,安排一次传输。
中断传输通常用于数据量不大,但对时间要求较严格的设备中,例如人机接口设备(HID)中的鼠标、键盘、轨迹球等。中断传输也可以用来不断地检测某个状态,但条件满足后,再使用批量传输来传送大量的数据。
除了对端点的查询策略不一样以外,在传输结构上,中断传输和批量传输基本是一样的,但中断传输没有PING和NYET两种包,且中断传输使用的是中断事务(interrupt transaction)。
4.2.4 等时传输(同步传输)
等时传输的侧重点在于实时性,而不需保证数据的100%正确,当数据错误时,不进行重传操作。因此等时传输没有应答包。数据是否正确,可以由数据包的CRC校验来确定。出错后的数据如何处理,则由主机或设备的应用软件来决定。
等时传输用在数据量大、对实时性要求高的场合,例如音频设备、视频设备等。
等时传输使用等时事务(isochronous transaction) 来传输数据。
4.2.5 控制传输
控制传输主要用于设备枚举过程中,各种描述符的获取、设置地址、设置配置等场合,需要切实保证传输过程中的数据完整性。控制传输由三个连续的过程构成:建立过程、数据过程(可选)、状态过程:
- 建立过程使用一个建立事务。建立事务是一个输出数据的过程,与输出事务相比,区别如下:
① 令牌包使用SETUP令牌包;
② 令牌包后只能跟随DATA0数据包;
③ 数据包后,设备只能回复ACK(正常时)或不回复(错误时),而不能使用NAK和STALL。 - 数据过程是一个可选的过程,控制传输中可以没有该过程。如果有数据过程,则过程中包含一个或多个数据事务:
① 所有数据事务的传输方向必须相同,若中途发生了改变,就会被认为进入了状态过程;
② 控制传输数据过程,使用的数据事务,与批量传输中的批量事务是一样的;
③ 数据过程的第一个数据包必须是DATA1包,之后每正确传输一次,就在DATA0、DATA1之间,轮流改变数据包的类型,再传输。 - 状态过程的传输方向与数据过程相反,且只使用DATA1包。
4.3 USB端点类型
端点0,每个USB设备都必须具备的默认控制端点,它一上电就存在且可用。设备的各种描述符以及主机发送的一些命令,都是通过端点0传输的。
其它端点(非0端点),可选,需要根据具体的设备来决定,只有Set Config之后才能使用。通常把工作在XX模式下的端点,称为XX端点,如控制端点、批量端点等。
4.4 USB端点支持的最大传输包长
每个端点描述符都规定了端点所支持的最大数据包长,主机每次发送数据包,都不能超过端点的最大包长。
传输类型 | 低速模式最大包长 | 全速模式最大包长 | 高速模式最大包长 |
---|---|---|---|
批量传输 | (不支持) | 8\16\32\64字节 | 512字节 |
中断传输 | 8字节 | 64字节 | 1024字节 |
等时传输 | (不支持) | 1023字节 | 1024字节 |
控制传输 | 8字节 | 64字节 | 8\16\32\64字节 |