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?