text export
Dependencies: X_NUCLEO_IKS01A3
INA237/INA237.c
- Committer:
- gpmbed
- Date:
- 2021-05-19
- Revision:
- 9:8c7774aca512
File content as of revision 9:8c7774aca512:
/* * ======== 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 */ }