参考资料:
- 《圈圈教你玩USB》
- 《usb_20.pdf》的《Chapter 7 Electrical》
- USB的NRZI信号格式:https://zhuanlan.zhihu.com/p/460018993
- USB2.0包Packet的组成:https://www.usbzh.com/article/detail-459.html
1. 硬件连接
- HUB 端口上有D+和D-两条差分数据线,当无设备连接时,两条线都通过15KΩ下拉电阻被拉低。
- 当设备连接(USB Device)时,会在一条差分线上加上1.5KΩ的上拉电阻,改变其电压状态。

2. 电气信号总线状态
USB连接线有4条:5V、D+、D-、GND。数据线D+、D-,只能表示4种状态。USB协议中,很巧妙地使用这两条线路实现了空闲(Idle)、开始(SOP)、传输数据(Data)、结束(EOP)等功能。
2.1 低速/全速信号电平

2.2 高速信号电平


3. 设备连接与断开(Attach/Detach)识别
3.1 连接识别原理
- 主机控制器通过检测D+或D-线上的电压变化来识别设备连接
- 当检测到电压从低态(<0.8V)变为高态(>2.0V)时,表示有设备接入
3.2 断开识别原理
- 断开连接时,上拉电阻消失,D+和D-线同时回到低电平状态
- 主机控制器检测到差分线电压同时变低时,识别为设备断开
- 对于高速设备,对于高速设备,它先作为全速设备被识别出来,然后再被识别为高速设备。工作于高速模式时,D+的上拉电阻是断开的,所以对于工作于高速模式的USB设备,无法通过D+的引脚电平变化监测到它已经断开。
- 工作于高速模式的设备,D+、D-两边有45欧姆的下拉电阻,用来消除反射信号:

- 当断开高速设备后,Hub发出信号,得到的反射信号无法衰减,Hub监测到这些信号后就知道高速设备已经断开,内部电路图如下:

3.3 防误触发机制
速度等级 | 断开前状态 | 断开后状态 | 断开检测原理 |
低速设备 | D-上拉高电平
D+为低电平 | D-和D+同时为低电平 | 主机检测到D-线从高电平变为低电平,且两线同时为低状态 |
全速设备 | D+上拉高电平
D-为低电平 | D+和D-同时为低电平 | 主机检测到D+线从高电平变为低电平,且两线同时为低状态 |
高速设备 | 差分信号处于高速状态
周期性信号传输 | 差分对恢复到静默态
D+和D-同时为低电平 | 主机检测到高速差分信号消失,且差分线同时回到低状态 |
4. 设备速率识别
4.1 通过上拉电阻位置识别速率
速率类型 | 上拉电阻位置 | 识别特征 |
低速(1.5Mbps) | D-线上拉 | D-为高电平,D+为低电平 |
全速(12Mbps) | D+线上拉 | D+为高电平,D-为低电平 |
高速(480Mbps) | 初始为全速,随后升级 | 通过高速握手协议升级 |

4.2 高速设备识别流程
- 设备初始以全速模式连接(D+上拉)
- 复位信号:主机发送复位信号(SE0状态)
- 高速握手协议("a high-speed detection handshake"信号):
- USB设备维持D+的上拉电阻,发出"Chirp K "信号,表示自己能支持高速模式
- 如果Hub没监测到"Chirp K "信号,它就知道这个设备不支持高速模式
- 如果Hub监测到"Chirp K "信号后,如果Hub能支持高速模式,就发出一系列的"Chirp K"、"Chirp J"信号,这是用来通知USB设备:Hub也能支持高速模式。发出一系列的"Chirp K"、"Chirp J"信号后,Hub继续维持SE0信号直到10ms。
- USB设备发出"Chirp K "信号后,就等待Hub回应一系列的"Chirp K"、"Chirp J"信号
- 收到一系列的"Chirp K"、"Chirp J"信号:USB设备断开D+的上拉电阻,使能高速模式
- 没有收到一系列的"Chirp K"、"Chirp J"信号:USB设备转入全速模式

- 成功握手后,设备切换到高速模式,并停止使用1.5KΩ上拉电阻
4.3 超高速设备识别
- SuperSpeed(USB 3.0+)设备使用额外的差分对(SSTX+/SSTX-和SSRX+/SSRX-)
- 初始化过程:
- 设备通过传统的USB 2.0接口进行基本识别
- 同时在SuperSpeed通道上进行LFPS(Low Frequency Periodic Signaling)训练序列
- 训练完成后,设备可以同时支持SuperSpeed和传统速率模式
4.4 总结:识别流程示意图
这种速率检测机制确保了USB的向后兼容性,同时允许新设备利用更高带宽通信。
5. 设备状态图说明
下图为USB规范中定义的设备状态转换图,展示了USB设备在连接和使用过程中的不同状态及其转换关系。

5.1 主要状态说明
1. 附加状态(Attached)
- 含义:设备物理连接到USB总线但尚未通电
- 特点:仅表示物理连接建立,设备未被识别或配置
- 进入条件:设备插入USB端口
2. 供电状态(Powered)
- 含义:设备从USB总线获得电源
- 特点:设备内部电路已通电,但尚未收到复位信号
- 进入条件:从Attached状态接收到电源
3. 默认状态(Default)
- 含义:设备已收到总线复位信号
- 特点:设备以默认地址(0)响应请求,可接收标准USB请求
- 进入条件:在Powered状态收到总线复位信号
4. 地址状态(Address)
- 含义:设备已被分配唯一地址
- 特点:设备响应分配给它的特定地址的请求
- 进入条件:主机发送SET_ADDRESS请求
5. 配置状态(Configured)
- 含义:设备已完全配置,所有接口和端点已准备就绪
- 特点:设备功能完全可用,可进行正常数据传输
- 进入条件:主机发送SET_CONFIGURATION请求
6. 挂起状态(Suspended)
- 含义:设备进入低功耗模式
- 特点:电流消耗降至最低,USB总线上无活动3ms后可触发
- 进入条件:从任何状态在总线无活动超过3ms后进入
- 退出条件:总线恢复活动或收到复位信号
5.2 状态转换路径
上行转换(设备初始化过程)
- Attached → Powered:设备接通电源
- Powered → Default:收到总线复位信号
- Default → Address:收到地址分配请求
- Address → Configured:收到配置请求
下行转换(设备断开或重置过程)
- Configured → Address:设备去配置(Device Deconfigured)
- Address → Default:收到复位信号
- Default → Powered:收到复位信号
- Powered → Attached:设备断电(如Hub复位或去配置)
挂起状态特殊转换
- 任何状态 → Suspended:总线无活动超过3ms
- Suspended → 原状态:总线活动恢复
Hub相关转换
- Attached → Powered:Hub配置完成
- Powered → Attached:Hub复位或去配置
5.3 关键转换触发因素
转换 | 触发事件 | 设备行为 |
Attached → Powered | 设备接通电源 | 初始化内部寄存器,不响应总线 |
Powered → Default | 总线复位信号 | 将设备地址重置为0,准备接收控制传输
1. 进入默认工作状态
2. hub和设备协商是否可以进入高速模式 |
Default → Address | SET_ADDRESS请求 | 记录新地址,之后以新地址响应 |
Address → Configured | SET_CONFIGURATION请求 | 启用配置中定义的所有接口和端点 |
任何状态 → Suspended | 总线无活动3ms | 降低功耗至最小,保持内部状态 |
Suspended → 原状态 | 总线恢复活动 | 恢复正常功耗,继续之前操作 |
5.4 状态图实际应用
- 设备枚举过程:新设备从Attached逐步过渡到Configured
- 节能管理:通过Suspended状态实现低功耗模式
- 错误恢复:通过复位信号将设备恢复到Default状态
- 热插拔支持:设备可在任何时候断开,新设备可随时连接并初始化
6. 数据信号
上文状态图在进入复位状态,分配地址,配置设备都需要发送数据包,下面讲解数据包相关内容。

6.1 低速/全速的SOP和EOP
SOP
:Start Of Packet,Hub驱动D+、D-这两条线路从Idle
状态变为K
状态。SOP 中的 K
状态就是SYNC 信号的第1位数据SYNC
:3对KJ外加2个K。(从同步信号中解析出周期,不需要双方提前约定速率。)EOP
:End Of Packet,由数据的发送方发出EOP,数据发送方驱动D+、D-这两条线路,先设为SE0状态并维持2位时间,再设置为J状态并维持1位时间,最后D+、D-变为高阻状态,这时由线路的上下拉电阻使得总线进入Idle状态。
6.2 高速的SOP
高速的
EOP
比较复杂,作为软件开发人员无需掌握。高速模式中,Ide状态为:
D+、D-
接地。SOP
格式为:从Idle状态切换为K状态。SOP
中的K
状态就是SYNC
信号的第1位数据。高速模式中的
SYNC
格式为:KJKJKJKJ KJKJKJKJ KJKJKJKJ KJKJKJKK,即15对KJ,外加2个K。6.3 NRZI与位填充
参考文章:USB的NRZI信号格式
NRZI
:Non Return Zero Inverted Code,反向不归零编码。NRZI的编码方位为:对于数据0,波形翻转;对于数据1,波形不变。
使用NRZI,发送端可以很巧妙地把"时钟频率"告诉接收端:只要传输连续的数据0即可。在下图中,低速/全速协议中"Sync Pattern"的原始数据是"00000001",接收端从前面的7个0波形就可以算出"时钟频率"。

使用
NRZI
时,如果传输的数据总是"1",会导致波形维持不变。如果电平长时间维持不变,比如传输100位1时,如果接收方稍有偏差,就可能认为接收到了99位1、101位1。而USB中采用了Bit-Stuffing
位填充处理,即在连续发送6个1后面会插入1个0,强制翻转发送信号,从而让接收方调整频率,同步接收。而接收方在接收时只要接收到连续的6个1后,直接将后面的0删除即可恢复数据的原貌。NRZI数据格式如上图所示。