tempsens.c
Go to the documentation of this file.00001
00019 #include "i2cdrv.h"
00020 #include "tempsens.h"
00021
00022
00023
00024
00025
00026
00034 void TEMPSENS_Celsius2Fahrenheit(TEMPSENS_Temp_TypeDef *temp)
00035 {
00036 int32_t convert;
00037
00038
00039
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
00087 (void) i2c;
00088
00089 seq.addr = addr;
00090 seq.flags = I2C_FLAG_WRITE_READ;
00091
00092 regid[0] = ((uint8_t) reg) & 0x3;
00093 seq.buf[0].data = regid;
00094 seq.buf[0].len = 1;
00095
00096 if (reg == tempsensRegConfig)
00097 {
00098
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
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
00161 data[0] = ((uint8_t) reg) & 0x3;
00162 seq.buf[0].data = data;
00163 if (reg == tempsensRegConfig)
00164 {
00165
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
00232 tmp = (uint32_t)(val >> 4);
00233
00234
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 }