USB2.0协议学习笔记【未完成】

USB编码 与 位/比特填充

NRZI 编码(Non-Return-to-Zero Inverted Code)

非归零反转编码的编码规则

  • '1' 表示电平切换
  • '0' 表示电平不变

示例编码

假设原始数据:1 0 0 1 1

NRZI 编码结果(以第一种方式,'1' = 切换,'0' = 保持):

  • 初始电平:低
  • 1 → 切换 → 高
  • 0 → 保持 → 高
  • 0 → 保持 → 高
  • 1 → 切换 → 低
  • 1 → 切换 → 高

最终电平序列:低 → 高 → 高 → 高 → 低 → 高

位填充(bit-stuffing 也叫比特填充)

假如数据信号是 1000 个逻辑 1,经过 USB 的 NRZI 编码之后,就是很长一段没有变化的电平,在这种情况下,即使接受者的频率和发送者相差千分之一,就会造成把数据采样成 1001 个或者 999 个 1了。 USB 对这个问题的解决办法,就是强制插 0,也就是(位填充)bit-stuffing,如果要传输的数据中有 6个连续的 1,发送前就会在第 6 个 1 后面强制插入一个 0,让发送的信号强制出现翻转,从而强制接受者进行频率调整。 接受者只要删除 6 个连续 1 之后的 0,就可以恢复原始的数据了。这部分见手册 7.1.9。

USB 协议层规范

自上而下可以分为:
USB 事务 (USB Transaction)是完成一轮数据交换的完整过程,可能涉及多个包的交换。
USB 包 (USB Packet)是数据交换的基本单元,它们可以构成一个 USB 事务。
USB 字段 (USB Field)是包内部的具体组成部分,每个包都有不同的字段(例如 PID、数据负载、CRC 等),这些字段共同定义了包的结构。
构成字段的为二进制bit数据01。
cypress AN57294 图22 从时间角度观察 USB 通信

我们从底层向上层介绍(与手册一致):

USB 比特(Byte/Bit Ordering)

USB 字段 (USB Field)

USB 字段构成了 USB 通信中最基本也是最小的单元,后面的包、事务,最根本都是由字段构成,而字段又是由比特构成。字段部分见手册 8.1。

备注:
USB 的比特先行模式是按照 LSB 先行原则。

同步字段(SYNC Field)

在 USB 系统中,主机和设备不是共享一个时钟,这使得接收方没办法准确知道发送方什么时候发送数据,尽管能检测到SOP,但是远远不够,所有这个时候就需要同步字段,使得接收方和发送方收发过程中保持同步,所以任何一个包都要以同步字段开始。同步字段0x01,经过编码以后就是01010100B。
在这里插入图片描述
所有的数据包都以一个同步(SYNC)字段开始,这是一个编码序列,可以产生最大的边缘转移密度(一串01)。它被输入电路用来将输入数据与本地时钟对齐。初始发送器的SYNC定义为全/低速时长度为8位,高速时为32位。接收到的SYNC字段可能更短,如第7章所述。SYNC仅作为一种同步机制,不会出现在下面的包图中(参见7.1.10节)。
SYNC字段的最后两位是一个标记,用于标识

包标识符(PID)字段(PID Field)

PID 由一个四位数据包类型字段和一个四位校验字段组成,占用 8 个bit,如图所示。 PID指示数据包的类型,并通过推断,数据包的格式和应用于数据包的错误检测类型包。 PID的四位校验字段是通过执行分组类型字段的一个补码来生成,从而确保PID的可靠解码,以便正确解释分组的其余部分,如果四个PID校验位不是它们各自的分组标识符位的补码,则存在PID错误。
Figure 8-1. PID Format
既然是 4个比特,说明了 PID 类型可以分为16种,从16种中,又细分成4类:令牌 PID,数据 PID,握手 PID 和特殊 PID。
Table 8-1. PID Types

地址字段(Address Fields)

在 USB 协议中,设备通过 端点(Endpoint) 来进行数据交换,每个端点都有一个唯一的标识。每个设备有多个端点,但每个端点都必须具备唯一的地址。
地址字段也叫功能端点(Function Endpoint),简称 端点:每个 USB 设备都有多个端点,端点用于与主机之间交换数据。每个端点在设备中都有一个唯一的标识符,这就是 端点地址(Endpoint Address),也叫地址字段(Address Fields)。设备使用端点来接收和发送数据。
地址字段又分为设备地址字段(Address Field)端点地址字段(Endpoint Field,ENDP字段)

设备地址字段(Address Field)

设备地址字段占用 7 个bit,用于指定目标设备的地址,除去0 地址,主机可以分配的地址有 127个。
Figure 8-2. ADDR Field

端点地址字段(Endpoint Field,ENDP字段)

端点地址字段占用 4个 bit,用于指定目标设备中的特定端点,总共可以提供 16 个端点。
Figure 8-3. Endpoint Field

帧号字段(Frame Number Field)

帧号字段占用 11 个bit,主机每发出一个帧,帧号都会加1,如图所示。而高速设备中,帧中又包含微帧,1帧=8微帧,微帧则是加0.1。关于帧和微帧的概念,后续补充。
在这里插入图片描述

数据字段(Data Field)

根据传输类型不同,数据字段中的数据长度也是不定的,从 0-1024不等。
Figure 8-4. Data Field Format

CRC字段(Cyclic Redundancy Checks)

循环冗余校验(CRC)用于保护令牌和数据包中的所有非PID字段。PID字段中已经包含4位取反校验位,所以PID不包含在包含CRC的分组的CRC校验中。

  • 在执行比特填充之前,在发送器中的各个字段上生成所有CRC。
  • 类似地,在去除填充位之后,在接收器中对CRC进行解码。

令牌和数据包CRC为所有单比特和双比特错误提供100%的覆盖。 CRC失败被认为表示一个或多个受保护字段已损坏并导致接收器忽略这些字段,并且在大多数情况下,忽略整个数据包。

令牌CRC(Token CRCs)

为令牌提供五位CRC字段,并覆盖IN,SETUP和OUT令牌的ADDR和ENDP字段或SOF(Start-of-Frame Packets) 令牌的时间戳字段。PING和SPLIT特殊令牌还包括一个五位CRC字段。

生成多项式为: $G(X)= X^5 + X^2 + 1$,表示该多项式的二进制位模式是00101B。 如果接收到所有令牌位而没有错误,则接收器处的五位校验和将为01100B。

技术实现背景:
CRC计算时,最高位的1(X⁵项)是隐式的,用于触发异或操作。实际硬件(如移位寄存器)只需配置低5位(00101B),而无需显式包含最高位。

手册遵循了USB协议中省略最高位1的惯例,将生成多项式表示为 00101B,而非完整的100101B。这种约定简化了硬件实现,同时不影响CRC校验的功能。

例如,USB令牌的CRC5计算中,生成多项式被简化为低5位的异或模式,因此手册采用 00101B 而非100101B。
在这里插入图片描述

数据CRC(Data CRCs)

数据CRC是应用于数据分组的数据字段的16位多项式。

生成多项式是:$G(X)= X^{16} + X^{15} + X^2 + 1$ 表示该多项式的二进制位模式是1000000000000101B。 如果没有错误地接收到所有数据和CRC位,则16位校验和将为1000000000001101B。

USB 包 (USB Packets)

包由字段组成,根据 PID 类型,包分为四大类:令牌包、数据包、握手包、特殊包。此节内容见官方 8.4.1。
在这里插入图片描述
算上 SOP,则如图,组成一个完整的包
完整的包
包内容 Packet Content 如下:
Packet Content

令牌包(Token Packets)

令牌包类型
令牌包分为:SETUP、IN、OUT、SOF。
其中 SETUP、IN、OUT的字段组成一样,包内容Packet Content字段如图所示:
Figure 8-5. Token Format

  • PID 字段:定义了数据传输方向为USB主机到USB设备。
  • ADDR 字段:指明了USB设备地址。
  • ENDP 字段:指明了接收数据的端点号。
  • CRC 字段:用于ADDR字段和ENDP字段进行循环冗余校验。

SOF(Start-of-Frame Packets) 包内容Packet Content字段如图所示:
Figure 8-13. SOF Packet

  • PID 字段:定义了数据传输方向为USB主机到USB设备。
  • 帧号 字段:指明了USB传输的帧号,其11位。
  • CRC 字段:用于ADDR字段和ENDP字段进行循环冗余校验。
    图 25. USB 令牌数据包类型

数据包(Data Packet)

数据包PID
Figure 8-15. Data Packet Format

  • PID 字段:用于指明不同的数据包类型。支持 4 种数据包,分别为: DATAO 、 DATA1 、DATA2 和MDATA。
  • DATA字段:其中包含了传输的数据。其数据的大小根据数据传输类吧和川户需要而定。根据 USB 协议的规定,对于低速 USB 数据传输, 最大长度为8字节对于全速SB 数据传输,其最大长度为 1023 字节;对于高速 USB 数据传输,数据最大长度为 1024 。
  • CRC 字段:这里使用 16 位的循环冗余校验来对数据字段进行保护。
    在这里插入图片描述
    在每一个数据数据包成功传输后,主机和设备将对数据切换进行相应的更新。数据切换的优点在于它可作为附加的错误检测方法。如果接收到的数据包 ID 同预期的不一样,则设备可判断传输中发生了错误,并可能进行适当的处理。使用数据切换的示例是 ACK 在发送后,仍未能收到时。在该示例中,发送方将数据从‘1’更新为‘0’,但接收方则没有进行相应的更新,而仍然保持为‘1’。因此,在下一个数据步骤中,主机和设备将不再同步,这样会引起错误。图 28显示了一个 USB 传输中的数据切换示例。在该图以及本应用笔记的所有其他图中,白色框表示来自主机的传输,黑色框则表示来自设备的传输。
    图 28. 数据切换示例
这些是 数据包(Data Packet) 中 PID 的不同类型。每种 PID 都用于标识不同类型的数据传输包。它们分别代表:

DATA0(0011B):数据包类型 0,用于表示发送或接收的数据块。用于 普通的数据传输,例如设备与主机之间的同步数据传输。它在数据传输过程中可能会出现奇偶校验变化。

DATA1(1011B):数据包类型 1,用于表示发送或接收的数据块。与 DATA0 类型类似,区别在于传输过程中的序列号(DATA0 与 DATA1 交替使用)。通常用于 双向传输。

DATA2(0111B):数据包类型 2,通常用于 高带宽异步传输(如 Isochronous Transfer)中。它也可以用于一些更特殊的应用,如 支持流式传输的设备(例如音频或视频流)。

MDATA(1111B):MDATA 是多数据包传输模式,用于表示较大数据块的连续传输。通常在 高带宽、低延迟要求 的传输中使用。例如,支持大容量数据流的设备(如摄像头或音响)可能会使用这种类型。

这些 PID 类型帮助 接收端 确定数据包的有效性和排序。通常,DATA0 和 DATA1 用于普通的数据包传输,而 DATA2 和 MDATA 更多用于 高带宽 或 实时(如视频、音频流)传输。

握手包(Handshake Packets)

握手包由8位的PID构成,用于数据传输的末位报告本次数据传输的状成。握手包之后使是整个事务处理的结束信号EOP.
握手包PID
Figure 8-16. Handshake Packet图 29. 握手数据包的指示

握手包类型 PID 描述
ACK 0xD2 表示成功接收数据包
NAK 0xA2 表示数据包接收失败或设备无法接收数据
STALL 0xE2 表示发生严重错误或请求无法处理,事务终止
NYET 0xC2 表示设备暂时无法接收数据,但将来会准备好(仅用于高速传输)

特殊包

特殊包PID
图 30. 特殊数据包的指示

特殊包类型 PID 用途
SOF (Start of Frame) 0xA5 用于标记每一帧的开始,提供时间同步信号
PING 0xF2 请求接收方是否准备好接收数据,通常用于高速传输
SPLIT 0xF1 用于拆分大数据包,分批传输高带宽数据,适用于流媒体或异步传输
PREVIOUS 0xF3 确认拆分数据包的接收状态,继续拆分事务
MISC 其他 用于处理一些特殊场景,如错误报告、设备状态等
SOF(Start of Frame)包格式
| Sync (8/32 bits) | PID (8 bits) | Frame Number (11 bits) | CRC (16 bits) | EOP (2 bits) |
PING 包格式
| Sync (8/32 bits) | PID (8 bits) | Token Address (8 bits) | CRC (16 bits) | EOP (2 bits) |
SPLIT 包格式
| Sync (8/32 bits) | PID (8 bits) | Token Address (8 bits) | Frame Number (11 bits) | CRC (16 bits) | EOP (2 bits) |
PREVIOUS(Token)包格式
| Sync (8/32 bits) | PID (8 bits) | Token Address (8 bits) | CRC (16 bits) | EOP (2 bits) |

USB 事务(多个包组成)

USB 常用事务共有三种:SETUP、IN、OUT,除了控制传输使用三个事务,其他传输都使用两个事务。特殊事务则是不携带数据的事务,如SOF事务、专用包(Special Packet)事务。
一个 USB 事务 是一个完成特定操作的数据交换单元,通常由以下三个阶段组成

  1. 令牌包(Token Packet):如 IN、OUT、SETUP、SOF
  2. 数据包(Data Packet):DATA0、DATA1 等
  3. 握手包(Handshake Packet):如 ACK、NAK、STALL

SETUP / 控制数据传输

下图白框显示的是从主机发送的数据传输,黑框显示的是从设备发送的数据传输。

  • 控制传输包含三个阶段:
    1. SETUP STAGE(设置阶段)
    2. DATA STAGE(数据阶段)
    3. STATUS STAGE (状态阶段)
      图 35. 控制数据传输框图
  • SETUP事务包含3个包:SETUP令牌包、DATA0数据包、ACK握手包。
    在这里插入图片描述

IN / 读取 / 上行数据传输

下图白框显示的是从主机发送的数据传输,黑框显示的是从设备发送的数据传输。

  • IN事务包含3个包:OUT令牌包、DATA0/DATA1数据包、ACK握手包。
    图 31. IN/读取/上行框图
  • 下图中设备发送了 NAK 作为响应,从而指出主机发送请求时,它还没准备好发送数据。主机持续发出请求,如果设备已经准备好,它将发送一个数据包来响应主机。然后,主机将发送一个 ACK 握手数据包来确认接收到设备发送的数据。
    图 32. IN 数据传输示例

OUT / 写入 / 下行数据传输

下图白框显示的是从主机发送的数据传输,黑框显示的是从设备发送的数据传输。
图 33. OUT/写入/下行框图

  • OUT事务包含3个包:OUT令牌包、DATA0/DATA1数据包、ACK握手包。
  • 下图中主机将发送 OUT 令牌数据包和 DATA0 数据包,但会接收到设备所发送的 NAK 信号。然后,主机会重新尝试发送数据。请注意,由于握手数据包被拒绝,因此不会改变数据切换位的状态。如果主机再次尝试发送数据,设备将发送一个 ACK 信号来响应主机,从而指出 OUT 数据传输已经成功。
    在这里插入图片描述

USB 数据传输类型(USB Transaction)

类型 英文名 特点说明
控制传输 Control 配置/控制设备,如枚举过程
批量传输 Bulk 大量数据,可靠性高但无实时性,如U盘
中断传输 Interrupt 周期性、小数据量,如鼠标、键盘
同步传输 Isochronous 实时性高但不重传,如音频、视频流

控制传输(Control Transactions)

USB协议引用控制传输有两方面的原因,一方面,在USB系统中,设备在正常工作之前必须先进行配置,USB主机必须为设备分配总线上唯一的设备地址,并完成读取设备的各种描述符,根据描述符的需求为设备的端点配置管道,分配带宽等工作。另一方面,在设备的工作过程中,主机希望能及时地获取设备的当状态,或者设备出现问题时希望主机能及时做出补救措施,或者主机根据某些需求改变设备的当前配置等工作。这两方面的目的对所有的USB设备都要求适用,为了达到此目的,从而引入了控制传输。所有设备都要求有支持控制传输的端点,一般端点号为0的为控制端点,USB协议将其定义设备的默认端点。
控制传输有以下特点:

  • 控制传输由以下几个阶段组成:
    (1)建立阶段(Setup Stage),把请求信息从主机传到它的应用设备。
    (2)可选的数据阶段(Data Stage),零个或多个数据传送的事务处理,按照命令中指明的方向(IN/OUT)传送数据。
    (3)状态阶段(Status Stage),状态信息回传(IN/OUT)。
  • 用于控制传输的设备的端点是双向的,即可以接收数据包又可以发送数据包,相应的控制传输的管道也是双向的。
  • 所有的设备必须有至少一个控制端点,且端点号为0。即每个 USB 设备都必须至少实现一个编号为 0 的控制端点(Control Endpoint)。
为什么必须有端点 0?
在 USB 枚举(设备插入时识别)过程中,主机会通过控制传输和端点 0:
	给设备分配地址
	读取设备描述符
	确定设备类型、支持的功能
如果没有端点 0,主机将无法与设备正常通信、识别和初始化。
  • 是可靠的数据传输,支持错误检测和数据重传,并尽可能满足主机和设备的同步,因为一次控制传输需要三个或两个阶段。
  • 控制机制提供访问设备描述符和命令操作的机制。USB协议为设备定义了标准的、设备类的或由设备生产商厂提供的命令(或叫请求),这些命令可操作设备的状态。同时协议又定义了一套描述符,用于存放USB设备的各种信息,用于对设备进行配置,这些都是通过控制传输完成。
  • 系统没有为控制传输指定访问总线的频率和带宽,一般由USB协议软件(即主机操作系统的USB控制程序)从全局优化角度来决定。

下图描述的是 USB 控制传输(Control Transfer) 的三个阶段:Setup Stage(设置阶段)、Data Stage(数据阶段,可选) 和 Status Stage(状态阶段)。(这里的阶段也可大概理解为:设置阶段即为Setup事务,数据阶段包含很多个IN/OUT事务,状态阶段为IN/OUT事务)

控制传输的三种传输模式:1. 控制写传输。2. 控制读传输。3. 无数据控制传输

在这里插入图片描述
5. Setup Stage(设置阶段)
- 包含3个包:SETUP令牌包、DATA0数据包、ACK握手包。
- Setup(0)表示Setup事务,括号中的0表示Toggle位是0,即Data0,又由于SETUP是最先发送的,所以Toggle 位永远是 0(固定不变)。
- 用途:初始化一个控制传输事务,主机向设备发出配置/控制命令。
- 数据方向:主机 → 设备。

Toggle 位 是 USB 数据包 中 数据包标识符(PID) 的一部分,特别是在 DATA0 和 DATA1 数据包中,用来标识数据包的顺序。它本身并不是一个独立的字段,而是与 PID(Packet Identifier) 一起构成的数据包的标识部分。
Toggle 位主要用于区分连续的数据包,防止数据包重复或丢失。它是 DATA0 和 DATA1 数据包的标志之一。
在 控制传输 和 批量传输 中,Toggle 位 确保数据包的顺序性,接收方根据 Toggle 位(0 或 1)判断数据包的顺序。
如何工作:
	发送方:每次发送数据包时,会根据上次发送的数据包类型决定当前数据包的 Toggle 位。如果上次发送的是 DATA0,则当前发送 DATA1,反之亦然。
	接收方:接收方检查数据包的 PID,以确定是否接收到预期的数据包。如果接收方已经接收过 DATA0,它将期待接收到 DATA1。如果接收到错误的 Toggle 位(例如,两个连续的 DATA0),接收方会丢弃重复的包,要求发送方重新发送正确的数据包。
	在 USB 传输中,第一次发送数据包时,通常发送 DATA0,也就是 Toggle 位 = 0 的数据包。
  1. Data Stage(数据阶段,可选)

    • 包含3个包:IN/OUT令牌包、DATA0/DATA1数据包、ACK握手包。
    • IN(0) 、IN(1)、OUT(0)、OUT(1),括号内的数字(0 或 1) 是 Data Toggle 位(数据切换位),用于防止重复传输或丢包时重复接收,主机会在多包传输(数据超过最大数据包包长时)中交替使用 DATA0 和 DATA1。
    • 用途:控制写传输中的数据阶段,或者状态阶段。
  2. Status Stage(状态阶段)

  • 包含3个包:IN/OUT令牌包、DATA0/DATA1数据包、ACK握手包。
    表示 IN 事务中的数据包,设备将数据返回给主机。
    Toggle 位 0/1 同样用于数据完整性控制(DATA0 / DATA1)。
    出现在控制读传输的数据阶段或状态阶段。

控制传输的其他规定:
在这里插入图片描述

批量传输(Bulk Transactions)

批量传输类型是为了支持在某些不确定的时间内进行大量的数据通信,如打印机、扫描仪、硬盘、光盘等设备的数据传输都有这种特点。当一帧内的总线时间(带宽)有空余时,USB主机就会将剩余的时间(带宽)分配给等待使用总线的批量传输的USB设备,也就是说,批量传输可以利用任何可获得的总线带宽来进行数据传输。批量传输有以下特点:

  • 可以动态地获得总线带宽。
  • 是一种可靠的数据传输方式,如果传送失败,可进行重发e有确认的数据传输,但不保证传输的带宽和延迟。
  • 只有当获得空闲的带宽时,批量传输才会发生。如果USB总线有较多的空闲带宽,则批量传输会较频繁地进行,如果空闲带宽较少,可能有很长时间没有批量传输发生。

批量传输的两种传输模式

  1. 大容量读传输
  2. 大容量写传输
    批量传输
    批量传输的其他规定:
    在这里插入图片描述

中断传输(Interrupt Transactions)

中断传输为这样一类设备设计的,它们只发送或接收少量的数据,而且并不经常进行数据传输,但它们有一个确定的传输周期,每隔一定的周期要求传输一次(并不是要求必须按固定周期要发送一次数据)。使用这种传输方式的设备有键盘、鼠标、游戏杆等。所有的USB设备在正常工作之前,系统都要对它们进行配置,当配置成功后设备才能正常的工作。因为中断传输是一种周期性的传输方式,系统在对进行中断传输的设备进行配置时,只要当前总线上用于周期性传输的空闲带宽能够容纳此设备,设备就可以工作。中断传输有如下特点:

  • 中断传输管道的最大服务周期(单位:毫秒)必须得到保证是一种可靠的数据传输方式。
  • 由于错误而引起的数据重传将在下一服务周期进行。
  • 数据的结尾也是通过与包的最大传输字节数比较来确定。
  • 设备中用于中断传输的端点可用来为某些实时传输传达其速率的反馈信息,例如音频设备。当使用这种模式时,在每个数据包被发送到主机之后,不管握手包是否存在或类型如何,端点的DATAO/DATA1同步切换都应该改变,不过只有中断传输的输入端点支持种能力。

中断传输的两种传输模式

  1. 中断读传输
  2. 中断写传输
    在这里插入图片描述
    中断传输的其他规定:
    在这里插入图片描述

同步传输(Isochronous Transactions)

同步传输是为支持某些对时间要求很高、数据量很大应用要求而提出的,使用这种传输类型的设备有麦克风、调制解调器。音频设备等。为了完成实时传输,总线必须事先提供足够的带宽。实进传输有如下特点:

  • 实时传输有数据有固定的时间延迟,但有固定的带宽保证。
  • 是一种不可靠的数据传输,充许有一定的误码率。
  • 只要数据供得上,就能保证管道上的恒定数据传送速率。
  • 当被用来支持同步的源和目的时,使用这个传输类型的软件并不要求是实时的。
  • 对于实时传输来说,实时性比正确性和数据重传更重要。考虑到总线的错误率较低,协议就认为传送一般都可以成功,即使有少量的数据出错,也不会对应用软件产生太大的影响(如音频软件)。实时传输的接收端可以判断自己是否在一个帧内错过了些数据,而且能知道丢了多少数据。
  • 在实时传输的过程中,因为没有握手信号来指示中止,所以实时传输的端点从不中途停止。即使能够查到错误,实时管道也不会因此停下,USB主机也仍继续处理下一帧的数据。因为实时传输的协议不支持每次事务处理都进行握手,所以错误检测的功能相对弱了许多。
  • 只有全速/高速设备可以使用实同步传输。

同步传输的两种传输模式

  1. 同步读传输
  2. 同步写传输
    在这里插入图片描述
    在这里插入图片描述
posted @ 2025-12-05 10:59  阿坤不咕  阅读(0)  评论(0)    收藏  举报