#include
#include
#include
#include
#include
#include
#define INA266_DEFAULT_ADDR 0x40
#define INA266_REG_CURRENT 0x04
#define INA266_REG_CALIBRATION 0x05
#define INA266_REG_BUS_VOLTAGE 0x02
static void ina266_set_calibration(hosal_i2c_dev_t *i2c, uint16_t calibration_value)
{
uint8_t data[3];
data[0] = INA266_REG_CALIBRATION;
data[1] = (calibration_value >> 8) & 0xFF;
data[2] = calibration_value & 0xFF;
hosal_i2c_master_send(i2c, INA266_DEFAULT_ADDR, data, sizeof(data), 100);
}
static void ina266_init(hosal_i2c_dev_t *i2c)
{
uint16_t calibration_value = 335;
ina266_set_calibration(i2c, calibration_value);
}
static float ina266_read_current(hosal_i2c_dev_t *i2c)
{
uint8_t reg_addr = INA266_REG_CURRENT;
uint8_t data[2];
int16_t raw_current;
hosal_i2c_master_send(i2c, INA266_DEFAULT_ADDR, ®_addr, sizeof(reg_addr), 100);
hosal_i2c_master_recv(i2c, INA266_DEFAULT_ADDR, data, sizeof(data), 100);
raw_current = (data[0] << 8) | data[1];
float current = raw_current * 0.000152;
return current;
}
static float ina266_read_voltage(hosal_i2c_dev_t *i2c)
{
uint8_t reg_addr = INA266_REG_BUS_VOLTAGE;
uint8_t data[2];
int16_t raw_voltage;
hosal_i2c_master_send(i2c, INA266_DEFAULT_ADDR, ®_addr, sizeof(reg_addr), 100);
hosal_i2c_master_recv(i2c, INA266_DEFAULT_ADDR, data, sizeof(data), 100);
raw_voltage = (data[0] << 8) | data[1];
float voltage = raw_voltage * 0.00125;
return voltage;
}
int main(void)
{
static hosal_i2c_dev_t i2c0 = {
.config = {
.address_width = HOSAL_I2C_ADDRESS_WIDTH_7BIT,
.freq = 50000,
.mode = HOSAL_I2C_MODE_MASTER,
.scl = 12,
.sda = 3,
},
.port = 0,
};
hosal_i2c_init(&i2c0);
ina266_init(&i2c0);
for (;;)
{