STM32F103 reading INA219 register using I2C

Hello. I have been working with this INA219 chip for a while. I am able to read the output voltage and set the registers. But I am having troubles reading back the registers to check what I have written. I have been studying datasheet for a while and I still cant fully understand the process of reading the register. I am using HAL functions for i2c reads and writes. Link to datasheet: https://www.ti.com/lit/ds/symlink/ina219.pdf?HQS=TI-null-null-mousermode-df-pf-null-wwe&ts=1592890984516&ref_url=https%253A%252F%252Feu.mouser.com%252F

write and read functions:

void wireWriteRegister (uint8_t reg, uint16_t value)
{
	printf("register = %u, write value=%u \n",reg, value);
	uint8_t i2c_temp[2];
	i2c_temp[0] = value>>8;
	i2c_temp[1] = value;
	HAL_I2C_Mem_Write(&hi2c1, INA219_ADDRESS<<1, (uint16_t)reg, 1, i2c_temp, 2, 0xffffffff);

	//HAL_I2C_Mem_Write_IT(&hi2c1, INA219_ADDRESS<<1, (uint16_t)reg, 1, i2c_temp, 2);
	//HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)


	HAL_Delay(1);
}

/**************************************************************************/
/*!
    @brief  Reads a 16 bit values over I2C
*/
/**************************************************************************/
void wireReadRegister(uint8_t reg, uint16_t *value)
{
	uint8_t i2c_temp[2];
	HAL_I2C_Mem_Read(&hi2c1, INA219_ADDRESS<<1, (uint16_t)reg, 1,i2c_temp, 2, 0xffffffff);
	//HAL_I2C_Mem_Read_IT(&hi2c1, INA219_ADDRESS<<1, (uint16_t)reg, 1, i2c_temp, 2);
	HAL_Delay(1);
	*value = ((uint16_t)i2c_temp[0]<<8 )|(uint16_t)i2c_temp[1];
	printf("register = %u, read value=%i \n", reg, *value);
}

Lets say I have written in 2 registers and want to read only one of them:

 uint16_t read_val1=0;
  uint16_t read_val2=0;
  uint16_t read_val3=0;
  // Set Calibration register to 'Cal' calculated above
  wireWriteRegister(INA219_REG_CALIBRATION, ina219_calValue);

  //wireReadRegister(INA219_REG_CALIBRATION,read_val1);

  // Set Config register to take into account the settings above
  uint16_t config = INA219_CONFIG_BVOLTAGERANGE_16V |
                    INA219_CONFIG_GAIN_1_40MV |
                    INA219_CONFIG_BADCRES_12BIT |
                    INA219_CONFIG_SADCRES_12BIT_1S_532US |
                    INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS;
  wireWriteRegister(INA219_REG_CONFIG, config);
  wireReadRegister(INA219_REG_CALIBRATION,read_val3);

From what I understood from the datasheet, In order to read the register, the write command with 0 data has to be initiated to show what register you want to read. After that, A read command is initiated. A write and Read command difference is the first bit of the slave address ( either HIGH or LOW). Could someone give me any tips how do I properly initiate those two commands to read back a register

Parents Reply Children
No data
More questions in this forum