USB PD物理层基础:CC线上的“悄悄话”
大家好,欢迎来到第二章。今天咱们聊聊USB PD的物理层。
说实话,很多做嵌入式的朋友,一开始都被这个物理层绕晕过。我当年第一次看PD协议时,也盯着CC线上的波形发过呆。但搞懂了这一章,后面解析消息就容易多了。
物理层说白了,就是消息怎么在一条线上传过去。USB PD用的不是普通的USB D+/D-,而是CC线。
2.1 CC线:不只是检测连接
CC线,全称Configuration Channel。很多人以为它只用来检测有没有插拔。其实它的任务有三项:
- 连接检测:判断Source和Sink是否真的连上了。
- 角色识别:哪个是供电方,哪个是受电方。
- 通信通道:传输PD消息。
嗯,这里要注意。CC线是单线双向通信,不是差分对。所以抗干扰能力比D+/D-弱一些,但好在距离短。
2.2 BMC编码:类似于数字“摩尔斯电码”
CC线上传数据,用的是BMC编码(Biphase Mark Code)。听着玄乎,其实原理很简单。
你想想看,BMC编码就是靠跳变来表示数据:
- 发送逻辑“1”:每个bit周期中间加一次跳变(电平翻转)。
- 发送逻辑“0”:每个bit周期开头加一次跳变,中间不变。
不管发什么,每个bit周期开头都跳变一次。这样接收方就能靠这个跳变来恢复时钟,不用额外传时钟信号。
我做过一个项目,因为时钟对不上,解码出来的数据全是乱的。后来发现是BMC编码的上升沿不够陡,接收端没识别出来。所以硬件上要保证上升时间尽量短。
2.3 电压电平:讲“悄悄话”的音量
BMC编码的信号,在CC线上是有电压范围的。Source端和Sink端的电平还不一样。
| 场景 | 电压范围 (V) | 说明 |
|---|---|---|
| Source发送 | 1.05 ~ 1.35 | 用BMC编码调制在CC线上 |
| Source接收 | 0 ~ 0.2 (低电平) | 看Sink拉低后的电平 |
| Sink发送 | 0 ~ 0.4 | 通过改变负载来调变阻抗 |
| Sink接收 | 0.65 ~ 1.35 | 检测Source调制的电压 |
这里有个关键点:Source通过Rp上拉到3.3V或5V,Sink通过Rd下拉到GND。所以CC线上的静态电压,取决于Rp和Rd的分压。
BMC信号就是在那个静态电压上叠加一个较小的交流摆幅。如果你测到的BMC信号幅度太小,很可能是Rp/Rd配错了。
2.4 Rp/Rd电阻配置:握手的第一步
Rp和Rd不仅仅是上拉下拉那么简单。它们的值决定了供电能力和角色。
Source端的Rp有三种值:
- 10 kΩ(对应81 mA电流,老式Type-C)
- 22 kΩ(对应180 mA,USB 2.0或3.0)
- 56 kΩ(对应36 mA,仅支持USB 2.0且不带PD)
Sink端只有一个Rd:5.1 kΩ ±1%(虽然标准允许±5%,我建议用1%的,避免误判)。
为什么会这样?因为CC线上的电压被分压后,Source就能判断Sink类型:
- Rd接在CC1上,说明Sink选了CC1作为通信通道。
- 如果检测到Rd,说明支持PD。
- 如果开路或短路,Source会认为连接异常。
知识体系结构图
下面这张图,我把物理层的四个核心部分串起来了:
从图上可以看明白:CC线是“高速公路”,BMC编码是“通信协议”,电压电平是“路上的信号灯”,Rp/Rd是“收费站”——这四个东西合在一起,USB PD才能正常跑起来。
我建议你调试时,先确认CC线上能看到稳定的BMC信号,再去看协议层。如果物理层就断了,上层怎么调都白搭。