网上看到有人提出一个问题,如果将两台手机的typec通过tpyec-typec cable相连,是否可以实现一台手机给另一台手机充电,充电方向是怎样的。
我自己试了一下,将两台typec手机(QC3.0快充协议)对插,确实可以实现一台给另一台充电,但是初始充电方向并不是由电量多少(电池电压)决定的,连续多次插拔typec,初始充电主从状态随机出现,之后可以通过系统内设置usb选项来自由切换充电主从。
查了很多博客和科技文章,感觉没有说的特别清楚的,最后去USB网站上把typec的spec拉下来一看,什么都写的清清楚楚。所以想要搞清楚一个问题,踏踏实实啃spec吧,别想着有人嚼碎了直接喂你。
直接贴引脚定义:
VBus :总线电源,USB PD协议可配置电压,最大20V 5A
GND :地线
TxRx :Tx1 Rx1 Tx2 Rx2 两组数据传输信号,USB3.1标准
CC :CC1和CC2,两个关键引脚,作用很多:
探测连接,区分正反面,区分DFP和UFP,也就是主从(虽然typec支持正反插,但typec的点定义并不完全对称,比如Rx1,翻转插头再插入就是Rx2,所以需要系统识别插头的正反插情况,用来正确配置Tx和Rx的连接通讯,虽然定义里有CC1和CC2,但是线缆里只有一根cc线,正反插可以连接不同的引脚,通过读取上下拉电平,从而识别插头的方向);
配置Vbus,有USB Type-C和USB Power Delivery两种模式;
配置Vconn,当线缆里有芯片的时候,一个cc传输信号,一个cc变成供电Vconn,用来给线缆里的芯片供电(3.3V或5V);
配置其他模式,如接音频配件时,DP,PCIe时;
D+D- :用来兼容USB2.0协议的数据传输,音频复用时也是L R信号
SBU :复用引脚,和usb协议本身关系不大,复用为其他端口时使用
接下来就是一开始提出的问题,两台手机用typec对插,是否能一台给另一台充电。
Type-C设备role分为host和device,对应充电过程中的source和sink。有三种形式:DFP(Downstream Facing Port)、UFP(Upstream Facing Port)和DRP(Dual Role port)。DFP只能做Source,CC线上拉电阻Rp;UFP只能做Sink,CC线下拉电阻Rd;DRP两者都能做,通过switch切换Rp Rd。比如一般充电器是DFP,U盘是UFP,手机是DRP。
所以,我们的问题就是,两个DRP端口相连,怎样分配role?
USB端口交互行为:
首先明确几个状态,是我自己的理解:
source角色在未连接时的状态Unattached.SRC,一旦检测到CC线连接下拉电阻,进入AttachWait.SRC状态,持续检测下拉电阻,经过tCCDebounce时间,然后进入正式source连接状态Attached.SRC,并打开Vbus和Vconn。
sink角色在未连接时的状态Unattached.SNK,一旦检测到CC线连接上拉电阻,进入AttachWait.SNK状态,经过tCCDebounce时间后,检测到了source打开的Vbus,之后进入正式sink连接状态Attached.SNK,
接下来是几种角色端口的交互行为。
Source 到 Sink :
引用TypeC SPEC:
简单描述一下就是,source和sink通过typec连接后,source通过CC检测到sink的下拉电阻Rd,认为有sink连接,source打开VBUS和VCONN(在另一条CC上),双方建立连接,并且source可以通过调整上拉电阻Rp的大小来控制vRd的电压值,sink通过检测vRd的大小从而得知sink能从vbus上拉多大的电流。
Source?到 DRP
引用TypeC SPEC:
DRP在未建立连接前,会不断切换连接上下拉电阻Rp和Rd(具体切换细节在下面分解)。
source和DRP通过typec连接后,在DRP连接Rd时,source通过CC检测到Rd,之后打开VBUS和VCONN;DRP检测到source的Rp,之后等source打开Vbus后,确认转换为sink,并正式建立连接。
DRP 到 Sink
情况与上一种情况类似,不再赘述。
DRP 到 DRP
此种情况最为复杂,因为DRP也可以分为三种角色,普通DRP,DRP try source,DRP try sink,即有些DRP,在DRP之间的连接中,会有prefer的角色,比如笔记本和手机,肯定都是DRP,但是笔记本可能会设定为try source,因为笔记本毕竟电池容量比较大,如果将笔记本和手机相连,最好还是笔记本作为source给手机充电,而不要反过来,但是笔记本与墙插充电器相连时,笔记本肯定是sink。
在typec spec中,DRP和DRP相连的行为中,提到了3个case,case2和case3就是有一方DRP是try source或try sink的情况,这两种情况比较复杂,这里不展开了,有兴趣可以详细查阅,这里只给出case1,两个普通DRP之间相连的情况。
未正式建立连接时,两个DRP都在各自不断切换上下拉电阻,当有一时刻,DRP1是上拉电阻,DRP2是下拉电阻状态,然后接下来就和Source 到 Sink的情况是一样的。因为两个DRP状态是不断切换的,所以连接时刻的DRP各自的状态就决定了连接后的主从关系,当然如果某一时刻两个DRP都是上拉或下拉,那连接行为最终会失败,DRP重新进入不断切换状态等待连接。
那是否会有一种极端情况,两个DRP切换状态太同步了,一直是同上拉,同下拉,那这两个DRP是不是就一直不能连接了,这就涉及到了DRP切换周期的问题。
还是回溯到SPEC中:
可以看出,SPEC定义了DRP 切换source和sink的一个完整swap周期为tDRP,其中dcSRC.DRP为整个周期中DRP作为source的百分比。SPEC明确说明了,用于控制这个周期和百分比的时钟,不能来自于一个特别准确的时钟源如晶振或陶瓷晶振等,以此来最小化两个DRP在配对过程中出现无限失败的问题。而对于各周期的上下限也非常宽裕,所以实际情况下各DRP的周期会不尽相同,不会出现两个DRP切换周期一直同步而导致的配对过程无限fail的情况。
所以结论是,两个DRP连接结果是主从随机的,这也符合我一开始用两台手机试验的结果。
以上过程其实只是底层硬件上连接的一个初始化状态,正如我实际试验中所提到的,在初始充电状态确认之后,可以通过系统软件设置来切换充电的主从,两个手机也可以互相切换读取对方的文件,这个就涉及到了更上层软件的协议。
可以看到,通过PD协议可以切换充电的source/sink,可以切换数据的DFP和UFP,也可以切换由谁来提供线缆电压Vconn。由于软件层面的内容较多,目前阶段不再继续深入研究。
最后挖个坑等填,下一篇我想还是和手机充电相关,聊一聊目前最流行的两种快速充电协议,PD和QC。
参考引用资料:
USB Type-C Specification Release 1.3
两台TYPE-C手机连接可以互相充电吗,怎么实现?
USB Type-C 如何决定充电方向?
一次失败的USB Type C告白
细谈USB Type-C