#include "project.h" #define DS18B20_CONVERT 0x44 #define DS18B20_WRITE_SCRATCHPAD 0x4e #define DS18B20_READ_SCRATCHPAD 0xbe #define TIMEOUT 150 unsigned extract_leu16 (uint8_t *d) { uint32_t u; u = (uint32_t) d[0] | (((uint32_t) d[1]) << 8); return u; } int extract_les16 (uint8_t *d) { uint32_t u; u = extract_leu16 (d); if (u & 0x8000) u |= 0xffff0000; return (int) u; } /* do not call from interrupt context (ie ticker)*/ int ds18b20_read_sp (const Onewire_addr *a, uint8_t *buf, unsigned len) { if (onewire_reset_and_select (a)) return ~0U; onewire_write_byte (DS18B20_READ_SCRATCHPAD); onewire_read_bytes (buf, len); if ((len == 9) && onewire_check_crc (buf, 8, buf[8])) return ~0U; return 0; } int ds18b20_write_sp (const Onewire_addr *a, uint8_t *buf, unsigned len) { if (onewire_reset_and_select (a)) return ~0U; onewire_write_byte (DS18B20_WRITE_SCRATCHPAD); onewire_write_bytes (buf, len); return 0; } int ds18b20_convert (const Onewire_addr *a, unsigned timeout) { if (onewire_reset_and_select (a)) return ~0U; onewire_write_byte (DS18B20_CONVERT); if (timeout && onewire_wait_complete (timeout)) return ~0U; return 0; } int ds18b20_set_12 (const Onewire_addr *a) { uint8_t buf[9]; if (ds18b20_read_sp (a, buf, 9)) return 1; buf[0] = 0x0; buf[1] = 0x0; buf[2] = 0x7f; /* 12 bit conversions */ return ds18b20_write_sp (a, buf, 3); } int ds18b20_read (const Onewire_addr *a, int *temp) { uint8_t buf[9]; if (ds18b20_read_sp (a, buf, 9)) return 1; *temp = (extract_les16 (buf) * 500) >> 3; return 0; } int ds18b20_set_12_convert (const Onewire_addr *a) { if (ds18b20_set_12 (a)) return 1; if (ds18b20_convert (a, 0)) return 1; return 0; } /* do not call from interrupt context (ie ticker)*/ int ds18b20_set_12_convert_and_read (const Onewire_addr *a, int *temp) { if (ds18b20_set_12 (a)) return 1; if (ds18b20_convert (a, TIMEOUT)) return 1; return ds18b20_read (a, temp); }