We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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