tempsens.c
Go to the documentation of this file.00001
00017 #include "i2cspm.h"
00018 #include "tempsens.h"
00019
00020
00021
00022
00023
00024
00032 void TEMPSENS_Celsius2Fahrenheit(TEMPSENS_Temp_TypeDef *temp)
00033 {
00034 int32_t convert;
00035
00036
00037
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
00087 regid[0] = ((uint8_t) reg) & 0x3;
00088 seq.buf[0].data = regid;
00089 seq.buf[0].len = 1;
00090
00091 if (reg == tempsensRegConfig)
00092 {
00093
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
00153 data[0] = ((uint8_t) reg) & 0x3;
00154 seq.buf[0].data = data;
00155 if (reg == tempsensRegConfig)
00156 {
00157
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
00224 tmp = (uint32_t)(val >> 4);
00225
00226
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 }