3. 协议层模型:PD协议的分层结构与SOP信号
搞通信的都知道,任何一个复杂协议都不是一锅粥堆出来的。USB PD 也不例外——它严格分了三层:物理层、协议层、策略层。每一层各管各的事,又通过标准接口联动。
这套分层模型,说白了就是 “别越级汇报”。我刚开始调 PD 的时候,老觉得策略层直接改电压多省事啊?后来一次误操作把 CC 线烧了才明白——物理层不搞定,上层再聪明也没用。
3.1 分层到底怎么分?
下面这张表把三层的关系和职责拆开了,你对照着看会更清楚:
| 层次 | 英文 | 负责什么 | 典型要素 |
|---|---|---|---|
| 策略层 | Policy Engine | 电源协商、角色切换、状态机管理 | Source/Sink/DRP 状态,PDO 选择 |
| 协议层 | Protocol Layer | 事务组织、消息封装、重传、GoodCRC | Header、Data Object、Message ID |
| 物理层 | Physical Layer | 电气信号、BMC 编解码、CRC 校验、SOP | CC 线、BMC 符号、Rp/Rd、SOP 序列 |
你注意看,物理层在最底下,干的是最脏最累的活——把 0 和 1 变成差分电压,编码解码,还要识别报文的开始和结束。协议层更像一个翻译官,把物理层的原始比特流翻译成 “要增加电压到 5V 3A” 这样有意义的消息。策略层则是个决策者,根据当前状态决定下一步该干什么。我在一次产品联调中遇到过策略层乱跳状态的问题,最后定位到是物理层的 SOP 识别不稳定导致消息串扰——嗯,分层虽好,但底层不稳全盘崩。
3.2 物理层:SOP 与信号的门槛
物理层最核心的任务之一就是判断 “报文什么时候开始”。这就引出了这节课的重点——SOP(Start of Packet)信号。
SOP 不是简单的一串脉冲。它是用一组特定的 BMC 编码符号来标记报文起始的。我曾经在示波器上蹲过一整个下午,就是为了捕获一个正确的 SOP 波形——当时发现我们的板子发出的 SOP 前导码少了一个周期,导致接收方死活不解码。
3.3 SOP 到底是什么?
SOP 位于报文的开头,结构上分成两部分:
- 前导码(Preamble):64 个交替的 0/1 位,用于接收端时钟同步。
- SOP 序列:4 个 5 比特符,用 BMC 编码承载,用来标识通信目标。
不同的 SOP 序列代表不同的通信对象。标准里定义了四种主要类型:
| SOP 类型 | 通信方向 | 典型用途 |
|---|---|---|
| SOP | Source ↔ Sink | 双方电源协商、正常消息交换 |
| SOP' | Source ↔ Cable | 读取线缆 E-Marker、线缆供电 |
| SOP'' | Sink ↔ Cable | Sink 端读取线缆信息 |
| SOP''' | Cable ↔ 自身控制器 | 线缆内部通信(很少直接看见) |
| Hard Reset | 任意方发 | 全局复位,重新开始协商 |
为什么会需要这么多 SOP 类型?你想想看,在一条 Type-C 线缆里,Source、Sink、E-Marker 控制器三个角色可能同时在线。如果没有 SOP 区分,线缆发出的消息被 Source 当成 Sink 消息解码,那不乱套了?
3.4 协议层:让消息有意义
协议层在物理层之上。它把物理层传送过来的比特流“翻译”成 Header 和 Data Object。比如说,Source 发了一个 Request Data Object,协议层负责拆包、校验 GoodCRC、管理 Message ID,以确保消息不丢失、不重复。
3.5 策略层:谁来拍板?
策略层是顶层大脑。它不关心底层是 0 还是 1,只看状态机——当前是 Source 还是 Sink?要不要切换角色?该用哪个 PDO 供电?
我习惯把策略层想象成公司的 CEO:物理层是前台,协议层是项目经理,而策略层做决策。CEO 不会去管前台的电话线怎么接,但前台信号不好,CEO 就得等。
3.6 一张图看懂 PD 分层与 SOP
下面这张 SVG 将三层模型和 SOP 的位置画在了一起,你一眼就能看清他们怎么配合。
你看,策略层在顶部发号施令,协议层在中间组织消息,物理层在最底下发送和接收原始信号。SOP 信号就嵌在物理层的起始环节——没有它,接收方连报文什么时候开始都不知道。
一句话记住:
- 三层从上往下是“决策 → 翻译 → 信号”。
- SOP 属于物理层,但影响整个协议栈——因为它决定了消息是给 Source、Sink 还是线缆。