USB深度解析(一):低速、全速电气特性与通信协议
USB深度解析(一):低速、全速电气特性与通信协议
在当今的计算机外设接口中,USB(Universal Serial Bus)无疑占据着统治地位。虽然USB标准已经迭代到了高速的USB 3.x甚至USB4,但低速和全速模式作为USB架构的基石,定义了USB最初也是最底层的连接逻辑。高速的USB协议较为复杂,本文将深入剖析USB低速和全速模式的电气特性设计与通信协议原理。
本文参考文档为 USB 2.0 官方规范,教程中的部分截图可从中找到出处;
目前仅对低速和全速模式的协议做出解析,适合新手、软件应用相关从业者阅读。
1.低速、全速电气特性
物理层是USB可靠性传输的保障。低速和全速虽然速率不同,但共享相似的电气架构,通过差分信号和特定的终端电阻网络实现设备识别与通信。
1.1 终端电阻与设备速度识别
USB设备接入主机或集线器的瞬间,首先进行的就是速度识别。这是通过连接在数据线上的上拉电阻位置来实现的。
- 全速设备(12 Mb/s):在
D+线上连接一个1.5kΩ的上拉电阻至3.3V电源。 - 低速设备(1.5 Mb/s):在
D-线上连接一个1.5kΩ的上拉电阻至3.3V电源。 - 主机/集线器端:在下行端口的
D+和D-线上,各连接一个15kΩ的下拉电阻接地。
识别机制:当设备未接入时,主机端的下拉电阻将D+和D-拉低,总线处于“单端0”(SE0)状态。当设备插入后,设备端的1.5kΩ上拉电阻与主机端的15kΩ下拉电阻形成分压,将对应的数据线拉高至高电平。主机通过检测是D+还是D-被拉高,即可判断接入的是全速设备还是低速设备。
1.2 差分信号与总线状态
USB采用差分信号传输,抗干扰能力强。根据总线上电压变化,总线会呈现以下状态:差分 1、差分 0、单端 0、单端 1、数据 J 态、数据 K 态、空闲状态、复位状态、包起始、包结束、断开、连接,具体介绍如下图:

其中,关键电压阈值包括:
- \(V_{IH}(min) = 2.0V\):输入高电平阈值。
- \(V_{IL}(max) = 0.8V\):输入低电平阈值。
- \(V_{OH}(min) = 2.8V\):驱动器输出高电平。
- \(V_{OL}(max) = 0.3V\):驱动器输出低电平。
1.3 驱动器与接收器特性
为了满足不同应用场景和成本控制,USB规范对低速和全速驱动器提出了不同要求:
-
全速驱动器:设计驱动90Ω±15%差分阻抗的屏蔽双绞线。上升/下降时间控制在4ns - 20ns之间,较快的边缘速率支持12Mbps传输。
为了保证信号质量,全速驱动器的输出阻抗(含串联电阻Rs)必须匹配线路阻抗,需在28Ω ~ 44Ω之间。因此,实际设计中通常需要在D+和D-线上各串联一个约22Ω至33Ω的电阻(Rs),该电阻应尽可能靠近驱动器引脚放置。这个电阻与芯片内部驱动器的输出阻抗叠加,共同满足阻抗匹配要求,抑制信号反射,确保通信稳定。
-
低速驱动器:设计驱动较低频率信号,上升/下降时间较慢(75ns - 300ns)。较慢的边缘速率降低了电磁辐射(EMI),允许使用非屏蔽电缆。低速设备通常使用永久的电缆连接,且其电容负载(200pF - 450pF)有严格限制。
-
接收器:必须具备差分接收器和单端接收器。差分接收器需能检测>200mV的差分电压;单端接收器用于检测SE0等状态。
1.4 关于高速模式的说明
USB 2.0引入的高速模式(480 Mb/s)在物理层上采用了完全不同的机制。它使用电流驱动模式和精确的45Ω终端电阻,并遵循严格的眼图模板规范。其复杂的信号完整性设计通常集成在专用PHY芯片中,本文不作深入展开,读者将其理解为物理层的“升级版”即可。
2. 低速、全速的通信协议
通信协议是USB逻辑层的核心,定义了主机与设备之间数据交换的规则。为了在共享总线上实现有序、高效和可靠的传输,USB协议采用了严格的分层设计:包是信息传输的基本单元,所有数据均以包的形式在总线上传输;每个包由多个字段组成,承载地址、类型、数据或校验信息;特定的包序列(令牌、数据、握手)组合构成了事务,代表一次完整的交互过程;最终,不同的事务序列形成了USB的四种传输模式(控制、批量、中断、同步)。这种从微观编码到宏观传输的架构,确保了系统的有序运行。
2.1 USB中的NRZI 编码和位填充
2.1.1 NRZI 编码规则
USB在传输数据包时采用 NRZI 数据编码。在 NRZI 编码中,“1”表示电平不变,“0”则表示电平变化。连续的零值会使 NRZI 数据在每个比特周期内翻转;而连续的“1”则会导致数据中出现长时间无转换的状态。这种编码方式使得逻辑“0”总是伴随着电平跳变,增加了信号的动态特性,有利于接收端提取时钟信息。

2.1.2 位填充机制
为了确保足够的信号转换,发送设备在通过USB发送数据包时会采用位填充技术。在数据流中,每当出现连续六个“1”之后,都会插入一个“0”,以便在 NRZI 编码前强制数据流中的信号转换。这使得接收端逻辑至少每七个比特周期内能检测到一次数据转换,从而保证数据与时钟的锁相。

位填充作用于除同步字段(SYNC)和包结束字段(EOP)之外的所有字段(包括 PID、地址、数据、CRC 等),SYNC 与 EOP 为固定模式,不进行位填充处理。
2.2 字段
字段是构建USB数据包的基本砖块,每个字段携带特定的控制或数据信息。数据包就是由一系列有序的字段组合而成。
2.2.1 同步字段(SYNC)

用于低速/全速传输的SYNC模式要求为3个 KJ 对,后接2个K,共计8个符号。上图展示了 NRZI 位模式,同步字段位于每个包的最起始位置。同步字段使接收端与发送端的时钟同步,确定包的起始边界,这是接收端正确解析后续数据的基础。
低速/全速传输的K、J状态在电气状态下是相反的,因此低速与全速SYNC极性相反
2.2.2 包标识字段(PID)
每个 USB 数据包的 SYNC 字段后紧接一个数据包标识符(PID)。PID 长度为 8 位,由 4 位数据包类型字段和 4 位校验字段(类型字段的按位取反)组成,唯一确定了包的类型。

PID是包的“身份证”,例如,它定义了当前包是令牌包(IN/OUT/SETUP)、数据包(DATA0/DATA1)还是握手包(ACK/NAK),具体类型如下所示。

2.2.3 地址字段(ADDR)
地址字段包含7位设备地址(ADDR)和4位端点地址(ENDP),共11位,指定数据包的目标。主机通过地址字段在总线上寻址特定的设备和端点,USB设备也据此判断包是否属于自己的。
在USB架构中,一个物理设备(如鼠标、键盘、耳机)会被主机分配唯一的7位设备地址。设备内部通过不同的端点(Endpoint)来组织数据通道,主机实际是与这些特定端点进行数据传输。端点0是每个设备必备的默认控制端点。此外,设备会根据功能定义额外端点。例如,USB耳机通常具备音频输出和输入功能,因此需要额外定义两个端点(一个同步输出端点用于播放,一个同步输入端点用于录音)。加上端点0,一个USB耳机至少包含三个端点。
2.2.4 帧号字段
帧号字段为11位,仅存在于每毫秒发送一次的SOF(Start of Frame)包中。作为主机发送的帧号计数器,用于同步和带宽管理,主要服务于同步传输模式。
2.2.5 数据字段
数据字段长度可为 0 至 1024 字节,必须为整数倍的字节,且不同速度模式下支持的最大长度存在差异。每个字节内的数据位按LSb优先顺序进行移出操作。数据字段承载实际传输的负载,是通信的核心内容载体。
低速设备允许的最大数据有效载荷大小为8字节;全速设备同步传输最大 1023 字节,批量 / 中断传输最大 64 字节;高速设备的最大数据有效载荷大小为1024字节。
2.2.6 CRC字段
CRC 字段包括 CRC5(用于令牌包与 SOF 包)和 CRC16(用于数据包)。循环冗余校验,用于检测传输过程中的错误,保证数据完整性。接收端若校验失败,则丢弃该包。
2.3 包
包是USB总线传输的基本单元,所有的通信都通过在总线上发送包来实现。包将复杂的通信需求封装成标准化的格式,确保总线上任意时刻只有一个发送者,避免了冲突。通过不同类型的包组合,USB实现了主机对传输的绝对主导权。
2.3.1 令牌包
令牌包分为输入包(IN)、输出包(OUT)、设置包(SETUP)、帧起始包(SOF)。虽然SOF包被归类为令牌包,但它与其他三种令牌包(IN、OUT、SETUP)有本质区别,接下来分开描述。
- 令牌包(IN/OUT/SETUP)
(IN/OUT/SETUP)令牌包由SYNC、PID、ADDR、ENDP、CRC5、EOP组成 。令牌包由主机发出,用于启动一个事务,定义了事务的类型(输入IN、输出OUT、设置SETUP)以及目标设备。它是USB“主从架构”的体现,一切传输由主机发令。

除了常规的令牌包外,USB为分拆事务定义了一个特殊的令牌——“split”令牌。该令牌为一个4字节的令牌数据包,而常规令牌数据包均为3字节。
- 帧起始包(SOF)
帧起始(SOF)数据包由主机以标称速率每1.00 ms ±0.0005 ms发送一次(适用于全速总线),或每125 µs ±0.0625 µs发送一次(适用于高速总线)。 SOF 数据包包含一个标识数据包类型的PID,随后是11位的帧号字段,如图下图所示。

2.3.2 数据包
数据包由SYNC、PID、Data、CRC、EOP组成,如下图所示。数据包共有四种类型:DATA0、DATA1、DATA2和 MDATA 。其中,两个数据包PID(DATA2和MDATA)仅用于高速USB设备。数据必须始终以整字节为单位发送,数据CRC校验仅针对数据包中的数据字段进行计算。低速设备允许的最大数据有效载荷大小为8字节;全速设备在同步传输最大1023字节,批量/中断传输最大64字节;高速设备的最大数据有效载荷大小为1024字节。

2.3.3 握手包
握手包结构最简单,仅由 SYNC、PID 和 EOP 组成,无额外的地址、数据或校验字段。握手包用于报告数据事务的状态,可返回表示数据成功接收、命令接受或拒绝、流控制以及停止条件的值。仅支持流控制的事务类型才能返回握手包。
握手包状态如下
- ACK:确认数据接收成功。
- NAK:设备忙或无法接收,请求稍后重试(非错误,而是流控机制)。
- STALL:设备挂起或端点停止,需要主机干预恢复。
- NYET:仅用于高速模式,用于分割事务、批量/控制 OUT 事务的 PING 协议等。
- ERR:仅用于高速模式,用于分割事务中的错误报告。
2.4 事务
事务是USB通信协议中的交互逻辑单元,由一系列有序的包交换组成。它是实现具体功能(如读数据、写数据)的最小操作序列。事务定义了“请求-响应”的交互流程,确保了数据传输的可靠性和流控能力。
一次完整的事务通常包含三个阶段:
- 令牌阶段:主机发送令牌包(如OUT),指定目标设备和端点,宣布“我要发数据了”。
- 数据阶段:数据来源方(主机或设备)发送数据包。若是IN事务,设备发送数据包,主机接收;若是OUT/SETUP事务,主机发送数据包,设备接收。
- 握手阶段:数据接收方发送握手包(如ACK),告知发送方“数据已收到,校验无误”。注:某些事务类型(如同步传输)为了实时性,没有握手阶段。
以下是一个正常的主机设置事务处理流程:

2.5 传输模式
传输模式是USB协议栈最高层的抽象,定义了不同类型数据流的服务质量。USB设备需求差异巨大:有的需要绝对可靠(如U盘),有的需要实时性(如摄像头),有的只需偶尔报告状态(如鼠标)。为此,USB将底层的“包”和“事务”封装成四种标准化的管道(Pipe),为上层应用提供差异化的传输保障。
2.5.1 控制传输(Control Transfer)
控制传输是USB体系中最为核心且每个设备强制支持的传输模式,且端点0(Endpoint 0)专用于此,专门用于处理主机与设备之间的控制指令与状态查询,如设备枚举、地址分配和描述符获取等。一个完整的控制传输由建立、数据和状态三个阶段构成,通过多种包的精确配合完成复杂的配置任务。
如下图所示:

1. 建立阶段(Setup Stage)
这是控制传输的起始,固定由一个SETUP事务组成。主机首先发送SETUP令牌包,紧接着发送一个DATA0数据包(固定8字节,包含标准请求命令,如Get Descriptor),设备在正确接收后回复ACK握手包。此阶段的作用是向设备宣告一个控制命令的开启,并传递具体的请求参数。
2. 数据阶段(Data Stage)
该阶段是可选的,用于传输命令所需的实际数据(如设备返回的描述符)。如果需要传输超过单包最大长度的数据,会拆分为多个IN或OUT事务。为了保证数据不重不漏,协议引入了数据切换机制(Data Toggle):数据包的PID在DATA0和DATA1之间严格交替。例如,第一个数据包为DATA0,下一个必须是DATA1。如果接收方收到重复的PID(如连续两个DATA0),说明发送方未收到上一个ACK,接收方会丢弃重复数据但重新回复ACK,从而触发发送方重传。
3. 状态阶段(Status Stage)
该阶段用于确认整个控制传输的完成,其传输方向总是与数据阶段相反(若数据阶段为IN,则状态阶段为OUT;反之亦然)。通常,状态阶段会使用一个零长度包(ZLP)来汇报。例如,数据阶段为IN时,主机会发送OUT令牌包,接着发送一个DATA1类型的零长度数据包,设备接收后回复ACK握手包,宣告整个控制传输成功结束。
2.5.2 批量传输(Bulk Transfer)
批量传输专为U盘、打印机等需要传输大容量数据的设备设计。它由若干个IN/OUT事务组成,它的核心设计哲学是“绝对可靠但谦让”:它通过CRC校验、握手包和重试机制保证数据100%准确无误,但它不具有固定的带宽保证,在总线空闲时“见缝插针”地传输,一旦总线忙碌,批量传输会主动暂停,等待带宽空闲。低速设备不支持批量传输,全速和高速设备则通过多个单事务的连续拼接来完成大数据量的搬运。

2.5.3 中断传输(Interrupt Transfer)
中断传输的“中断”实际上是主机通过固定间隔轮询设备来模拟中断效果的一种传输模式。它专为鼠标、键盘等小数据量、非频繁但要求低延迟的设备设计。主机按照端点描述符中bInterval字段指定的周期(如1ms、10ms)定时查询设备,保证设备响应的最大延迟。它同样具备高可靠性,通过握手包确保数据准确,但数据量较小(全速最大64字节,低速仅8字节)。
中断传输通常由单事务构成,绝大多数为IN事务(设备向主机报告状态或输入)。主机每隔bInterval毫秒发送一个IN令牌包。如果设备有数据,则返回一个DATA数据包,主机接收后回复ACK握手包。如果设备暂无数据上报,则设备返回NAK握手包。主机收到NAK后,不会像批量传输那样立即重试,而是等待下一个轮询周期再次发送IN令牌。这种机制既保证了低延迟,又避免了总线资源的浪费。
中断传输的数据包流程图可以参考批量传输的数据包流程图,不同的是,在中断传输下,令牌包是定时输出的。
2.5.4 同步传输(Isochronous Transfer)
同步传输是USB为音频、视频流等实时性要求极高的应用量身定制的传输模式。它奉行“实时性高于一切”的原则:协议保证每帧(全速1ms,高速125µs)都有固定的带宽分配给同步传输,确保数据流连续不断;但作为代价,它放弃了绝对的可靠性——没有握手包,接收方不回复ACK,发送方也不进行重传。即使数据在传输中因干扰出错,CRC校验也仅用于检测,不会触发重传,以免延迟累积导致音视频卡顿。低速设备不支持此模式。
同步传输由单事务构成,但事务中只包含令牌包和数据包,完全没有握手包。以全速总线为例,每帧(1ms)内,主机在每帧开始时通过SOF(Start of Frame)包划分带宽,接着主机发送IN或OUT令牌包 -> 设备发送或接收DATA包 -> 事务直接结束,无ACK。


浙公网安备 33010602011771号