Troubleshooting
Symptoms you may see while bringing up a PF1550, their causes and the fix for each, cheapest check first.
Start with GetErrorFlags() after a failing call: DeviceNotFound or I2cRead / I2cWrite point at the bus,
WrongDeviceId at the device, InvalidParam at the arguments, ProfileApply at a write the chip refused.
The chip does not answer
Symptom
Cause
Fix
EnsureInitialized() fails with DeviceNotFound
No ACK at 0x08
Check the pull-ups to VDDIO, SDA and SCL not swapped, a common ground
Same, and the SDK logs an address of 0x10
8-bit address passed to a 7-bit API
Pass 0x08; shift only inside your port if the SDK wants it
Same, on a programmed part
OTP selects another address (0x09 to 0x0F)
Scan the bus and pass the address to the constructor
WrongDeviceId
Another device answers at 0x08, or DEVICE_ID is not 0x7C
Read ReadDeviceId(); a PF1500 reads 0x78
Errors at high bus speed
Clock above 400 kHz, or edges faster than 20 ns
Run at 400 kHz or less; lower the master's drive strength
The ESP32 example reports no device
Nothing wired, or the wrong pins
Expected without hardware; otherwise check Kconfig PF1550_I2C_SDA_GPIO / SCL_GPIO
Writes do not change the rails
Symptom
Cause
Fix
SetSwVoltage() / SetSwVoltageMv() return false
SW3, or an SW1 / SW2 declared DVS-disabled: those voltage registers are read-only. Or the voltage is off the DVS grid
Change the set point in OTP, or declare DVS with SetSwDvsEnabled() if the part has it (Rails and OTP )
A rail reads far below the expected voltage
A DVS-disabled code written with WriteRegister() to a DVS-enabled SW1 / SW2 (0x07 is 0.6875 V there)
Use SetSwVoltageMv(); declare the mode with SetSwDvsEnabled()
A profile change has no effect after a reset
The PMIC kept the previous values: an MCU reset does not reset it
Power the PMIC down completely, then apply the profile again
The snapshot shows the old values after a profile
The profile stopped at a failed write
Check the return value and ProfileApply; the writes before it did happen
SetVbusCurrentLimitMa() returns false
The value is not 10, 100, 500, 1000 or 1500 mA
Write VBUS_INLIM_CNFG with code << 3 for other Table 58 values
Board symptoms (Portenta H7 and carriers)
Symptom
Cause
Fix
Carrier +3V3 or JTAG VTref is 0 V while the processor runs
SW2 is off; with the default profile it also turns off in STANDBY
Apply the carrier profile (SW2_CTRL = 0x0F)
LDO outputs are dead but the processor runs
The LDO inputs hang off SW1, which is not up yet
Use the carrier profile: SW1 first, then a 5 ms wait
USB does not enumerate after boot
USB_VBUS_EN / USB_OTG_EN low, or STANDBY high
SetPowerMode(PowerMode::Run) and SetUsbRails(true, true) before USB starts
The rails drop when the board idles
STANDBY asserted, and the rail's STBY_EN bit is clear
Drive STANDBY low, or set kStbyEn in the rail's control register
Faults and self-test
Symptom
Cause
Fix
A fault comes back right after ClearLatchedFaults()
The cause is still there
Read the SENSE register for the live state
INTB never goes low
Every interrupt is masked (the reset value)
SetInterruptMaskAll(false), or unmask one group
What software cannot check
Measure the rails, VBUS / OTG behaviour on USB-C and the I2C waveforms under load with instruments; the snapshot
reports set points and status bits, not voltages.