tempsens.c

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