nRF9151 VBUS识别问题
问题描述
- 都是基于我的工程来描述
- 存在几个方面的问题
- 当关机的时候,连接充电线,自动启动,无法识别到当前VBUS连接;或者使用Jlink复位,也无法识别到VBUS连接
- 充电状态也会异常,当我使用nordic电量计生成了对应的电池库,然后导入充电后,总是会出现充电错误的情况
- LED显示也由于pmic_run_params.vbus_connected导致异常
原因分析
在pmic初始化代码中,通过sensor_attr_get(charger, SENSOR_CHAN_CURRENT, SENSOR_ATTR_UPPER_THRESH, &val);来初始化检测VUBS,这个也是官方的用例提供的
但是实际上并没有读取到VBUS的状态
通过向下检索,/zephyr/drivers/sensor/nordic/npm13xx_charger/npm13xx_charger.c
npm13xx_charger_attr_get
{
case SENSOR_CHAN_CURRENT:
if (attr != SENSOR_ATTR_UPPER_THRESH) {
return -ENOTSUP;
}
ret = mfd_npm13xx_reg_read(config->mfd, VBUS_BASE, VBUS_OFFSET_DETECT, &data);
if (ret < 0) {
return ret;
}
}
实际上时读取VBUS_BASE下的VBUS_OFFSET_DETECT寄存器
然后通过查询规格书PM1300规格书关于VBUS描述
| 参数 | 值 |
|---|---|
| Channel | SENSOR_CHAN_CURRENT |
| Attribute | SENSOR_ATTR_UPPER_THRESH |
| 读取的寄存器 | VBUS_BASE(0x02) + VBUS_OFFSET_DETECT(0x05) = 地址 0x0205 |
| 寄存器名称 | VBUS DETECT |
| 寄存器功能 | USB Type-C CC(Configuration Channel)检测 |
![]() |

通过上面就可以得出结论,这个通过CC来检测线缆的类型,也就是检测cc上信号来判断是否连接
但是由于设置我留的时串口pin,不是cc pin,并没有cc pin,所以检测失败
所以上面的初始化代码驱动据此输出 0 µA → val.val1 = 0, val.val2 = 0
到这pmic_run_params.vbus_connected判断失败,造成一系列影响
对于充电的影响fuel_gauge_update() 中使用了 vbus_connected 来向 fuel gauge 库上报 VBUS 状态:
nrf_fuel_gauge_ext_state_update(
params->vbus_connected ? NRF_FUEL_GAUGE_EXT_STATE_INFO_VBUS_CONNECTED
: NRF_FUEL_GAUGE_EXT_STATE_INFO_VBUS_DISCONNECTED,
NULL);
错误的状态可能导致 fuel gauge 电量估算不准确。
修复方案
同样通过查询nPM1300的规格书,查询到
| 参数 | 值 |
|---|---|
| Channel | SENSOR_CHAN_NPM13XX_CHARGER_VBUS_STATUS |
| Attribute | SENSOR_ATTR_NPM13XX_CHARGER_VBUS_PRESENT |
| 读取的寄存器 | VBUS_BASE(0x02) + VBUS_OFFSET_STATUS(0x07) = 地址 0x0207 |
| 寄存器名称 | VBUS STATUS |
| 检查的位 | STATUS_PRESENT_MASK(bit 0) = VBUS_PRESENT |
![]() | |
![]() | |
| VBUS_PRESENT直接反应了VBUS引脚上是否有电压,比依赖于CC检测,兼容所有类型的充电线缆 |
修改代码
-
添加头文件:
#include <zephyr/drivers/sensor/npm13xx_charger.h> -
替换 VBUS 初始化检测:
/* Initialise vbus detection status. * 使用 VBUS STATUS 寄存器的 VBUS_PRESENT 位来判断 VBUS 是否连接, * 而非 VBUS DETECT 寄存器(CC 检测)。STATUS 寄存器直接反映 * VBUS 引脚电压存在状态,不依赖 USB Type-C CC 线,兼容性更好。 */ struct sensor_value val; int ret = sensor_attr_get(charger, SENSOR_CHAN_NPM13XX_CHARGER_VBUS_STATUS, SENSOR_ATTR_NPM13XX_CHARGER_VBUS_PRESENT, &val); if (ret < 0) { printk("Failed to read VBUS status: %d\n", ret); pmic_run_params.vbus_connected = false; } else { pmic_run_params.vbus_connected = (val.val1 != 0); }
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 活着死去
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果




