第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.SRCDRP开局先尝试做DFP(即SRC),如果对面响应,则固定为DFP角色。笔记本的Type-C口自带电源输出意图
Try.SNKDRP开局先尝试做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 角色切换过程中的关键时序

  1. tDRP(默认约50ms~100ms):DRP在该窗口内决定角色。
  2. tDRPHold(~1.5ms):DRP切换角色前的稳定时间。
  3. tTry.SRC(最短440ms):Try.SRC设备尝试建立DFP角色的超时时间。
  4. 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机制决定最终角色:

端口角色与Try.SRC/Try.SNK流程 DRP 初始未连接 Try.SRC(先做DFP) Try.SNK(先做UFP) 检测对面是否为UFP (CC:Rp → Rd?) 检测对面是否为DFP (CC:Rd → Rp?) 角色协商完成 稳定为DFP(SRC) 供电方 DRP固定(无偏好) 按CC状态动态切换 稳定为UFP(SNK) 受电方 说明: Try.SRC/Snk只是首次连接时的“提议”,后续PD协议还可以通过PR_Swap再翻转角色。 合规测试中需要验证tTry.SRC/tTry.SNK的超时时间,以及无偏好DRP的周期性摇摆是否在规范内。

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线路预留足够的去耦和抗干扰措施。