text export
Dependencies: X_NUCLEO_IKS01A3
Diff: INA237/INA237.c
- Revision:
- 9:8c7774aca512
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/INA237/INA237.c Wed May 19 15:54:08 2021 +0000 @@ -0,0 +1,355 @@ +/* + * ======== INA237.c ======== + * INA237 APIs for initialization and use of the INA237 peripheral + * + * DO NOT EDIT - This file is generated by the SysConfig tool for + * the TI Sensors in this application. + */ + +#include <stddef.h> +#include <stdint.h> + +#include "INA237.h" +//#include "mcu.h" + + +#define INA237_0_config_register_VALUE (INA237_config_register_rst_NormalOperation | \ + 0x0000U | \ + INA237_config_register_tempcomp_Shunttemperaturecompensationdisabled | \ + INA237_config_register_adcrange_16384mV) +#define INA237_0_adc_config_register_VALUE (INA237_adc_config_register_mode_Continuousbusvoltageshuntvoltageandtemperature | \ + INA237_adc_config_register_vbusct_1052us | \ + INA237_adc_config_register_vshct_1052us | \ + INA237_adc_config_register_vtct_1052us | \ + INA237_adc_config_register_avg_1) +#define INA237_0_shunt_cal_register_VALUE 0x0000U +#define INA237_0_diag_alrt_register_VALUE (INA237_diag_alrt_register_alrlen_Transparent | \ + INA237_diag_alrt_register_cnvr_DisableconversionreadyflagonALERTpin | \ + INA237_diag_alrt_register_slwalrt_ALERTcomparisononnonaveragedADCvalue | \ + INA237_diag_alrt_register_apol_Normalactivelowopendrain) +#define INA237_0_sovl_register_VALUE 0x7FFFU +#define INA237_0_suvl_register_VALUE 0x8000U +#define INA237_0_bovl_register_VALUE 0x7FFFU +#define INA237_0_buvl_register_VALUE 0x0000U +#define INA237_0_temp_limit_register_VALUE 0x7FF0U +#define INA237_0_pwr_limit_register_VALUE 0xFFFFU + +static INA237_State INA237_0_state = { + /* Configuration and Settings */ + .config = INA237_0_config_register_VALUE, + .adcconfig = INA237_0_adc_config_register_VALUE, + .shuntcal = INA237_0_shunt_cal_register_VALUE, + .diagalrt = INA237_0_diag_alrt_register_VALUE, + .sovl = INA237_0_sovl_register_VALUE, + .suvl = INA237_0_suvl_register_VALUE, + .bovl = INA237_0_bovl_register_VALUE, + .buvl = INA237_0_buvl_register_VALUE, + .templimit = INA237_0_temp_limit_register_VALUE, + .pwrlimit = INA237_0_pwr_limit_register_VALUE, + + .adcrange = INA237_0_config_register_VALUE & INA237_config_register_adcrange_4096mV, + .currentlsb = 0, + + /* Sensor's I2C bus ID and address */ + .busId = 0, + .devAddr = 0x40U, + +}; +const INA237_Handle INA237_0 = &INA237_0_state; + + + +#define MSB(u16) (((u16) & 0xFF00U) >> 8) +#define LSB(u16) ((u16) & 0xFFU) + +#define maxRegAddress 0x3F + +// Register size in bytes +const uint8_t INA237_regSize[maxRegAddress+1] = { + 2,2,2,2,2,2,2,2,\ + 3,2,2,2,2,2,2,2,\ + 2,2,0,0,0,0,0,0,\ + 0,0,0,0,0,0,0,0,\ + 0,0,0,0,0,0,0,0,\ + 0,0,0,0,0,0,0,0,\ + 0,0,0,0,0,0,0,0,\ + 0,0,0,0,0,0,2,2 +}; + +void mcu_i2cInit(uint8_t busId); +int8_t mcu_i2cTransfer(uint8_t busId, uint8_t sensorAddress, + uint8_t *dataToWrite, uint8_t writeLength, + uint8_t *dataToRead, uint8_t readLength); +void mcu_msWait(unsigned long msWait); + +/* + * ======== INA237_writeReg ======== + * Write register + */ +void INA237_writeReg(INA237_Handle sensor, uint8_t regAddr, uint16_t value) +{ + uint8_t txBuf[3] = {0}; //All writable registers are 2 bytes + + txBuf[0] = regAddr; + txBuf[1] = MSB(value); + txBuf[2] = LSB(value); + mcu_i2cTransfer(sensor->busId, sensor->devAddr, txBuf, 3, NULL, 0); + + //check for change in ADCRANGE + if(regAddr == INA237_vshunt_register) + { + sensor->adcrange = value & INA237_config_register_adcrange_4096mV; + } +} + +/* + * ======== INA237_config ======== + * Configure device with current settings. + */ +void INA237_config(INA237_Handle sensor) +{ + //Initialize the bus containing this sensor + mcu_i2cInit(sensor->busId); + + //Write sensor Configuration Register + INA237_writeReg(sensor, INA237_config_register, sensor->config); + INA237_writeReg(sensor, INA237_adc_config_register, sensor->adcconfig); + INA237_writeReg(sensor, INA237_shunt_cal_register, sensor->shuntcal); + INA237_writeReg(sensor, INA237_diag_alrt_register, sensor->diagalrt); + INA237_writeReg(sensor, INA237_sovl_register, sensor->sovl); + INA237_writeReg(sensor, INA237_suvl_register, sensor->suvl); + INA237_writeReg(sensor, INA237_bovl_register, sensor->bovl); + INA237_writeReg(sensor, INA237_buvl_register, sensor->buvl); + INA237_writeReg(sensor, INA237_temp_limit_register, sensor->templimit); + INA237_writeReg(sensor, INA237_pwr_limit_register, sensor->pwrlimit); +} + +/* + * ======== INA237_setCURRENT_LSB ======== + * Set the CURRENT_LSB value used for calculations + */ +void INA237_setCURRENT_LSB(INA237_Handle sensor, float CURRENT_LSB) +{ + sensor->currentlsb = CURRENT_LSB; +} + +/* + * ======== INA237_readReg ======== + * Read register + */ +uint64_t INA237_readReg(INA237_Handle sensor, uint8_t regAddr) +{ + uint64_t value; + int i; + + uint8_t txBuf[1] = {0}; + uint8_t rxBuf[5] = {0}; //max buffer size + + txBuf[0] = regAddr; + + //Read register + mcu_i2cTransfer(sensor->busId, sensor->devAddr, txBuf, 1, rxBuf, INA237_regSize[regAddr]); + + //Combine bytes + value = rxBuf[0]; + for(i = 1; i < INA237_regSize[regAddr]; i++) + { + value = (value << 8) | rxBuf[i]; + } + + return value; +} + +/* + * ======== INA237_getVSHUNT_mV ======== + * Get VSHUNT value (mV) + */ +float INA237_getVSHUNT_mV(INA237_Handle sensor) +{ + uint64_t value = INA237_readReg(sensor, INA237_vshunt_register); + float data; + + //Convert for 2's compliment and signed value + if(value > 0x7FFF) + { + data = (float)value - 0x10000; + } + else + { + data = (float)value; + } + + //Convert to mV + + if(sensor->adcrange == INA237_config_register_adcrange_4096mV) + { + data = (data * 1.25) / 1000; + } + else + { + data = (data * 5) / 1000; + } + + return data; +} + +/* + * ======== INA237_getVBUS_V ======== + * Get VBUS value (V) + */ +float INA237_getVBUS_V(INA237_Handle sensor) +{ + uint64_t value = INA237_readReg(sensor, INA237_vbus_register); + float data; + + //Convert for 2's compliment and signed value (though always positive) + if(value > 0x7FFF) + { + data = (float)value - 0x10000; //left for redundancy and error checking, should never get used + } + else + { + data = (float)value; + } + + //Convert to V + data = (data * 3.125) / 1000; + + return data; +} + +/* + * ======== INA237_getDIETEMP_C ======== + * Get DIETMEP value (C) + */ +float INA237_getDIETEMP_C(INA237_Handle sensor) +{ + uint64_t value = INA237_readReg(sensor, INA237_dietemp_register); + float data; + + //Remove reserved bits + value = value >> 4; + + //Convert for 2's compliment and signed value + if(value > 0x7FF) + { + data = (float)value - 0x1000; + } + else + { + data = (float)value; + } + + //Convert to C + data = (data * 125) / 1000; + + return data; +} + +/* + * ======== INA237_getDIETEMP_F ======== + * Get DIETMEP value (F) + */ +float INA237_getDIETEMP_F(INA237_Handle sensor) +{ + float data = INA237_getDIETEMP_C(sensor); + + //Convert to F + data = (data * (9/5)) + 32; + + return data; +} + +/* + * ======== INA237_getCURRENT_signedLSB ======== + * Get CURRENT value (signed value in LSBs) + */ +float INA237_getCURRENT_signedLSB(INA237_Handle sensor) +{ + uint64_t value = INA237_readReg(sensor, INA237_current_register); + float data; + + //Convert for 2's compliment and signed value + if(value > 0x7FFF) + { + data = (float)value - 0x10000; + } + else + { + data = (float)value; + } + + return data; +} + +/* + * ======== INA237_getCURRENT_A ======== + * Get CURRENT value (A) + */ +float INA237_getCURRENT_A(INA237_Handle sensor) +{ + float data = INA237_getCURRENT_signedLSB(sensor); + + data = data * sensor->currentlsb; + + return data; +} + +/* + * ======== INA237_getPOWER_signedLSB ======== + * Get POWER value (signed value in LSBs) + */ +float INA237_getPOWER_signedLSB(INA237_Handle sensor) +{ + uint64_t value = INA237_readReg(sensor, INA237_power_register); + float data; + + data = (float)value; + + return data; +} + +/* + * ======== INA237_getPOWER_W ======== + * Get POWER value (W) + */ +float INA237_getPOWER_W(INA237_Handle sensor) +{ + float data = INA237_getPOWER_signedLSB(sensor); + + data = data * sensor->currentlsb * 0.2; + + return data; +} + +void mcu_i2cInit(uint8_t busId) +{ + /* Add MCU specific init necessary for I2C to be used */ +} + +int8_t mcu_i2cTransfer( uint8_t busId, uint8_t i2cAddr, + uint8_t *dataToWrite, uint8_t writeLength, + uint8_t *dataToRead, uint8_t readLength) +{ + /* + * Add MCU specific I2C read/write code here. + */ + + /* + * Add MCU specific return code for error handling + */ + + return (0); +} +/********* MCU SPECIFIC I2C CODE ENDS HERE**********/ + + + + +/********* MCU SPECIFIC DELAY CODE STARTS HERE************/ +void mcu_msWait(unsigned long msWait) +{ + /* + * Add MCU specific wait loop for msWait. The unit is in milli-seconds + */ +} \ No newline at end of file