USB2.0高速主机端检测设备断开
USB2.0 高速的断开检测,是在 SOF 的 EOF 检测.
SOF 包的 EOP 是40bit SE0:前 32bit SE0 + 后 8bit SE0,断开采样只发生在最后这 8bit。
- 普通数据包(ACK/DATA 等)EOP 只有 8bit,高速断开检测只在 SOF 的 EOP 执行;
- 原因:HS 设备拔掉后,设备端 45Ω 终端电阻消失,总线开路,Host 发 SOF 的长 SE0 时,远端反射回来,差分包络幅度抬升;Hub/Host 只在 SOF EOP 末尾这 8bit 去采一次包络检波值,判断是否断开。
规范规定的采样窗口 vs PHY 硬件实现的包络检波器持续监测(TI SPRZ426 勘误核心)
- 规范理想行为:包络检测器电路一直跑,但只在 SOF EOP 最后 8bit 采样一次结果,其余时间就算有尖峰,不做判定。
- 很多 PHY 的 bug 默认行为:全程用包络检波结果直接上报断开,不限制采样窗口,SOF 整个包(SYNC/PID/CRC + 40bit EOP)任何位置反射尖峰超过阈值,立刻触发假断开。
基础定义:SE0
SE0:Single-Ended 0
DP=低,DM=低(两者都拉到GND)
- SE1:DP=高,DM=高(两者都拉到VCC,USB2.0 HS里几乎不会出现)
- Differential 1 (J):DP=高,DM=低
- Differential 0 (K):DP=低,DM=高
SE0 就是 DP、DM 都为逻辑0(低电平)。
但这里最容易混淆的关键点:逻辑电平 ≠ 差分电压 Vdiff = Vdp − Vdm
1. SE0 状态下,理想差分电压是多少?
理想:DP和DM同时到0V,
差分电压为0。
那为什么SOF EOP(40bit SE0)会测出很大的差分峰值?
不是驱动在输出差分信号,是阻抗不连续产生的反射!
高速USB的物理层模型(HS)
HS 收发器是电流模驱动,不是电压推挽。
- 发送J/K:从DP/DM灌/拉电流,在45Ω终端电阻上产生差分摆幅(典型400mV差分)
- 发送SE0:驱动把DP、DM都关断,不再注入差分电流,DP/DM都被终端电阻拉到地电位。
发送端输出SE0:驱动不再维持差分信号,总线进入无源SE0状态。
但线缆、连接器、PCB分支是传输线,有波阻抗 Z0≈90Ω差分。
2. SOF EOP长SE0时反射怎么来的
SOF的EOP是连续40bit SE0:
前面SOF包体是J/K差分码流;当包结束,TX停止差分驱动,进入SE0。
在传输线上:
- 之前J/K信号的能量还在线缆上,还在来回反射;
- 远端(设备侧)有45Ω上拉终端(HS设备接入时);一旦设备拔掉,远端45Ω终端消失,变成开路;
- 当远端开路,SE0阶段,传输线上残留的波形会在两端来回反射;
- 反射波到达Hub发送端(Hub下行端口),DP和DM的反射幅度不一样 → 产生瞬时差分电压 Vdp-Vdm ≠ 0。
重点:SE0是发送端的逻辑状态,不代表传输线上任意时刻DP、DM电压一定完全相等。
传输线反射会让DP、DM各自出现不同的电压扰动,于是产生瞬时差分尖峰。
包络检波器检测的就是这个Vdiff的峰值。
3. 断开检测的原理(USB2.0 §7.1.7.3)
HS断开检测的物理原理:
- 设备在位时:远端有45Ω差分终端,反射很小;SOF EOP SE0期间,反射回来的差分包络幅度 < 阈值(625mV)
- 设备拔掉后:远端45Ω终端消失,变成开路;SOF长SE0的反射叠加,差分包络幅度变大;
- Hub只在SOF EOP最后8bit采样包络检波输出,判断是否超过阈值,判定断开。
这里很多人踩坑:
“SE0是DP DM都0,差分应该是0,怎么会有几百mV差分?”
答:SE0是发送端驱动状态,不是传输线上的实时电压。反射会让DP、DM电位不对称,产生差分分量。
4. 补充:为什么SOF要用40bit长SE0而不是普通8bit EOP
普通数据包(DATA/ACK)EOP只有8bit SE0,太短,反射来不及累积,无法可靠检测拔设备。
只有SOF的EOP是40bit SE0,给传输线反射足够时间建立起足够大的差分包络,这就是为什么HS断开检测只能依托SOF的EOF。
一句话总结
SE0 定义就是 DP、DM 逻辑都为低;
但传输线反射会造成DP、DM电压不对称,产生瞬时差分电压。
SOF EOP的40bit SE0,就是给反射足够时间累积差分包络,供Hub在最后8bit窗口采样,以此判断设备是否被拔出。
USB2.0物理层的电信号





