tempsens.c

Go to the documentation of this file.
00001 /***************************************************************************/
00019 #include "i2cdrv.h"
00020 #include "tempsens.h"
00021 
00022 /*******************************************************************************
00023  **************************   GLOBAL FUNCTIONS   *******************************
00024  ******************************************************************************/
00025 
00026 /***************************************************************************/
00034 void TEMPSENS_Celsius2Fahrenheit(TEMPSENS_Temp_TypeDef *temp)
00035 {
00036   int32_t convert;
00037 
00038   /* Use integer arithmetic. Values are sufficiently low, so int32 will */
00039   /* not overflow. */
00040   convert  = (int32_t)(temp->i) * 10000;
00041   convert += (int32_t)(temp->f);
00042   convert  = ((convert * 9) / 5) + (32 * 10000);
00043 
00044   temp->i = (int16_t)(convert / 10000);
00045   temp->f = (int16_t)(convert % 10000);
00046 }
00047 
00048 
00049 /***************************************************************************/
00076 int TEMPSENS_RegisterGet(I2C_TypeDef *i2c,
00077                          uint8_t addr,
00078                          TEMPSENS_Register_TypeDef reg,
00079                          uint16_t *val)
00080 {
00081   I2C_TransferSeq_TypeDef    seq;
00082   I2C_TransferReturn_TypeDef ret;
00083   uint8_t                    regid[1];
00084   uint8_t                    data[2];
00085 
00086   /* Unused parameter */
00087   (void) i2c;
00088 
00089   seq.addr  = addr;
00090   seq.flags = I2C_FLAG_WRITE_READ;
00091   /* Select register to be read */
00092   regid[0]        = ((uint8_t) reg) & 0x3;
00093   seq.buf[0].data = regid;
00094   seq.buf[0].len  = 1;
00095   /* Select location/length to place register */
00096   if (reg == tempsensRegConfig)
00097   {
00098     /* Only 1 byte reg, clear upper 8 bits */
00099     data[0]         = 0;
00100     seq.buf[1].data = data + 1;
00101     seq.buf[1].len  = 1;
00102   }
00103   else
00104   {
00105     seq.buf[1].data = data;
00106     seq.buf[1].len  = 2;
00107   }
00108 
00109   ret = I2CDRV_Transfer(&seq);
00110   if (ret != i2cTransferDone)
00111   {
00112     return((int) ret);
00113   }
00114 
00115   *val = (((uint16_t)(data[0])) << 8) | data[1];
00116 
00117   return(0);
00118 }
00119 
00120 
00121 /***************************************************************************/
00141 int TEMPSENS_RegisterSet(I2C_TypeDef *i2c,
00142                          uint8_t addr,
00143                          TEMPSENS_Register_TypeDef reg,
00144                          uint16_t val)
00145 {
00146   I2C_TransferSeq_TypeDef    seq;
00147   I2C_TransferReturn_TypeDef ret;
00148   uint8_t                    data[3];
00149 
00150   /* Unused parameter */
00151   (void) i2c;
00152 
00153   if (reg == tempsensRegTemp)
00154   {
00155     return(-1);
00156   }
00157 
00158   seq.addr  = addr;
00159   seq.flags = I2C_FLAG_WRITE;
00160   /* Select register to be written */
00161   data[0]         = ((uint8_t) reg) & 0x3;
00162   seq.buf[0].data = data;
00163   if (reg == tempsensRegConfig)
00164   {
00165     /* Only 1 byte reg */
00166     data[1]        = (uint8_t) val;
00167     seq.buf[0].len = 2;
00168   }
00169   else
00170   {
00171     data[1]        = (uint8_t)(val >> 8);
00172     data[2]        = (uint8_t) val;
00173     seq.buf[0].len = 3;
00174   }
00175 
00176   ret = I2CDRV_Transfer(&seq);
00177   if (ret != i2cTransferDone)
00178   {
00179     return((int) ret);
00180   }
00181 
00182   return(ret);
00183 }
00184 
00185 
00186 /***************************************************************************/
00217 int TEMPSENS_TemperatureGet(I2C_TypeDef *i2c,
00218                             uint8_t addr,
00219                             TEMPSENS_Temp_TypeDef *temp)
00220 {
00221   int      ret;
00222   uint32_t tmp;
00223   uint16_t val = 0;
00224 
00225   ret = TEMPSENS_RegisterGet(i2c, addr, tempsensRegTemp, &val);
00226   if (ret < 0)
00227   {
00228     return(ret);
00229   }
00230 
00231   /* Get all 12 bits potentially used */
00232   tmp = (uint32_t)(val >> 4);
00233 
00234   /* If negative number, convert using 2s complement */
00235   if (tmp & 0x800)
00236   {
00237     tmp     = (~tmp + 1) & 0xfff;
00238     temp->i = -(int16_t)(tmp >> 4);
00239     temp->f = -(int16_t)((tmp & 0xf) * 625);
00240   }
00241   else
00242   {
00243     temp->i = (int16_t)(tmp >> 4);
00244     temp->f = (int16_t)((tmp & 0xf) * 625);
00245   }
00246 
00247   return(0);
00248 }