头图
《圈圈教你学 USB》第 1 章学习笔记

1 USB 是什么?

  • 1)USB(Universal Serial Bus,通用串行总线)

2 USB 的特点

  • 1)USB 协议版本与速度:
来源:https://www.usbzh.com/article/detail-199.html

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 线:电源 V~BUS~、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)状态过程:与数据过程传输方向相反;用来确认数据是否正确传输完成。
  • 2)枚举的详细过程:

    • (1)获取描述符:

        1. 主机检测到设备插入则对设备复位,复位后设备地址为 0。主机向地址 0 的设备的端点 0 发送获取设备描述符的标准请求(仅一次请求)(控制传输的建立过程)
        1. 设备收到请求后,将设备描述符返回主机(控制传输的数据过程)
        1. 主机接收到设备描述符,并确认无误后,返回 0 长度的确认数据包(控制传输的状态过程)
    • (2)设置地址。

        1. 主机向地址 0 的设备的端点 0 发出设置地址请求(控制传输的建立过程,该过程数据包中包含新的设备地址)
        1. USB 设备进入状态过程(因为该控制传输无数据过程),并等待主机请求状态返回(设备无法主动向主机返回)
        1. 设备收到主机输入的令牌包后,返回 0 长度的状态数据包。
        1. 主机发送应答包 ACK 给设备,设备收到后启用新的设备地址
    • (3)主机再次获取设备描述符:使用新的设备地址;获取全部 18 字节(可多次请求);
    • (4)主机获取配置描述符:共 9 字节;根据所描述的配置集体总长度获取配置集合;
    • (5)获取字符串描述符(可选):HID 设备还会获取报告描述符等;单独获取;
  • 可参考:https://www.usbzh.com/article/detail-110.html

9 USB 的包结构与传输过程

9.1 USB的包结构及包的分类

  • 1)USB 以包为基本单位进行数据传输,一个包被分成不同的域,域使用 LSB 方式。
  • 2)包虽然由不同的域组成,但共同点为:同步域 + 包标识符(PID,Packet Identifier) + [域] + 包结束符 EOP(End Of Packet)

    • (1)同步域:

        1. 用来通知 USB 串行接口引擎准备好开始传输;还可以用来同步时钟(其由多个 0 组成,而 0 需要进行电平翻转)
        1. 发送端:低速、全速设备同步域为 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:
    - 1. 全速或低速设备为 SE0(D+、D- 同时为低)
    - 2. 高速设备为故意的位填充错误来表示。(即 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。

通常要做的事是 <font color=red>根据 USB 接口芯片提供的标志,准备要发送的数据到端点,或者从端点读取接收到的数据即可。</font>
而所谓数据,是指数据包中的数据,至于同步域、包标识、地址、端点、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 字节

送南阳马生序
7 声望3 粉丝

余之业有不精、德有不成,非天质之卑,则心不若他之专耳,岂他人之过哉!