tempsens.c
Go to the documentation of this file.00001
00037 #include "i2cdrv.h"
00038 #include "tempsens.h"
00039
00040
00041
00042
00043
00044
00052 void TEMPSENS_Celsius2Fahrenheit(TEMPSENS_Temp_TypeDef *temp)
00053 {
00054 int32_t convert;
00055
00056
00057
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
00105 (void) i2c;
00106
00107 seq.addr = addr;
00108 seq.flags = I2C_FLAG_WRITE_READ;
00109
00110 regid[0] = ((uint8_t) reg) & 0x3;
00111 seq.buf[0].data = regid;
00112 seq.buf[0].len = 1;
00113
00114 if (reg == tempsensRegConfig)
00115 {
00116
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
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
00179 data[0] = ((uint8_t) reg) & 0x3;
00180 seq.buf[0].data = data;
00181 if (reg == tempsensRegConfig)
00182 {
00183
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
00250 tmp = (uint32_t)(val >> 4);
00251
00252
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 }