#ifndef __INA226_H__ #define __INA226_H__ #include #include #include #include "i2c.h" /* Fixed values from datasheet */ #define INA226_VB_LSB_uV 1250 #define INA226_VS_LSB_nV 2500 enum ina226_reg { INA226_REG_CONFIG = 0x00, INA226_REG_VS = 0x01, INA226_REG_VB = 0x02, INA226_REG_P = 0x03, INA226_REG_I = 0x04, INA226_REG_CAL = 0x05, INA226_REG_MASK_EN = 0x06, INA226_REG_ALERT = 0x07, INA226_REG_MFGID = 0xfe, INA226_REG_DIEID = 0xff }; enum ina226_config { INA226_CONFIG_RST = 1<<15, INA226_CONFIG_AVG_Pos = 9, INA226_CONFIG_AVG_Msk = 3<<9, INA226_CONFIG_AVG_1 = 0<<9, INA226_CONFIG_AVG_4 = 1<<9, INA226_CONFIG_AVG_16 = 2<<9, INA226_CONFIG_AVG_64 = 3<<9, INA226_CONFIG_AVG_128 = 4<<9, INA226_CONFIG_AVG_256 = 5<<9, INA226_CONFIG_AVG_512 = 6<<9, INA226_CONFIG_AVG_1024 = 7<<9, INA226_CONFIG_VBUSCT_Pos = 6, INA226_CONFIG_VBUSCT_Msk = 7<<6, INA226_CONFIG_VBUSCT_140u = 0<<6, INA226_CONFIG_VBUSCT_204u = 1<<6, INA226_CONFIG_VBUSCT_332u = 2<<6, INA226_CONFIG_VBUSCT_588u = 3<<6, INA226_CONFIG_VBUSCT_1m1 = 4<<6, INA226_CONFIG_VBUSCT_2m116 = 5<<6, INA226_CONFIG_VBUSCT_4m156 = 6<<6, INA226_CONFIG_VBUSCT_8m244 = 7<<6, INA226_CONFIG_VSHCT_Pos = 3, INA226_CONFIG_VSHCT_Msk = 7<<3, INA226_CONFIG_VSHCT_140u = 0<<3, INA226_CONFIG_VSHCT_204u = 1<<3, INA226_CONFIG_VSHCT_332u = 2<<3, INA226_CONFIG_VSHCT_588u = 3<<3, INA226_CONFIG_VSHCT_1m1 = 4<<3, INA226_CONFIG_VSHCT_2m116 = 5<<3, INA226_CONFIG_VSHCT_4m156 = 6<<3, INA226_CONFIG_VSHCT_8m244 = 7<<3, INA226_CONFIG_MODE_Pos = 0, INA226_CONFIG_MODE_Msk = 7, INA226_CONFIG_MODE_POWERDOWN = 0, INA226_CONFIG_MODE_SHUNT = 1, INA226_CONFIG_MODE_BUS = 2, INA226_CONFIG_MODE_TRIG = 0, INA226_CONFIG_MODE_CONT = 4 }; enum ina226_mask_en { INA226_MASK_EN_SOL = 1<<15, INA226_MASK_EN_SUL = 1<<14, INA226_MASK_EN_BOL = 1<<13, INA226_MASK_EN_BUL = 1<<12, INA226_MASK_EN_POL = 1<<11, INA226_MASK_EN_CNVR = 1<<10, INA226_MASK_EN_AFF = 1<<4, INA226_MASK_EN_CVRF = 1<<3, INA226_MASK_EN_OVF = 1<<2, INA226_MASK_EN_APOL = 1<<1, INA226_MASK_EN_LEN = 1<<0 }; struct ina226 { I2C_TypeDef *i2c_periph; uint8_t i2c_addr; uint16_t rs_uOhm; uint16_t conv_config; uint16_t i_lsb_uA; bool conv_ready:1; }; /* High-level API */ void ina226_init(struct ina226 *dev, I2C_TypeDef *i2c_periph, uint8_t i2c_addr, uint16_t rs_uOhm, uint16_t conv_config); void ina226_trigger(struct ina226 *dev, int mode); bool ina226_conv_ready(struct ina226 *dev); int ina226_read_raw(struct ina226 *dev, int16_t *I_raw, int16_t *V_raw, int16_t *Vs_raw); int ina226_read_scaled(struct ina226 *dev, int16_t *I_mA, int16_t *V_mV, int16_t *Vs_uV); /* Low-level API */ void ina226_write_reg(struct ina226 *dev, uint8_t reg, uint16_t val); uint16_t ina226_read_reg(struct ina226 *dev, uint8_t reg); #endif /* __INA226_H__ */