44 #include "sensor_defs.h"
47 #define LM73_DEBUG (0)
50 # define DBG_LM73(...) PRINTF(__VA_ARGS__)
52 # define DBG_LM73(...)
55 #define LM73_ADDR_0 (0x48)
56 #define LM73_ADDR_1 (0x49)
57 #define LM73_ADDR_2 (0x4A)
59 #define LM73_ADDR_3 (0x4C)
60 #define LM73_ADDR_4 (0x4D)
61 #define LM73_ADDR_5 (0x4E)
63 #define LM73_PTR_TEMP (0x00)
64 #define LM73_PTR_CFG (0x01)
65 #define LM73_PTR_THIGH (0x02)
66 #define LM73_PTR_TLOW (0x03)
67 #define LM73_PTR_STATUS (0x04)
68 #define LM73_PTR_ID (0x07)
70 #define LM73_CFG_RESERVED (0x03)
71 #define LM73_CFG_ONE_SHOT (0x04)
72 #define LM73_CFG_ALERT_RST (0x08)
73 #define LM73_CFG_ALERT_POL (0x10)
74 #define LM73_CFG_ALERT_EN (0x20)
75 #define LM73_CFG_PWR_DOWN (0x80)
77 #define LM73_STATUS_DAV (0x01)
78 #define LM73_STATUS_TLOW (0x02)
79 #define LM73_STATUS_THIGH (0x04)
80 #define LM73_STATUS_ALERT (0x08)
81 #define LM73_STATUS_RES (0x60)
88 #define LM73_T_BUS_FREE_US (8)
91 #define LM73_REG_TO_TEMP_SCALE (0.0078125)
92 #define LM73_TEMP_TO_REG_SCALE (128)
107 static inline uint8_t lm73_byte_read(lm73_ctx_t *pctx, uint8_t addr)
109 uint8_t buf[1] = {addr,};
111 DBG_LM73(
"d: lm73_byte_read: addr=0x%x val=0x%x\n", addr, buf[0]);
115 static inline void lm73_byte_write(lm73_ctx_t *pctx, uint8_t addr, uint8_t val)
117 uint8_t buf[2] = {addr, val};
119 DBG_LM73(
"d: lm73_byte_write: addr=0x%x val=0x%x\n", addr, val);
122 static inline uint16_t lm73_word_read(lm73_ctx_t *pctx, uint8_t addr)
125 uint8_t buf[2] = {addr,};
127 rv = (buf[0]<<8) | buf[1];
128 DBG_LM73(
"d: lm73_word_read: addr=0x%x val=0x%x\n", addr, rv);
132 static inline void lm73_word_write(lm73_ctx_t *pctx, uint8_t addr, uint16_t val)
134 uint8_t buf[3] = {addr, ((val>>8) &0xff), (val & 0xff)};
136 DBG_LM73(
"d: lm73_word_write: addr=0x%x val=0x%x\n", addr, val);
139 static inline int16_t lm73_get(lm73_ctx_t *pctx)
142 rv = lm73_word_read(pctx, LM73_PTR_TEMP);
143 DBG_LM73(
"d: lm73_get: val=0x%x\n", rv);
147 static inline void lm73_set_upper_limit(lm73_ctx_t *pctx, int16_t val)
149 lm73_word_write(pctx, LM73_PTR_THIGH, val);
152 static inline void lm73_set_lower_limit(lm73_ctx_t *pctx, int16_t val)
154 lm73_word_write(pctx, LM73_PTR_TLOW, val);
157 static inline uint16_t lm73_get_id(lm73_ctx_t *pctx)
159 uint8_t buf[2] = {7};
161 return buf[0] | buf[1]*256;
164 static inline float lm73_scale(int16_t val)
166 return LM73_REG_TO_TEMP_SCALE * (val);
172 static inline void lm73_trigger(
void *pctx,
bool one_shot)
175 tmp = lm73_byte_read(((lm73_ctx_t *)pctx), LM73_PTR_CFG);
178 tmp |= (LM73_CFG_PWR_DOWN | LM73_CFG_ONE_SHOT);
182 tmp &= ~LM73_CFG_PWR_DOWN;
184 tmp &= ~LM73_CFG_RESERVED;
187 lm73_byte_write(((lm73_ctx_t *)pctx), LM73_PTR_CFG, tmp);
188 DBG_LM73(
"d: lm73_trigger: cfg=0x%x, one_shot=%d\n", tmp, one_shot);
191 static inline uint8_t lm73_get_val(
void *pctx, uint8_t *pdata)
198 temp = lm73_get((lm73_ctx_t *)pctx);
199 status = lm73_byte_read(((lm73_ctx_t *)pctx), LM73_PTR_STATUS);
200 if (status & LM73_STATUS_DAV)
210 DBG_LM73(
"d: lm73_get_val: temp=%d, status=0x%x\n", temp, status);
216 static inline uint8_t lm73_get_raw(
void *pctx, uint8_t *pdata)
223 status = lm73_byte_read(((lm73_ctx_t *)pctx), LM73_PTR_STATUS);
224 if (status & LM73_STATUS_DAV)
226 ((
sensor_raw_t*)pdata)->type = SENSOR_DATA_RAW |
sizeof(tempi);
228 tempi = lm73_get((lm73_ctx_t *)pctx);
240 static inline void lm73_sleep(
void *pctx)
243 tmp = lm73_byte_read(((lm73_ctx_t *)pctx), LM73_PTR_CFG);
244 tmp |= LM73_CFG_PWR_DOWN;
246 lm73_byte_write(((lm73_ctx_t *)pctx), LM73_PTR_CFG, tmp);
247 DBG_LM73(
"d: lm73_sleep: val=0x%x\n", tmp);
275 uint8_t rv =
sizeof(lm73_ctx_t);
282 pcfg = (lm73_ctx_t *)pdata;
283 pcfg->g.id = SENSOR_LM73;
284 pcfg->g.f_trigger = lm73_trigger;
285 pcfg->g.f_get_val = raw ? lm73_get_raw : lm73_get_val;
286 pcfg->g.f_sleep = lm73_sleep;
291 pcfg->temp_offset = temp_offset;
295 pcfg->g.last_error = tst ? SENSOR_ERR_OK : SENSOR_ERR_INIT;
296 DBG_LM73(
"d: lm73_init: addr=0x%x\n", addr);
#define DELAY_US(x)
Macro for delays with us resolution.
uint8_t i2c_probe(uint8_t devaddr)
#define LM73_T_BUS_FREE_US
uint8_t i2c_master_writeread(uint8_t devaddr, uint8_t *writebuf, uint8_t bytestowrite, uint8_t *readbuf, uint8_t bytestoread)
static uint8_t sensor_create_lm73(void *pdata, bool raw, uint8_t addr, int8_t temp_offset)