USB3 8b/10b 编码、偏差RD
2026-07-20
本文链接为:http://www.usbzh.com/article/detail-1775.html ,欢迎转载,转载请附上本文链接。
RD = Running Disparity,运行偏差 / 累计游程偏差
一、底层硬件前提(所有规则的根源)
- 传输介质结构
USB3/PCIe这类高速串行总线是交流耦合,收发端之间串联隔直电容。电容只能传递跳变的交流信号,会累积直流电荷。 - 两大硬件痛点
① 直流漂移:若数据流长期1更多/0更多,电容单向充电,接收电平判决基线偏移,直接误码;
② 时钟失锁:原始8bit数据可能出现长串连续0/1,无电平跳变,接收CDR时钟丢失同步; - 8b/10b编码架构前提
不是直接映射8→10bit,而是拆分为两段偶数长度子编码:5b→6b + 3b→4b,拼接为10bit码元;- 偶数bit子块内1/0差值只能是偶数(0、±2);
- 拼接后总偏差只有两种:±2(对应RD+/RD-)、0(5/5均衡)。
- 码元分类前提
- D码:承载普通业务数据,仅分配总偏差±2的码字,无5/5均衡码;
- K码(控制码,如K28.1逗号、TS1/TS2):少量特殊控制符号,可使用5/5均衡(偏差0)码字。
- 电气空闲EI定义
链路关闭差分驱动、无任何10bit码元输出的状态(U1/U2/U3低功耗、Polling训练空闲期);EI会泄放隔直电容累积电荷,清空上一轮运行偏差RD状态。- 长EI:U1/U2/U3、Polling空闲,重置RD;
- U0包间隙短暂EI:仅暂停发送,电容电荷未泄放,不重置RD。
二、核心因果链(为什么会有RD、交替规则、初始偏差选择)
因果1:为什么需要RD+ / RD-(直流平衡需求)
- 因:D码只能是6个1+4个0(RD+,多1个1)或4个1+6个0(RD-,多1个0),无法均衡;
- 果:必须交替发送RD+、RD-,一正一负抵消直流分量,避免隔直电容持续充电漂移基线。
因果2:为什么退出长EI时可以任选初始RD
- 因:长EI(Electical Idle)状态下差分线无驱动,电容电荷完全泄放,上一轮的运行偏差无残留影响;
- 果:新一轮连续数据发送,发送端可自由选择RD+或RD-作为起点。
Electical Idle 指的是无差分信号,即RX+-电压相等
因果3:为什么U0数据包间隙不能重置RD
- 因:仅短暂停发,电容电荷未泄放,直流基线保留上一码元的偏差累积;
- 果:必须延续上一个码元的运行偏差,不能重新任选。
因果4:为什么接收端要校验运行偏差
- 因:发送端强制交替RD,接收端可以预判下一个码元的预期偏差;
- 果:收到码字与预期偏差不匹配,判定为偏差错误,代表直流平衡被破坏、大概率存在传输误码。
因果5:为什么偏差错误不会直接触发链路重训练
- 因:单码元偏差错误仅代表局部误码,不代表整条链路硬件失效;重训练是上层链路层决策;
- 果:PHY仅向上层链路层上报错误,不自主回到Polling重训练。
因果6:为什么5/5均衡码字只给K码,不给业务D码
- 因:均衡码字不改变运行偏差,连续发送会停止直流抵消;业务数据是长串连续数据流,不能用均衡码;
- 果:规范将全部零偏差码字分配给零星插入的K控制码(同步、训练用),不分配给D业务码。
三、全套标准化规则
发送端规则
- 每次结束长EI(U1/U2/U3唤醒、Polling训练结束)、首次发送差分数据时,发送端可任选RD+或RD-作为初始偏差;
- 选定初始偏差后,直到下一次进入长EI前,所有D码必须严格交替RD+、RD-,遵守8b/10b编码偏差规则;
- U0内部数据包间短暂EI不重置RD,必须延续前序码元偏差。
接收端偏差初始化规则
- 接收端初始运行偏差 = 完成码元同步锁定的第一个码元自身偏差;
- 传输中途突发误码导致Symbol Lock丢失、重新同步时,接收偏差会重新初始化,以新锁定的第一个码元为准。
接收校验与错误上报规则
- 初始偏差确定后,后续每一个收到的码元,必须匹配当前运行偏差对应的合法码字,否则判定偏差错误;
- 检测到偏差错误 / 8b/10b解码非法码字时,PHY必须将错误上报给上层链路层;
- 单纯偏差错误不会直接触发链路重训练,是否重训练由链路层根据错误频次、严重程度判断。
四、总览
- 硬件交流耦合 → 必须控制直流漂移 → 8b/10b拆分架构让业务D码只能产生±1偏差;
- 靠RD+、RD-交替抵消直流;长EI清空电容电荷,因此唤醒后可任选起始偏差;
- 均衡5/5码字仅用于零星K同步码,不能用于连续业务数据;
- 接收端基于同步码初始化偏差,全程校验,出错仅上报、不自主重训练。
tusb1310
TI的tusb1310 PHY的RX_STATUS状态寄存器有以下几种状态https://www.ti.com.cn/cn/lit/ds/symlink/tusb1310.pdf#5#1
| RX_STATUS[2:0] | 检测到的条件 (Detected Condition) | 功能说明 |
|---|---|---|
| 000b | 接收端不存在 (Receiver not present) | 表明物理层未检测到对端接收器的存在,通常用于链路训练或初始连接检测。 |
| 100b | 8B/10B 解码错误 (8B/10B decode error) | 表示接收到的数据违反了 8b/10b 编码规则,无法被正确解码。物理层会将错误字节替换为 K28.4(SUB) 符号,并在这些时钟周期内报告此状态。 |
| 101b | 弹性缓冲器溢出 (Elastic buffer overflow appeared) | 表示接收端的弹性缓冲器(用于匹配收发两侧时钟速率的FIFO)发生了溢出,即数据写入速度持续高于读出速度,导致数据丢失。 |
| 110b | 弹性缓冲器下溢 (Elastic buffer underflow) | 表示接收端的弹性缓冲器发生了下溢,即数据读出速度持续高于写入速度,导致无效数据被读出。 |
| 111b | 不均等性误差 (Disparity error) | 收到的码流出现运行不一致(Running Disparity)错误,破坏了 DC 平衡。 |
上报了不均等性误差误差之后,链路层会根据包类型不同而处理:
| 包类型 | 链路层响应行为 | 说明 |
|---|---|---|
| 数据包 (DP) | 1. 发送 LBAD:接收端会向发送端发送一个 LBAD(接收失败)链路管理包。<br>2. 等待重传:发送端收到 K28.4 SUB后,会先回复 LRTY(准备重传),然后从最后一个被 LGOOD_n 确认的包之后,重传所有后续数据包。 | 这是USB 3.x 可靠传输机制的核心,通过“回退重传”保证数据最终一致。 |
| 链路管理包 (LMP) | 直接发起链路恢复:由于LMP本身不含序列号,无法通过 LBAD/LRTY 机制重传。接收端会直接认为链路出现严重问题,触发链路训练和状态机(LTSSM),可能回退到 Recovery 或 Polling 状态重新进行链路训练。 | LMP用于管理链路本身,其出错意味着链路控制平面不可靠,必须重置。 |
| 事务层包 (TP) | 通常不会直接导致 LBAD。事务层包的错误最终会通过事务层自己的超时或重试机制处理,但链路层仍会先丢弃该包。 | 例如,一个ACK TP出错,发送端可能因收不到ACK而超时,从而触发事务层重试。 |
持续性错误处理与链路降级
- 错误计数:链路层会持续监控此类错误的发生频率。
- 触发链路恢复:如果短时间内 RX_STATUS=111b 错误频繁发生(例如,每秒钟数十次),链路层会认为物理链路(如线缆、连接器)存在严重的信号完整性问题。此时,它会主动启动链路恢复流程(进入 Recovery 状态),通过重新发送训练序列(TSEQ/TS1/TS2)来重新进行均衡和时钟同步。
- 协商降速:如果多次恢复尝试均无法有效降低错误率,链路可能会在重新训练时协商从 5Gbps 降速到低速模式(或干脆断开连接),以保证基本通信的稳定性。
USB3知识点





