text export
Dependencies: X_NUCLEO_IKS01A3
INA237.c
00001 /* 00002 * ======== INA237.c ======== 00003 * INA237 APIs for initialization and use of the INA237 peripheral 00004 * 00005 * DO NOT EDIT - This file is generated by the SysConfig tool for 00006 * the TI Sensors in this application. 00007 */ 00008 00009 #include <stddef.h> 00010 #include <stdint.h> 00011 00012 #include "INA237.h" 00013 //#include "mcu.h" 00014 00015 00016 #define INA237_0_config_register_VALUE (INA237_config_register_rst_NormalOperation | \ 00017 0x0000U | \ 00018 INA237_config_register_tempcomp_Shunttemperaturecompensationdisabled | \ 00019 INA237_config_register_adcrange_16384mV) 00020 #define INA237_0_adc_config_register_VALUE (INA237_adc_config_register_mode_Continuousbusvoltageshuntvoltageandtemperature | \ 00021 INA237_adc_config_register_vbusct_1052us | \ 00022 INA237_adc_config_register_vshct_1052us | \ 00023 INA237_adc_config_register_vtct_1052us | \ 00024 INA237_adc_config_register_avg_1) 00025 #define INA237_0_shunt_cal_register_VALUE 0x0000U 00026 #define INA237_0_diag_alrt_register_VALUE (INA237_diag_alrt_register_alrlen_Transparent | \ 00027 INA237_diag_alrt_register_cnvr_DisableconversionreadyflagonALERTpin | \ 00028 INA237_diag_alrt_register_slwalrt_ALERTcomparisononnonaveragedADCvalue | \ 00029 INA237_diag_alrt_register_apol_Normalactivelowopendrain) 00030 #define INA237_0_sovl_register_VALUE 0x7FFFU 00031 #define INA237_0_suvl_register_VALUE 0x8000U 00032 #define INA237_0_bovl_register_VALUE 0x7FFFU 00033 #define INA237_0_buvl_register_VALUE 0x0000U 00034 #define INA237_0_temp_limit_register_VALUE 0x7FF0U 00035 #define INA237_0_pwr_limit_register_VALUE 0xFFFFU 00036 00037 static INA237_State INA237_0_state = { 00038 /* Configuration and Settings */ 00039 .config = INA237_0_config_register_VALUE, 00040 .adcconfig = INA237_0_adc_config_register_VALUE, 00041 .shuntcal = INA237_0_shunt_cal_register_VALUE, 00042 .diagalrt = INA237_0_diag_alrt_register_VALUE, 00043 .sovl = INA237_0_sovl_register_VALUE, 00044 .suvl = INA237_0_suvl_register_VALUE, 00045 .bovl = INA237_0_bovl_register_VALUE, 00046 .buvl = INA237_0_buvl_register_VALUE, 00047 .templimit = INA237_0_temp_limit_register_VALUE, 00048 .pwrlimit = INA237_0_pwr_limit_register_VALUE, 00049 00050 .adcrange = INA237_0_config_register_VALUE & INA237_config_register_adcrange_4096mV, 00051 .currentlsb = 0, 00052 00053 /* Sensor's I2C bus ID and address */ 00054 .busId = 0, 00055 .devAddr = 0x40U, 00056 00057 }; 00058 const INA237_Handle INA237_0 = &INA237_0_state; 00059 00060 00061 00062 #define MSB(u16) (((u16) & 0xFF00U) >> 8) 00063 #define LSB(u16) ((u16) & 0xFFU) 00064 00065 #define maxRegAddress 0x3F 00066 00067 // Register size in bytes 00068 const uint8_t INA237_regSize[maxRegAddress+1] = { 00069 2,2,2,2,2,2,2,2,\ 00070 3,2,2,2,2,2,2,2,\ 00071 2,2,0,0,0,0,0,0,\ 00072 0,0,0,0,0,0,0,0,\ 00073 0,0,0,0,0,0,0,0,\ 00074 0,0,0,0,0,0,0,0,\ 00075 0,0,0,0,0,0,0,0,\ 00076 0,0,0,0,0,0,2,2 00077 }; 00078 00079 void mcu_i2cInit(uint8_t busId); 00080 int8_t mcu_i2cTransfer(uint8_t busId, uint8_t sensorAddress, 00081 uint8_t *dataToWrite, uint8_t writeLength, 00082 uint8_t *dataToRead, uint8_t readLength); 00083 void mcu_msWait(unsigned long msWait); 00084 00085 /* 00086 * ======== INA237_writeReg ======== 00087 * Write register 00088 */ 00089 void INA237_writeReg(INA237_Handle sensor, uint8_t regAddr, uint16_t value) 00090 { 00091 uint8_t txBuf[3] = {0}; //All writable registers are 2 bytes 00092 00093 txBuf[0] = regAddr; 00094 txBuf[1] = MSB(value); 00095 txBuf[2] = LSB(value); 00096 mcu_i2cTransfer(sensor->busId, sensor->devAddr, txBuf, 3, NULL, 0); 00097 00098 //check for change in ADCRANGE 00099 if(regAddr == INA237_vshunt_register) 00100 { 00101 sensor->adcrange = value & INA237_config_register_adcrange_4096mV; 00102 } 00103 } 00104 00105 /* 00106 * ======== INA237_config ======== 00107 * Configure device with current settings. 00108 */ 00109 void INA237_config(INA237_Handle sensor) 00110 { 00111 //Initialize the bus containing this sensor 00112 mcu_i2cInit(sensor->busId); 00113 00114 //Write sensor Configuration Register 00115 INA237_writeReg(sensor, INA237_config_register, sensor->config); 00116 INA237_writeReg(sensor, INA237_adc_config_register, sensor->adcconfig); 00117 INA237_writeReg(sensor, INA237_shunt_cal_register, sensor->shuntcal); 00118 INA237_writeReg(sensor, INA237_diag_alrt_register, sensor->diagalrt); 00119 INA237_writeReg(sensor, INA237_sovl_register, sensor->sovl); 00120 INA237_writeReg(sensor, INA237_suvl_register, sensor->suvl); 00121 INA237_writeReg(sensor, INA237_bovl_register, sensor->bovl); 00122 INA237_writeReg(sensor, INA237_buvl_register, sensor->buvl); 00123 INA237_writeReg(sensor, INA237_temp_limit_register, sensor->templimit); 00124 INA237_writeReg(sensor, INA237_pwr_limit_register, sensor->pwrlimit); 00125 } 00126 00127 /* 00128 * ======== INA237_setCURRENT_LSB ======== 00129 * Set the CURRENT_LSB value used for calculations 00130 */ 00131 void INA237_setCURRENT_LSB(INA237_Handle sensor, float CURRENT_LSB) 00132 { 00133 sensor->currentlsb = CURRENT_LSB; 00134 } 00135 00136 /* 00137 * ======== INA237_readReg ======== 00138 * Read register 00139 */ 00140 uint64_t INA237_readReg(INA237_Handle sensor, uint8_t regAddr) 00141 { 00142 uint64_t value; 00143 int i; 00144 00145 uint8_t txBuf[1] = {0}; 00146 uint8_t rxBuf[5] = {0}; //max buffer size 00147 00148 txBuf[0] = regAddr; 00149 00150 //Read register 00151 mcu_i2cTransfer(sensor->busId, sensor->devAddr, txBuf, 1, rxBuf, INA237_regSize[regAddr]); 00152 00153 //Combine bytes 00154 value = rxBuf[0]; 00155 for(i = 1; i < INA237_regSize[regAddr]; i++) 00156 { 00157 value = (value << 8) | rxBuf[i]; 00158 } 00159 00160 return value; 00161 } 00162 00163 /* 00164 * ======== INA237_getVSHUNT_mV ======== 00165 * Get VSHUNT value (mV) 00166 */ 00167 float INA237_getVSHUNT_mV(INA237_Handle sensor) 00168 { 00169 uint64_t value = INA237_readReg(sensor, INA237_vshunt_register); 00170 float data; 00171 00172 //Convert for 2's compliment and signed value 00173 if(value > 0x7FFF) 00174 { 00175 data = (float)value - 0x10000; 00176 } 00177 else 00178 { 00179 data = (float)value; 00180 } 00181 00182 //Convert to mV 00183 00184 if(sensor->adcrange == INA237_config_register_adcrange_4096mV) 00185 { 00186 data = (data * 1.25) / 1000; 00187 } 00188 else 00189 { 00190 data = (data * 5) / 1000; 00191 } 00192 00193 return data; 00194 } 00195 00196 /* 00197 * ======== INA237_getVBUS_V ======== 00198 * Get VBUS value (V) 00199 */ 00200 float INA237_getVBUS_V(INA237_Handle sensor) 00201 { 00202 uint64_t value = INA237_readReg(sensor, INA237_vbus_register); 00203 float data; 00204 00205 //Convert for 2's compliment and signed value (though always positive) 00206 if(value > 0x7FFF) 00207 { 00208 data = (float)value - 0x10000; //left for redundancy and error checking, should never get used 00209 } 00210 else 00211 { 00212 data = (float)value; 00213 } 00214 00215 //Convert to V 00216 data = (data * 3.125) / 1000; 00217 00218 return data; 00219 } 00220 00221 /* 00222 * ======== INA237_getDIETEMP_C ======== 00223 * Get DIETMEP value (C) 00224 */ 00225 float INA237_getDIETEMP_C(INA237_Handle sensor) 00226 { 00227 uint64_t value = INA237_readReg(sensor, INA237_dietemp_register); 00228 float data; 00229 00230 //Remove reserved bits 00231 value = value >> 4; 00232 00233 //Convert for 2's compliment and signed value 00234 if(value > 0x7FF) 00235 { 00236 data = (float)value - 0x1000; 00237 } 00238 else 00239 { 00240 data = (float)value; 00241 } 00242 00243 //Convert to C 00244 data = (data * 125) / 1000; 00245 00246 return data; 00247 } 00248 00249 /* 00250 * ======== INA237_getDIETEMP_F ======== 00251 * Get DIETMEP value (F) 00252 */ 00253 float INA237_getDIETEMP_F(INA237_Handle sensor) 00254 { 00255 float data = INA237_getDIETEMP_C(sensor); 00256 00257 //Convert to F 00258 data = (data * (9/5)) + 32; 00259 00260 return data; 00261 } 00262 00263 /* 00264 * ======== INA237_getCURRENT_signedLSB ======== 00265 * Get CURRENT value (signed value in LSBs) 00266 */ 00267 float INA237_getCURRENT_signedLSB(INA237_Handle sensor) 00268 { 00269 uint64_t value = INA237_readReg(sensor, INA237_current_register); 00270 float data; 00271 00272 //Convert for 2's compliment and signed value 00273 if(value > 0x7FFF) 00274 { 00275 data = (float)value - 0x10000; 00276 } 00277 else 00278 { 00279 data = (float)value; 00280 } 00281 00282 return data; 00283 } 00284 00285 /* 00286 * ======== INA237_getCURRENT_A ======== 00287 * Get CURRENT value (A) 00288 */ 00289 float INA237_getCURRENT_A(INA237_Handle sensor) 00290 { 00291 float data = INA237_getCURRENT_signedLSB(sensor); 00292 00293 data = data * sensor->currentlsb; 00294 00295 return data; 00296 } 00297 00298 /* 00299 * ======== INA237_getPOWER_signedLSB ======== 00300 * Get POWER value (signed value in LSBs) 00301 */ 00302 float INA237_getPOWER_signedLSB(INA237_Handle sensor) 00303 { 00304 uint64_t value = INA237_readReg(sensor, INA237_power_register); 00305 float data; 00306 00307 data = (float)value; 00308 00309 return data; 00310 } 00311 00312 /* 00313 * ======== INA237_getPOWER_W ======== 00314 * Get POWER value (W) 00315 */ 00316 float INA237_getPOWER_W(INA237_Handle sensor) 00317 { 00318 float data = INA237_getPOWER_signedLSB(sensor); 00319 00320 data = data * sensor->currentlsb * 0.2; 00321 00322 return data; 00323 } 00324 00325 void mcu_i2cInit(uint8_t busId) 00326 { 00327 /* Add MCU specific init necessary for I2C to be used */ 00328 } 00329 00330 int8_t mcu_i2cTransfer( uint8_t busId, uint8_t i2cAddr, 00331 uint8_t *dataToWrite, uint8_t writeLength, 00332 uint8_t *dataToRead, uint8_t readLength) 00333 { 00334 /* 00335 * Add MCU specific I2C read/write code here. 00336 */ 00337 00338 /* 00339 * Add MCU specific return code for error handling 00340 */ 00341 00342 return (0); 00343 } 00344 /********* MCU SPECIFIC I2C CODE ENDS HERE**********/ 00345 00346 00347 00348 00349 /********* MCU SPECIFIC DELAY CODE STARTS HERE************/ 00350 void mcu_msWait(unsigned long msWait) 00351 { 00352 /* 00353 * Add MCU specific wait loop for msWait. The unit is in milli-seconds 00354 */ 00355 }
Generated on Fri Jul 15 2022 07:01:47 by
1.7.2