summaryrefslogtreecommitdiff
path: root/fw/ina226.h
diff options
context:
space:
mode:
Diffstat (limited to 'fw/ina226.h')
-rw-r--r--fw/ina226.h108
1 files changed, 108 insertions, 0 deletions
diff --git a/fw/ina226.h b/fw/ina226.h
new file mode 100644
index 0000000..ffb9f54
--- /dev/null
+++ b/fw/ina226.h
@@ -0,0 +1,108 @@
+#ifndef __INA226_H__
+#define __INA226_H__
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <limits.h>
+#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__ */