tempsens.c

Go to the documentation of this file.
00001 /***************************************************************************/
00037 #include "i2cdrv.h"
00038 #include "tempsens.h"
00039 
00040 /*******************************************************************************
00041  **************************   GLOBAL FUNCTIONS   *******************************
00042  ******************************************************************************/
00043 
00044 /***************************************************************************/
00052 void TEMPSENS_Celsius2Fahrenheit(TEMPSENS_Temp_TypeDef *temp)
00053 {
00054   int32_t convert;
00055 
00056   /* Use integer arithmetic. Values are sufficiently low, so int32 will */
00057   /* not overflow. */
00058   convert  = (int32_t)(temp->i) * 10000;
00059   convert += (int32_t)(temp->f);
00060   convert  = ((convert * 9) / 5) + (32 * 10000);
00061 
00062   temp->i = (int16_t)(convert / 10000);
00063   temp->f = (int16_t)(convert % 10000);
00064 }
00065 
00066 
00067 /***************************************************************************/
00094 int TEMPSENS_RegisterGet(I2C_TypeDef *i2c,
00095                          uint8_t addr,
00096                          TEMPSENS_Register_TypeDef reg,
00097                          uint16_t *val)
00098 {
00099   I2C_TransferSeq_TypeDef    seq;
00100   I2C_TransferReturn_TypeDef ret;
00101   uint8_t                    regid[1];
00102   uint8_t                    data[2];
00103 
00104   /* Unused parameter */
00105   (void) i2c;
00106 
00107   seq.addr  = addr;
00108   seq.flags = I2C_FLAG_WRITE_READ;
00109   /* Select register to be read */
00110   regid[0]        = ((uint8_t) reg) & 0x3;
00111   seq.buf[0].data = regid;
00112   seq.buf[0].len  = 1;
00113   /* Select location/length to place register */
00114   if (reg == tempsensRegConfig)
00115   {
00116     /* Only 1 byte reg, clear upper 8 bits */
00117     data[0]         = 0;
00118     seq.buf[1].data = data + 1;
00119     seq.buf[1].len  = 1;
00120   }
00121   else
00122   {
00123     seq.buf[1].data = data;
00124     seq.buf[1].len  = 2;
00125   }
00126 
00127   ret = I2CDRV_Transfer(&seq);
00128   if (ret != i2cTransferDone)
00129   {
00130     return((int) ret);
00131   }
00132 
00133   *val = (((uint16_t)(data[0])) << 8) | data[1];
00134 
00135   return(0);
00136 }
00137 
00138 
00139 /***************************************************************************/
00159 int TEMPSENS_RegisterSet(I2C_TypeDef *i2c,
00160                          uint8_t addr,
00161                          TEMPSENS_Register_TypeDef reg,
00162                          uint16_t val)
00163 {
00164   I2C_TransferSeq_TypeDef    seq;
00165   I2C_TransferReturn_TypeDef ret;
00166   uint8_t                    data[3];
00167 
00168   /* Unused parameter */
00169   (void) i2c;
00170 
00171   if (reg == tempsensRegTemp)
00172   {
00173     return(-1);
00174   }
00175 
00176   seq.addr  = addr;
00177   seq.flags = I2C_FLAG_WRITE;
00178   /* Select register to be written */
00179   data[0]         = ((uint8_t) reg) & 0x3;
00180   seq.buf[0].data = data;
00181   if (reg == tempsensRegConfig)
00182   {
00183     /* Only 1 byte reg */
00184     data[1]        = (uint8_t) val;
00185     seq.buf[0].len = 2;
00186   }
00187   else
00188   {
00189     data[1]        = (uint8_t)(val >> 8);
00190     data[2]        = (uint8_t) val;
00191     seq.buf[0].len = 3;
00192   }
00193 
00194   ret = I2CDRV_Transfer(&seq);
00195   if (ret != i2cTransferDone)
00196   {
00197     return((int) ret);
00198   }
00199 
00200   return(ret);
00201 }
00202 
00203 
00204 /***************************************************************************/
00235 int TEMPSENS_TemperatureGet(I2C_TypeDef *i2c,
00236                             uint8_t addr,
00237                             TEMPSENS_Temp_TypeDef *temp)
00238 {
00239   int      ret;
00240   uint32_t tmp;
00241   uint16_t val = 0;
00242 
00243   ret = TEMPSENS_RegisterGet(i2c, addr, tempsensRegTemp, &val);
00244   if (ret < 0)
00245   {
00246     return(ret);
00247   }
00248 
00249   /* Get all 12 bits potentially used */
00250   tmp = (uint32_t)(val >> 4);
00251 
00252   /* If negative number, convert using 2s complement */
00253   if (tmp & 0x800)
00254   {
00255     tmp     = (~tmp + 1) & 0xfff;
00256     temp->i = -(int16_t)(tmp >> 4);
00257     temp->f = -(int16_t)((tmp & 0xf) * 625);
00258   }
00259   else
00260   {
00261     temp->i = (int16_t)(tmp >> 4);
00262     temp->f = (int16_t)((tmp & 0xf) * 625);
00263   }
00264 
00265   return(0);
00266 }