text export

Dependencies:   X_NUCLEO_IKS01A3

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers INA237.c Source File

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 }