USB Type-C的插座中有两个CC脚,角色检测都是通过CC脚进行的,但是对于插头或者线缆正常只有一个CC引脚,两个端口连接在一起之后,只存在一个CC引脚连接,通过检测哪一个CC有连接,就可以判断连接的方向。如果USB线缆中有需供电的器件,其中一个CC引脚将作为VCONN供电。
第一阶段
主要通过 CC 引脚的电阻配置和电平变化完成设备识别与基础参数确认,具体可分为以下几个关键步骤:
- 硬件基础:Type-C 接口的两端(如主机和设备)分别在 CC 引脚上配置了特定电阻:
- Source(供电方,如充电器 / 电脑):在 CC 引脚上串联 Rp 电阻(通常为 56kΩ),并通过 Rp 提供约 0.5V 的基准电压。
- Sink(受电方,如手机 / 耳机):在 CC 引脚上并联 Rd 电阻(通常为 10kΩ)。
- 检测逻辑:
- 当设备插入时,Source 的 CC 引脚通过 Rp 输出电压,若 Sink 的 Rd 电阻接入,会将 CC 引脚电压拉低(从 0.5V 降至约 0.3V)。
- Source 通过检测 CC 引脚的电压变化,确认有 Sink 设备接入;反之,Sink 也通过检测电压变化确认连接建立。
- 硬件设计:Type-C 接口有两个 CC 引脚(CC1 和 CC2),但插头插入时只会导通其中一个(由插入方向决定)。
- 识别过程:
- Source 同时监测 CC1 和 CC2 的电压:若只有 CC1 被拉低,说明是正向插入;若只有 CC2 被拉低,说明是反向插入。
- 系统根据导通的 CC 引脚确定数据引脚的映射关系(正反插时数据引脚会镜像切换),确保信号传输正确。
- 电源角色确定:
- 通过 Rp(Source)和 Rd(Sink)的电阻配置,双方默认确定初始角色:带 Rp 的为供电方,带 Rd 的为受电方。
- 默认供电能力协商:
- Source 通过 Rp 的阻值细分(如 Rp1/Rp2/Rp3)告知默认供电电流(如 5V/0.5A、5V/1.5A、5V/3A)。
- Sink 通过 Rd 检测这些电流能力,并根据自身需求选择合适的供电档位(默认从最低电流开始)。
- 若连接中使用 Type-C 线缆,线缆内部的 E-Marker 芯片(若有)会通过 CC 引脚传递信息:
- 线缆类型(如 USB 2.0/3.2/4.0、是否支持雷电)。
- 最大电流承载能力(如 3A、5A)。
- 是否支持 USB PD 协议等。
- 若无线缆或线缆无 E-Marker,则默认按基础规格(如 USB 2.0、3A 电流)工作。
数据角色确定
第一阶段确定的电源角色(Source/Sink)会默认关联数据角色:
- 通常情况下,电源角色为 Source(供电方)的设备(如电脑、充电器)会默认作为数据 Host(主机);
- 电源角色为 Sink(受电方)的设备(如手机、U 盘)会默认作为数据 Device(从设备)。
这种关联是一种 "默认约定",而非通过 CC 引脚明确协商的结果。
两端设备在 CC 引脚上都串联了 Rp 电阻
在 USB Type-C 连接的第一阶段,如果两端设备在 CC 引脚上都串联了 Rp 电阻(理论上可能出现,比如两个支持双角色的设备连接时),系统会通过 **"角色协商"(Role Negotiation)机制 ** 来确定最终的 Source(供电方)和 Sink(受电方),具体逻辑如下:
Rp 电阻是 Type-C 设备支持 "双角色"(Dual Role Port,DRP)的标志。DRP 设备(如现代手机、笔记本电脑)可以动态切换电源角色(既可以做 Source 供电,也可以做 Sink 受电),因此会在 CC 引脚上配置 Rp 电阻,同时具备检测和切换角色的能力。
当两个 DRP 设备(都带 Rp)连接时,就会出现两端 CC 引脚都有 Rp 电阻的情况。
此时,双方会通过 **"试探 - 响应" 机制 ** 确定最终角色,过程如下:
- 初始状态:两端均以 "默认 Sink" 模式监听 CC 引脚(暂时将自己视为受电方)。
- 试探阶段:
- 设备 A 先主动切换为 Source 模式(通过 Rp 输出电压),同时监测 CC 引脚电压。
- 设备 B 此时仍为 Sink 模式(通过 Rd 电阻检测),若检测到 CC 引脚有电压输入,会保持 Sink 角色。
- 设备 A 检测到 CC 引脚电压被拉低(因设备 B 的 Rd),确认自己作为 Source。
- 确认阶段:
- 若双方都短暂切换为 Source 试探,最终会通过时序优先级(谁先完成试探并检测到对方的 Sink 状态)确定角色。
- 一旦一方确定为 Source,另一方会自动保持 Sink 角色,避免冲突。
第二阶段 - PD协商
第一阶段(基于 CC 引脚的物理层协商)完成后,USB Type-C 设备会进入更复杂的协议层协商阶段,主要围绕电源扩展、数据角色切换和功能模式选择展开,核心依赖USB PD(Power Delivery)协议和USB 基础协议栈,具体流程如下:
PD 协商是通过 CC 引脚进行双向半双工通信(BMC 编码)
如果双方支持 PD 协议(通过第一阶段检测到 E-Marker 线缆或设备自身能力),会启动 PD 协商,主要解决:
1. P首先发起PD协商,向C发送P具有的Power能力的消息,也就是P支持哪些功率类型
2. C收到P发送的Power能力的消息后,分析P的Power能力并选择其中一个Power配置发送给P
3. P收到C请求的power配置,决定是否接受这个请求
4. 切换到C请求的Power配置并通知C
根据设备类型和线缆能力,协商具体的数据传输协议:
- 实时监测:PD 协议会定期发送 "心跳消息"(GoodCRC)确认连接状态。
- 动态调整:若受电方需求变化(如手机充电到 80% 后降低电流),可重新发起协商请求。
- 异常处理:若协商失败或连接中断,会回退到第一阶段的默认状态(如 5V 供电、基础 USB 模式)。
echo host > /sys/class/typec/port0/data_role
echo device > /sys/class/typec/port0/data_role
cat /sys/class/typec/port0/data_role
echo source > /sys/class/typec/port0/power_role
echo sink > /sys/class/typec/port0/power_role
cat /sys/class/typec/port0/power_role
echo host > /sys/class/typec/port0/data_role
rmmod usb_f_acm
/app/scripts/usb_switch_host
modprobe aoa
ip addr add 192.168.1.1/24 dev aoa0