第4章:角色识别与互换(DFP/UFP/DRP)
4.1 端口角色定义:谁供电,谁受电?
先问大家个问题:一根Type-C线连上两台设备,谁做主?谁从?这就是端口角色要干的事。
我个人习惯把DFP(Downstream Facing Port)想象成那个主动提供电力和数据的“老大哥”——典型的DFP比如笔记本的Type-C口、充电器。UFP(Upstream Facing Port)则是个“小弟”,比如手机、移动硬盘,等着被供电或当外设。
DRP(Dual Role Port)最“人格分裂”,既能当老大也能当小弟。我遇到过不少团队在设计DRP设备时,一开始没想清楚角色切换的边界,结果跟不同品牌充电器互连时频频出问题。
- DFP:下行端口,提供VBus电源,担任Host角色。
- UFP:上行端口,消耗VBus电源,担任Device角色。
- DRP:双角色端口,初始未连接时在DFP/UFP间“摇摆”,直到协商决定最终角色。
核心要点:角色不是靠猜的,而是通过CC线上的电压水平(Rd/Rp电阻配置)来判断的。
4.2 角色决定因素:CC线上的“语言”
老实讲,很多人以为角色是靠握手协议决定的,其实更底层的物理机制是电阻。
DFP会在CC线上拉一个Rp电阻(上拉);UFP会下拉一个Rd电阻。CC线检测到Rd,DFP就知道“对面是个UFP”,于是开启VBus供电。DRP则会周期性地切换Rp和Rd,像个雷达那样扫描对面。
小技巧:调试时,我习惯用示波器先抓CC线电平。如果看到电压在0.4V~1.6V之间快速跳变,基本可以确定是DRP在“摇摆”,还没稳定下来。
4.3 Try.SRC / Try.SNK 机制:谁先开口说话?
DRP设备互连时,谁当SRC(提供电源)谁当SNK(消耗电源),就成了一个问题。Type-C规范引入了Try.SRC和Try.SNK机制。
| 机制 | 作用 | 典型场景 |
|---|---|---|
| Try.SRC | DRP开局先尝试做DFP(即SRC),如果对面响应,则固定为DFP角色。 | 笔记本的Type-C口自带电源输出意图 |
| Try.SNK | DRP开局先尝试做UFP(即SNK),等待对面供电。 | 大部分手机Type-C口倾向于先受电 |
| 无偏好 | DRP随机摇摆,完全由双方协商决定角色。 | 通用扩展坞,可适应不同场景 |
为什么要有Try.SRC和Try.SNK?
你想想看,两个DRP设备互连,如果都试图当SRC,就会产生冲突。Try.SRC/Try.SNK定义了设备的“初始意图”,你偏向做供电方,你就先亮出Rp;你偏向做受电方,你就先亮出Rd。这样一来,互连冲突的概率大大降低。
注意:Try.SRC / Try.SNK 仅在连接建立前的tDRP时间内生效。一旦角色稳定下来,后面再有PD通信去协商供电方向,那属于另当别论。
4.4 角色切换过程中的关键时序
- tDRP(默认约50ms~100ms):DRP在该窗口内决定角色。
- tDRPHold(~1.5ms):DRP切换角色前的稳定时间。
- tTry.SRC(最短440ms):Try.SRC设备尝试建立DFP角色的超时时间。
- tTry.SNK(最短440ms):Try.SNK设备尝试建立UFP角色的超时时间。
我记得有一个客户的项目,DRP设备连上Try.SRC设备后,总是先切换为UFP,好几秒后才切回DFP。后来一查,就是tTry.SRC超时设置偏大,导致状态机卡在UFP上没及时转回。
实操建议:做合规测试时,一定要用协议分析仪抓取CC线和VBus的波形,确认角色切换是否在规范规定时间窗口内完成。
4.5 SVG:角色识别与Try.SRC/Try.SNK核心流程
下面这张图展示了DRP设备如何通过Try.SRC/Try.SNK机制决定最终角色:
4.6 合规测试中的常见问题
- DRP角色锁定失败:我曾在项目中遇到过DRP设备一直处于摇摆状态,始终无法稳定为DFP或UFP。原因是CC线上有额外的电容导致RC常数异常,使CC电压无法在规定时间内达到阈值。
- tTry.SRC超时计算:有些设计把tTry.SRC设成440ms,但内部软件调度再消耗几十毫秒,结果总超时超过500ms。规范要求必须在440ms内完成尝试,否则对面会认为不存在有效连接。
- 角色切换后VBus供电延迟:DFP角色确定后,VBus必须在某一时间窗口内升到5V。我记得有一次发现VBus升压慢了,导致下游设备还没来得及醒,DRP又在切角色,形成死循环。
避坑指南:我之前调试一个多口充电器,其中一口连上手机后角色不停翻转。用USB分析仪抓CC波形,发现两个口居然共用了一个CC信号线,相当于两个DFP互相串扰。拆板后单独走线就解决了。
警告:DRP设备在没有检测到对面时,不能主动升VBus。如果DFP角色还没确认就提前升压,轻则短路,重则烧坏接口。合规测试中有一条专门测这个:DRP_SRC_VBus.Rise。
4.7 总结角色识别的要点
- DFP/UFP/DRP的本质由CC线电阻状态(Rp/Rd)决定,不要全靠软件去区分。
- Try.SRC/Try.SNK是一种“偏好”,不是角色。最终角色仍需协商。
- 角色切换时序是合规测试的高频失分项,必须掐着规范的时间窗口来。
- DRP设备设计时,注意给CC线路预留足够的去耦和抗干扰措施。