int8_t ow_temp_power(ow_rom_code_t *rom) { #if ONEWIRE_BUSCOUNT > 1 uint8_t busmask = 1 << (ONEWIRE_STARTPIN); // FIXME: currently only on 1st bus #else uint8_t busmask = ONEWIRE_BUSMASK; #endif int8_t ret; if (rom == NULL) ret = ow_skip_rom(); else { if (!ow_temp_sensor(rom)) return -2; ret = ow_match_rom(rom); } if (ret < 0) return ret; /* transmit command byte */ ow_write_byte(busmask, OW_FUNC_READ_POWER); return (int8_t)(ow_read(busmask)); }
static void ds18b20_start(void) { ow_reset(); ow_skip_rom(); ow_write_byte(DS18B20_CMD_CONVERT_T); }
int8_t ow_eeprom_read(ow_rom_code_t *rom, void *data) { #if ONEWIRE_BUSCOUNT > 1 uint8_t busmask = 1 << (ONEWIRE_STARTPIN); // FIXME: currently only on 1st bus #else uint8_t busmask = ONEWIRE_BUSMASK; #endif int8_t ret; if (rom == NULL) ret = ow_skip_rom(); else { /* check for known family code */ if (!(rom->family == OW_FAMILY_DS2502E48)) return -2; ret = ow_match_rom(rom); } if (ret < 0) return ret; /* transmit command byte */ ow_write_byte(busmask, OW_FUNC_READ_MEMORY); /* transmit address (mac address starts at offset 5 */ ow_write_byte(busmask, 5); ow_write_byte(busmask, 0); /* read back crc sum of the command */ uint8_t crc = ow_read_byte(busmask); /* check crc */ uint8_t crc2 = 0; crc2 = _crc_ibutton_update(crc2, OW_FUNC_READ_MEMORY); crc2 = _crc_ibutton_update(crc2, 5); crc2 = _crc_ibutton_update(crc2, 0); if (crc != crc2) return -2; uint8_t *p = (uint8_t *)data+5; /* read 6 byte of data */ for (uint8_t i = 0; i < 6; i++) *p-- = ow_read_byte(busmask); return 0; }
int8_t ow_temp_read_scratchpad(ow_rom_code_t *rom, ow_temp_scratchpad_t *scratchpad) { uint8_t busmask; int8_t ret; if (rom == NULL) ret = ow_skip_rom(); else { /* check for known family code */ if (!ow_temp_sensor(rom)) return -3; ret = ow_match_rom(rom); } if (ret < 0) return ret; /* transmit command byte */ ow_write_byte(ONEWIRE_BUSMASK, OW_FUNC_READ_SP); #if ONEWIRE_BUSCOUNT > 1 for (uint8_t bus = 0; bus < ONEWIRE_BUSCOUNT; bus++) { /* read 9 bytes from each onewire bus */ busmask = (uint8_t)(1 << (bus + ONEWIRE_STARTPIN)); #else busmask = ONEWIRE_BUSMASK; #endif for (uint8_t i = 0; i < 9; i++) { scratchpad->bytewise[i] = ow_read_byte(busmask); } /* check CRC (last byte) */ if (scratchpad->crc == crc_checksum(&scratchpad->bytewise, 8)) { /* return if we got a valid response from one device */ return 1; } #if ONEWIRE_BUSCOUNT > 1 } #endif return -2; }
int8_t ow_temp_start_convert(ow_rom_code_t *rom, uint8_t wait) { int8_t ret; if (rom == NULL) ret = ow_skip_rom(); else { /* check for known family code */ if (!ow_temp_sensor(rom)) return -2; ret = ow_match_rom(rom); } if (ret < 0) return ret; /* transmit command byte */ ow_write_byte(ONEWIRE_BUSMASK, OW_FUNC_CONVERT); OW_CONFIG_OUTPUT(ONEWIRE_BUSMASK); OW_HIGH(ONEWIRE_BUSMASK); if (!wait) return 0; _delay_ms(800); /* The specification say, that we have to wait at least 500ms in parasite mode to wait for the end of the conversion. 800ms works more reliably */ while(!ow_read(ONEWIRE_BUSMASK)); return 1; }