Part Number: INA226
Other Parts Discussed in Thread: MSP430FR4133
I have a problem with reading INA226 registers.
void INA226_ReadReg(uint32_t slave_adr, uint8_t reg_addr, uint16_t *value)
{
uint8_t val[2];
/*----------first step - set register address to read from-----------*/
//for a write operation R/Wn bit should be low
uint8_t slave_address = slave_adr & 0xFE;
I2C0_Start();
/* send slave address with W/R bit */
I2C0_write_byte(slave_address);
I2C0_Wait();
/* set register address */
I2C0_write_byte(reg_addr);
I2C0_Wait();
/*-----------second step - read from the written register address-----*/
//slave address for read
slave_address = slave_adr | 0x01;
//I2C0_Start();
I2C0_RepeatedStart();
I2C0_write_byte(slave_address);
I2C0_Wait();
// Put in Rx Mode
I2C0_C1 &= ~I2C_C1_TX_MASK;
// Ensure TXAK bit is 0
I2C0_C1 &= ~I2C_C1_TXAK_MASK;
// Turn off ACK since this is second to last byte being read
//I2C0_C1 |= I2C_C1_TXAK_MASK;
// Dummy read - why???
val[0] = I2C0_D;
I2C0_Wait();
val[0] = I2C0_D;
I2C0_Wait();
//disable aknowledge
I2C0_C1 |= I2C_C1_TXAK_MASK;
val[1] = I2C0_D;
I2C0_Wait();
I2C0_Stop();
*value = (val[0] << 8) | val[1];
}
This way I read the right values from INA226_MANUFACTURE_ID(0x5449) and INA226_DIE_ID(0x2260) registers.
As you can see I need a dummy read to get it right.
But when I trigger a measurement and then read the voltage, shunt, current registers - I get some wrong values.
What's wrong with my register reading algorithm?
