《圈圈教你学 USB》第 1 章学习笔记
1 USB 是什么?
- 1)USB(Universal Serial Bus,通用串行总线)
2 USB 的特点
- 1)USB 协议版本与速度:
- 2)开发 USB 常用网站: https://www.usb.org
3 USB 的拓扑结构
USB 是主从结构,主机为 Host,从机为 Device。
-
1)主从结构:主机 Host,从机 Device
-
2)通常 PC 上有一个或多个 USB 主控制器(host controller,如下图的 USB Composite Device);每个主控制器下有一个根集线器(root hub,如下图的 USB 根集线器);而根集线器通常有一个或多个 USB 口:
当我将一个 USB 一拖四扩展坞插入电脑时,多出了一个 “通用 USB” 集线器(集线器只能扩展接口,不能扩展带宽),如下图所示:
- 3)USB 数据交换只能在主机与设备之间。USB OTG 中一个设备可在从机与主机间切换。
关于 USB 集线器的层数,USB1.1 中最多 4 层,USB2.0 中最多 6 层。
4 电气特性
-
1)连接线:
- 4 线:电源 VBUS、GND,D- 和 D+ 差分数据线
- 5 线:MINI USB 中添加身份识别(ID)线
- 9 线:USB 3.0 时代,全新设计的 USB Type-A、Type-B 和Micro-B,但没有普及
- 24 线:Type C
-
2)NRZI 编码与位填充:数据为 0 时翻转电平,为 1 时不翻转;连续 6 个 1 时填充数据 0。
5 USB 的线缆、插头及插座
- 1)Type A 型、Type B 型、MINI USB、Type C 型
6 插入检测机制
- 1)集线器的 D+ 和 D- 分别接一个 15k 下拉电阻到地;USB 设备端则在 D+ 或 D- 上接一个 1.5k 上拉电阻到 3.3V:
- (1)低速设备上拉电阻接 D-;
- (2)全速与高速设备则接 D+。
设备插入到集线器时,数据线的分压大概在 15 / (15 * 1.5) * 3.3V = 3V,对集线器的接收端来说是一个高电平。
根据被拉高的数据线是 D+ 或 D- 来判断设备的速度类型。
高速设备会先识别为全速设备,然后两者再通信确认后切换到高速模式。(高速模式下为电流传输,要断开 D+ 的上拉电阻)
如果 USB 外设或芯片没有内部 1.5k 上拉电阻,则可以通过以下电路实现:
实验:在 USB 的 D+ 或 D- 上接一个 10k 上拉电阻,则 Windows 会提示发现新硬件,但无法找到驱动。
7 描述符
USB 是一条协议总线,而 USB 描述符则会记录设备的类型、厂商和产品 ID(加载驱动)、端点情况、版本号等内容。
描述符 | 说明 |
---|---|
设备描述符 | 设备唯一,向主机说明设备类型、端点 0 最大包长、设备版本、配置数量等 |
配置描述符 | 至少一个,主机只能选择一个,向主机说明配置包含的接口数、配置编号、供电方式、所需电流 等 |
接口描述符 | 至少一个,向主机说明接口编号、端点数(不包括端点0)、接口所使用的类、子类、协议等。通过接口来实现功能,固所需端点数不确定 |
端点描述符 | 可为0个,说明端点的端点号及方向、端点传输类型、最大包长度、查寻时间间隔 等 |
字符串描述符 | 提供一些方便人们阅读的信息,非必需。 |
主机首先获取 “设备描述符”,然后获取 “标准配置描述符”,根据其内部的配置描述符集合长度值,一次性将配置描述符、接口描述符、类特殊描述符(如果有)、端点描述符读回;字符串描述符是单独获取的。
端点:实现 USB 设备功能的物理缓冲区实体,USB 主机和设备通过端点进行数据交互。
8 枚举过程
枚举,主机从设备读取各种描述符信息,并根据这些信息来加载合适的驱动程序,从而知道设备类型、如何通信等。
控制传输:是 USB 传输模式的一种,它保证数据正确性,是设备枚举过程中采用的传输方式
-
1)控制传输的过程:
- (1)建立过程:由 USB 主机发起;由
SETUP 令牌包 + DATA0 数据包
构成; 建立过程中指定数据长度为 0,则没有数据过程。 - (2)数据过程(可选):控制读则输入数据;控制写则输出数据;
- (3)状态过程:与数据过程传输方向相反;用来确认数据是否正确传输完成。
- (1)建立过程:由 USB 主机发起;由
-
2)枚举的详细过程:
-
(1)获取描述符:
-
- 主机检测到设备插入则对设备复位,复位后设备地址为 0。主机向地址 0 的设备的端点 0 发送获取设备描述符的标准请求(仅一次请求)(控制传输的建立过程)
-
- 设备收到请求后,将设备描述符返回主机(控制传输的数据过程)
-
- 主机接收到设备描述符,并确认无误后,返回 0 长度的确认数据包(控制传输的状态过程)
-
-
(2)设置地址。
-
- 主机向地址 0 的设备的端点 0 发出设置地址请求(控制传输的建立过程,该过程数据包中包含新的设备地址)
-
- USB 设备进入状态过程(因为该控制传输无数据过程),并等待主机请求状态返回(设备无法主动向主机返回)
-
- 设备收到主机输入的令牌包后,返回 0 长度的状态数据包。
-
- 主机发送应答包 ACK 给设备,设备收到后启用新的设备地址
-
-
(3)主机再次获取设备描述符:使用新的设备地址;获取全部 18 字节(可多次请求);
-
(4)主机获取配置描述符:共 9 字节;根据所描述的配置集体总长度获取配置集合;
-
(5)获取字符串描述符(可选):HID 设备还会获取报告描述符等;单独获取;
-
9 USB 的包结构与传输过程
9.1 USB的包结构及包的分类
-
1)USB 以包为基本单位进行数据传输,一个包被分成不同的域,域使用 LSB 方式。
-
2)包虽然由不同的域组成,但共同点为:同步域 + 包标识符(PID,Packet Identifier) + [域] + 包结束符 EOP(End Of Packet)
-
(1)同步域:
-
- 用来通知 USB 串行接口引擎准备好开始传输;还可以用来同步时钟(其由多个 0 组成,而 0 需要进行电平翻转)
-
- 发送端:低速、全速设备同步域为 0000_0001;高速设备使用 31 个 0,后面跟 1 个 1
NRZI 编码后的低速或全速 USB 数据包(如下图)。当最后数据未翻转时,认为接收到包标识符 PID。
-
-
(2)包标识符:共 8 位,USB 协议只使用其中 4 位(PID0~PID3),而高 4 位是低 4 位的取反。
- 0bxxxx_xx00:特殊包,special packet
- 0bxxxx_xx01:令牌包,token packet
- 0bxxxx_xx10:握手包,handshake packet
- 0bxxxx_xx11:数据包,data packet
每个包又可以分为几种类型:
- (3)包结束符 EOP:
-
- 全速或低速设备为 SE0(D+、D- 同时为低)
-
- 高速设备为故意的位填充错误来表示。(即 CRC 正确,但位填充错误)
-
-
9.2 令牌包
令牌包用来启动一次 USB 传输;
- 1)令牌包有 4 种:输出(OUT)、输入(IN)、建立(SETUP)、帧起始(SOF,Start of Frame)
OUT、IN、SETUP 令牌包结构图:
SOF 令牌包结构图:
建立令牌包与输出令牌包的区别:
作用相同,都是通知设备要输出一个数据包;
不同的是,SETUP 包后只使用 DATA0 数据包,且只能发送到设备控制端点,并且设备必须接收,而 OUT 包没有这些限制。
9.3 数据包
数据包用来传输数据。所有数据包有相同的结构:
设计不同类型的数据包,是用来在握手包出错时纠错。
9.4 握手包
握手包用来表示一个传输是否被对方确认。结构只有 同步域、PID、EOP。
- 握手包有 4 种:ACK、NAK、STALL、NYET
- ACK:数据正确接收。主机只能使用 ACK 握手包。设备则可以使用所有。
- NAK:没有数据需要返回,或数据正确接收但没有跑空间存储。主机接收到 NAK 时,便知设备未准备好。
- STALL:设备无法执行该请求,或端点已经挂起。表示错误状态,需主机干预来解除该状态
- NYET:表示本次数据成功接收,但没有足够空间来接收下次数据,只有 USB2.0 高速设备输出事务中使用。主机在下次输出数据时,将先使用 PING 令牌包来试探。
9.5 特殊包
特殊包指在特殊场合使用的包。
特殊包有 4 种,PRE、ERR、SPLIT、PING。其中除 ERR 是握手包外,其余均是令牌包且是 USB2.0新增。
- PRE:与握手包结构一致。全速模式中,需要传输低速事务时,发送 PRE 包通知集线器打开其连接的低速设备端口(因为平时为避免低速设备误动作,低速设备端口是关闭的)
- PING:与 OUT 令牌包结构一致。但其不发送数据,而是等待设备返回 ACK 或 NAK,以判断设备是否能够传送数据。
- SPLIT:高速事务分裂令牌包。
- ERR:高速事务中表示错误使用。
9.6 如何处理数据包
一般 USB 接口芯片会完成如 CRC 校验、位填充、PID 识别、数据包切换、握手等协议。
USB 接口芯片正确接收数据时,如果有空间存储,则保存数据并返回 ACK 到主机,同时设置标志表示正确接收到数据;
如果没有空间存储数据,则自动返回 NAK。
USB 接口芯片收到输入请求时,如果有数据需要发送,则发送数据,并等待接收 ACK,收到 ACK 设置成功发送标志;
如果无数据发送,则自动返回 NAK。
通常要做的事是 根据 USB 接口芯片提供的标志,准备要发送的数据到端点,或者从端点读取接收到的数据即可。
而所谓数据,是指数据包中的数据,至于同步域、包标识、地址、端点、CRC 等由接口芯片处理。
10 USB 四种传输类型
USB 总线上传输的基本单位是包,但需要将包组织成事务(Transaction)才能传输数据。
USB 协议规定 4 种传输类型:批量传输、等时(也作同步)传输、中断传输、控制传输。
控制传输包括 3 个过程,建立过程、状态过程分别是一个事务,数据过程则可能包含多个事务;
其余 3 种传输方式则每传输一次是一个事务。
10.1 USB 事务
事务通常由 2 个或 3 个包组成:令牌包、数据包、握手包
- 令牌包:启动一个事务,由主机发送
- 数据包:传送数据,方向由令牌包指定
- 握手包:数据接收方接收正确后,发送握手包;设备也可使用 NAK 握手包来表示数据未准备好。
10.2 批量传输
批量传输使得批量事务传输数据。
一次批量事务有 3 个阶段:令牌包阶段、数据包阶段、握手包阶段(下图中两行虚线隔开了三个阶段)。
应用场景:数据量大、对数据的实时性要求不高的场合,如大容量存储设备(Mass Storage Device,MSD)、USB 打印机、扫描仪等
批量传输(Bulk)分为批量输出事务(主机写)和批量输入事务(主机读):
批量输入事务的数据包如下:
批量输出事务的数据包如下:
10.3 中断传输
中断传输是一种保证查询频率的传输。中断端点在端点描述符中报告查询间隔,主机保证在间隔内进行一次轮值。(此中断非单片机中断,而是主机 Host 保证在某个时间间隔内进行一次传输)
中断传输也可以不断地检测状态,然后使用批量传输来传送大量数据。
应用场景:适合数据量小,但时间要求严格的设备,如从机接口设备(Human Interface Device,HID)中的鼠标、键盘等设备。
中断传输事务流程如下:
10.4 等时(同步)传输
等时传输使用等时事务(Isochronous Transaction)来传输数据,不保证数据 100% 正确,但支持数据量大且实时性高。
应用场景:数据量大,实时性要求高,如音视频设备等。(与批量传输场景区别是等时传输可容忍少量数据错误,但保证不能停顿。)
等时事务流程图:
10.5 控制传输
控制传输分为三个过程:建立过程、数据过程(可选)、状态过程
1)建立过程:使用建立事务。该过程中的令牌包(SETUP)、数据包(DATA0)、握手包(ACK)是固定的。
2)数据过程(可选):批量事务
3)状态过程:批量事务,只使用 DATA1 包。
控制传输要保证数据传输过程中的数据完整性,如枚举过程中各种描述符的获取以及设置地址、设置配置等。控制传输的实例如下:
10.6 端点类型与传输类型的关系
一个具体的端点,只能工作在一种传输模式下。通常把工作在什么模式下的端点,就叫做什么端点,如控制端点、批量端点。
如,端点 0 是每个 USB 设备都必须具备的默认控制端点,它一上电就存在并可用。还记得枚举过程就是通过控制传输来进行的。
10.7 传输类型与端点最大包长
每个端点描述符都规定了端点所支持的最大数据包长。
传输 | 低速最大包长 | 全速最大包长 | 高速最大包长 |
---|---|---|---|
控制传输 | 8字节 | 可选 8、16、32、64 字节 | 64字节 |
等时传输 | 不支持 | 1023 字节 | 1024 字节 |
中断传输 | 8字节 | 64 字节 | 1024 字节 |
批量传输 | 不支持 | 可选 8、16、32、64 字节 | 512 字节 |