BC1.2快充协议介绍

BC1.2定义

BC1.2 (Battery Charging v1.2)是USB-IF下属的BC(Battery Charging)小组制定的协议,主要用于规范电池充电的需求,该协议最早基于USB2.0协议来实现。

 

BC1.2充电端口

USB2.0协议规定外设从USB充电器抽取电流的最大值为500mA,500mA的电流限制无法满足日益增长的快充需求。因此,BC1.2引入了充电端口识别机制,主要包括以下几个USB端口类型:

1.标准下行端口(SDP)

SDP端口支持USB协议,最大电流500mA,可以认为SDP就是普通的USB接口

2.专用充电端口(DCP)

DCP不支持数据协议,支持快充,可以提供大电流,DCP主要用于墙充等专用充电器

3.充电下行端口(CDP)

CDP既支持数据协议也支持快充

 

BC1.2协议识别过程

1、VBUS Detect Vbus 检测

PD(portable device,便携式设备)中有个检测VBUS是否有效的电路,电路有一个参考值,高于这个值就认为是VBUS有效了,参考值不固定一般在0.8V~4V之间

2、Data Contact Detect 数据连接检测

这个阶段不是必须的,因为USB端口可能支持数据协议也可能不支持。如果这个阶段超时900ms还没检测到D+或ID PIN的连接,就要求必须开始进行Primary Detection。

3、Primary Detection 首次检测

该阶段主要作用是判断端口是充电口还是数据口:

首先将PD+拉高至0.6V,然后检测PD-的电压,如果小于规定的参考电压则端口是数据口SDP;如果大于参考电压则是充电口CDP或者DCP。

4、Secondary Detection 二次检测

该阶段作用是确认充电口能否支持数据协议,即区分CDP和DCP:

首先将PD-拉高至0.6V,然后检测PD+的电压,如果小于规定的参考电压则端口是CDP;如果大于规定的参考电压说明端口是DCP。

 

下图是CDP端口的识别过程,经过首次检测后,进入二次检测阶段,首先将PD-拉高,然后判断PD+的电压小于参考电压0.4V,说明端口是CDP端口。

 

私有快充协议

由于BC1.2并非强制性协议,许多厂家基于BC1.2研发了自己的私有快充协议。比如高通的QC2.0/QC3.0,联发科的PE(Pump Express)/PE+。由于充电功率和电压电流相关P=UI,提高电压或者电流就可以提高充电功率,在电池容量一定的情况下,功率越大充电速度越快。高通的QC2.0/QC3.0和联发科的PE快充方案技术原理是一样的,都是通过增大充电电压来提高充电功率。

 

下图是高通High Voltage DCP协议识别过程,可以看出首次检测和二次检测符合BC1.2的规定,初始的VBUS电压为5V,在识别出DCP端口后将VBUS拉高至9V。QC2.0支持5V、9V、12V三挡电压,QC3.0在此基础上细分了电压档以200mV为一档,同时拓宽电压范围至3.6V~20V。

 

线损补偿

由U=IR 知道充电电流越大,USB充电线上的压降也就越大。尤其在车载设备上,随着USB线的增长或者充电电流的增大,到达手机端的电压很可能达不到5V,可以通过线损补偿来解决此类问题。

 

现状及发展趋势

 

现行快充技术主要分为两大阵营:低压快充高压快充

低压快充以OPPO的VOOC闪充为代表,通过增大充电电流的方式来提高充电功率。

优点:发热量小、能量转换效率高

缺点:硬件需要定制,成本高,兼容性差

高压快充以高通QC2.0为代表,其他厂家技术原理和高通一样都是基于BC1.2,通过增大充电电压来提高充电功率。

优点:兼容性好、继承性好、稳定

缺点:发热量大,能量转换效率低

目前高通的快充方案占领大部分市场,但是随着USB-IF组织推出PD协议(Power Delivery 功率传输协议),有望统一快充市场。PD充电协议最大功率可支持100W,能满足手机甚至笔记本的充电需求,PD支持双向电能传输和组网供电策略,最新的QC4.0已经支持PD快充协议。

 


参考:

https://blog.youkuaiyun.com/liglei/article/details/22852755

https://zhuanlan.zhihu.com/p/25588452

https://blog.youkuaiyun.com/stoic163/article/details/79291420

 

<think>好的,我现在需要帮助用户了解在Android设备上如何实现BC1.2协议的检测。首先,我要回顾一下BC1.2的基本知识。根据用户提供的引用,BC1.2协议检测的关键步骤是将D+和D-短路,当手机检测到这两根线连接在一起时,就会进入BC1.2电模式[^1]。所以,Android设备需要能够检测到D+和D-的状态变化。 接下来,我需要考虑Android系统如何获取电相关的信息。通常,Android系统通过内核提供的接口或者系统服务来获取硬件信息,比如电池状态、电类型等。用户可能需要访问这些系统服务或者读取特定的文件来获取协议的信息。 然后,关于具体的实现方法,可能需要使用Android的BatteryManager类。BatteryManager可以提供电状态、电源类型等信息。例如,检查电器类型是否为USB,或者是否有高电压模式。不过,BC1.2的具体检测可能需要更底层的访问,比如通过内核的sysfs接口读取D+和D-的状态。 根据引用[^4],BC1.2涉及到线损补偿,这可能与电电流和电压有关。但检测协议本身可能更多是硬件层面的识别。因此,Android应用可能需要依赖系统底层提供的API或者广播信息,如ACTION_BATTERY_CHANGED,来获取电状态的变化。 另外,用户提到的私有协议,如QC和PE,都是基于BC1.2的扩展,但它们可能有自己的检测机制。但用户的问题集中在BC1.2的检测,所以需要专注于标准协议的实现步骤。 可能的步骤包括: 1. 注册广播接收器监听电池状态变化。 2. 通过BatteryManager获取电器和电源的详细信息。 3. 检查是否有特定的电模式被激活,比如BC1.2对应的状态。 4. 可能需要访问系统文件,如/sys/class/power_supply/下的相关节点,读取D+和D-的状态。 但需要注意的是,普通应用可能没有权限访问底层系统文件,因此可能需要系统级权限或者使用特定的API。此外,不同设备厂商可能有不同的实现方式,导致兼容性问题。 总结下来,实现BC1.2检测可能需要以下步骤: - 监听电池状态广播。 - 使用BatteryManager检查电类型。 - 读取系统文件获取D+/D-状态(如果有权限的话)。 - 根据状态判断是否进入BC1.2模式。 同时,需要考虑Android版本差异和硬件差异,可能需要进行适配。此外,用户可能需要参考厂商的文档或SDK,尤其是涉及到硬件特定的实现时。</think>### Android实现BC1.2协议检测方法 #### 实现原理 BC1.2协议检测的核心是通过检测USB接口的$D+$和$D-$线路状态。当两线短路时(电压约0.4V),设备会触发BC1.2电模式。Android系统通过内核层驱动读取USB端口状态,并通过电源管理模块(如`BatteryManager`)上报电类型。 #### 实现步骤 1. **注册电池状态监听** 通过`BroadcastReceiver`监听`ACTION_BATTERY_CHANGED`广播,获取电状态: ```java IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); registerReceiver(batteryReceiver, filter); private BroadcastReceiver batteryReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); if (chargePlug == BatteryManager.BATTERY_PLUGGED_USB) { // 检测到USB电类型 } } }; ``` 2. **获取协议类型** 通过`BatteryManager`的`getIntProperty()`方法(Android 8.0+): ```java BatteryManager bm = (BatteryManager) getSystemService(BATTERY_SERVICE); int chargingType = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_TYPE); ``` 3. **系统文件检测(需root权限)** 读取`/sys/class/power_supply/usb/`目录下的状态文件: ```shell cat /sys/class/power_supply/usb/type # BC1.2设备可能显示"SDP"或"DCP" ``` 4. **电压/电流检测** 通过ADB命令获取实时电参数(需开发者模式): ```shell dumpsys battery | grep -E "USB Voltage|USB Current" ``` #### 协议判断逻辑 $$ \text{BC1.2模式} \iff \begin{cases} D+ = D- = 0.4V \pm 0.1V \\ I_{charge} \geq 500mA \end{cases} $$ 当满足上述条件时,系统会激活线损补偿机制[^4]。 #### 代码实现要点 ```kotlin fun checkBC12Compat(context: Context): Boolean { val bm = context.getSystemService(BATTERY_SERVICE) as BatteryManager return when { Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> { bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_TYPE) == BatteryManager.BATTERY_CHARGE_TYPE_DCP } else -> { // 兼容旧版本通过电电流判断 bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW) > 500_000 } } } ``` #### 兼容性说明 由于厂商可能修改协议实现,建议: 1. 优先使用Android官方API 2. 对华为/小米等厂商设备做特殊适配 3. 结合电压电流数据进行二次验证
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值