问题描述

  • 都是基于我的工程来描述
  • 存在几个方面的问题
    1. 当关机的时候,连接充电线,自动启动,无法识别到当前VBUS连接;或者使用Jlink复位,也无法识别到VBUS连接
    2. 充电状态也会异常,当我使用nordic电量计生成了对应的电池库,然后导入充电后,总是会出现充电错误的情况
    3. 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描述

参数
ChannelSENSOR_CHAN_CURRENT
AttributeSENSOR_ATTR_UPPER_THRESH
读取的寄存器VBUS_BASE(0x02) + VBUS_OFFSET_DETECT(0x05) = 地址 0x0205
寄存器名称VBUS DETECT
寄存器功能USB Type-C CC(Configuration Channel)检测
Pasted image 20260611150716.png

Pasted image 20260611150755.png

通过上面就可以得出结论,这个通过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的规格书,查询到

参数
ChannelSENSOR_CHAN_NPM13XX_CHARGER_VBUS_STATUS
AttributeSENSOR_ATTR_NPM13XX_CHARGER_VBUS_PRESENT
读取的寄存器VBUS_BASE(0x02) + VBUS_OFFSET_STATUS(0x07) = 地址 0x0207
寄存器名称VBUS STATUS
检查的位STATUS_PRESENT_MASK(bit 0) = VBUS_PRESENT
Pasted image 20260611151505.png
Pasted image 20260611151624.png
VBUS_PRESENT直接反应了VBUS引脚上是否有电压,比依赖于CC检测,兼容所有类型的充电线缆

修改代码

  1. 添加头文件

    #include <zephyr/drivers/sensor/npm13xx_charger.h>
    
  2. 替换 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);
    }