axp173-rs icon indicating copy to clipboard operation
axp173-rs copied to clipboard

Device-agnostic X-Powers AXP173 power management IC driver

axp173

CI

What is this?

This is a embedded-hal driver for X-Powers' Power Management IC AXP173.

It's device-agnostic and uses embedded-hal's Write/WriteRead for I2C communication.

Usage

  1. Add dependency to Cargo.toml:

    cargo add axp173
    
  2. Instantiate and init the device:

    // ... declare and configure your I2c peripheral ...
    
    // Init AXP173 PMIC
    let axp173 = axp173::Axp173::new(i2c);
    axp173.init()?;
    Ok(axp173)
    
  3. Configure the PMIC

    // Set charging current to 100mA
    axp173
        .set_charging_current(ChargingCurrent::CURRENT_100MA)?;
    
    // Enable internal ADCs
    // 25Hz sample rate, Disable TS, enable current sensing ADC
    axp173
        .set_adc_settings(
            AdcSettings::default()
                .set_adc_sample_rate(AdcSampleRate::RATE_25HZ)
                .ts_adc(false)
                .set_ts_pin_mode(TsPinMode::SHUT_DOWN)
                .vbus_voltage_adc(true)
                .vbus_current_adc(true)
                .batt_voltage_adc(true)
                .batt_current_adc(true),
        )?;
    
    // Enable battery gas gauge
    axp173.set_coulomb_counter(true)?;
    axp173.resume_coulomb_counter()?;
    
    // Power-off the device after 4 seconds of
    // long press of power button
    axp173.set_shutdown_long_press_time(ShutdownLongPressTime::SEC_4)?;
    
    // Clear pending IRQs and enable some interesting IRQs
    axp173.clear_all_irq()?;
    axp173.set_irq(axp173::Irq::ButtonShortPress, true)?;
    axp173.set_irq(axp173::Irq::BatteryCharged, true)?;
    axp173.set_irq(axp173::Irq::VbusPluggedIn, true)?;
    
  4. Handle PMIC IRQs:

    // Inside an IRQ ISR:
    if axp173.check_irq(Irq::ButtonShortPress)? {
        axp173.clear_irq(Irq::ButtonShortPress)?;
        defmt::info!("Button pressed");
    }
    axp173.clear_all_irq()?; // Clear everything else
    

Status

What is done and tested and what is not yet:

  • [x] Coulomb counter reading
  • [x] Coulomb counter control
  • [x] IRQs
  • [x] Battery voltage & current readings
  • [x] VBUS voltage & current readings
  • [x] AXP173 on-chip buffer
    • [x] Reading
    • [x] Checking default values
    • [x] Writing
  • [x] AXP173 LDO2, LDO3, LDO4 enable/disable
  • [x] LDO voltage setup
  • [x] VBUS presence
  • [x] Battery presence
  • [x] Battery charging status
  • [x] Charging current setup
  • [x] Charging regulated voltage setup
  • [x] Internal ADC settings:
    • [x] Sample rate
    • [x] Enable/Disable various ADC channels (batt. voltage, current, etc.)
  • [x] Button settings
  • [ ] DC/DC settings
  • [ ] Temperature sensor readings
  • [ ] Instantaneous battery power reading