Title: nPM1300 BUCK enable fails on power-on reset — intermittent init failure for BUCK, LDO, and LIS2DW12 (nRF9151, NCS 2.9.0)
Board: Custom board — nRF9151 + nPM1300 + LIS2DW12 + RTC (all on same I2C bus) NCS Version: 2.9.0 Toolchain: nRF Connect for VS Code
Problem Description
I am experiencing intermittent initialization failures on power-on reset (POR) when the battery is connected. The failures include:
-
BUCK1and/orBUCK2regulator_enable()returning an error -
LDO1/LDO2enable failing -
nPM1300 charger / fuel gauge device not ready
-
LIS2DW12 accelerometer
device_is_ready()returningfalse
Key observation: If I remove the battery and wait 30–40 seconds before reconnecting, all devices initialize successfully every time. If I reconnect the battery immediately or within a few seconds, the failures occur intermittently.
Hardware Setup
-
nRF9151 SoC as host
-
nPM1300 PMIC connected via I2C
-
BUCK1 → 1.8V (nRF9151 core supply)
-
BUCK2 → 3.3V (peripheral supply)
-
LDO1 / LDO2 → 1.8V (load switches in LDSW mode)
-
LIS2DW12 accelerometer, RTC — all on the same I2C bus as nPM1300
Initialization Flow
The nPM1300 MFD and regulator drivers initialize automatically before main() via Zephyr's POST_KERNEL init (priorities 51/52). Application-level regulator configuration happens inside peripheral_init() called from main():
}
.....
Sensor init runs after peripheral_init():
void sensor_init(void)
{
check_lis2dw12();
check_max30001g();
}The nPM1300 charger and fuel gauge are accessed from a separate thread (dev_battery_level()), which runs concurrently with the main thread after 20 seconds.
Root Cause Hypothesis
The 30–40 second wait resolves the issue, which strongly suggests residual charge on the BUCK output capacitors from the previous session is preventing a clean BUCK restart on the next power-on reset. This matches the nPM1300 product specification behavior where active output capacitor discharge is disabled by default for the BUCK regulators. [nPM1300 BUCK]
What I Have Tried
1. Adding active-discharge to the devicetree overlay
npm1300_ek_buck1: BUCK1 {
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-init-microvolt = <1800000>;
active-discharge;
};Result: Build error in NCS 2.9.0:
'active-discharge' appears in BUCK1 but is not declared in 'properties:' in nordic,npm1300-regulator.yaml
The property is not supported in the NCS 2.9.0 binding for nordic,npm1300-regulator.
2. Using the Zephyr Regulator API at runtime
regulator_set_active_discharge(buck1, true);
regulator_set_active_discharge(buck2, true);
regulator_set_active_discharge(ldo1, true);
regulator_set_active_discharge(ldo2, true);Result: All four calls return -88 (-ENOSYS), meaning the set_active_discharge driver op is not implemented in the nPM1300 regulator driver in NCS 2.9.0. [Regulator API]
Questions
-
Is there a supported way to enable active discharge for the nPM1300 BUCK and LDO/LDSW outputs in NCS 2.9.0 (e.g., via direct I2C register write to
BUCKCTRL0RDISCHbit)? -
Which NCS version first introduced
set_active_dischargesupport for the nPM1300 regulator driver? -
Is there a recommended workaround for the power-on reset BUCK enable failure caused by residual capacitor charge, within NCS 2.9.0?
-
Is this related to any known nPM1300 anomaly (e.g., BUCK restart failure after reset with VBAT connected)?
Any guidance would be appreciated. Thank you.