STM32F103CBT6_Thermograph/Core/Src/ds18b20_onewire.c

44 lines
1.2 KiB
C

#include "ds18b20_onewire.h"
static onewire_ret_t ds18b20_match_rom(ds18b20_t *ds) {
onewire_bus_write_byte(ds->ow_driver, 0x55); // Issue match ROM
for(uint8_t i = 0; i < 8; i++) {
onewire_bus_write_byte(ds->ow_driver, ds->rom.rom_num[i]);
}
return OW_OK;
}
onewire_ret_t ds18b20_start_convert(ds18b20_t *ds) {
onewire_bus_reset(ds->ow_driver);
ds18b20_match_rom(ds);
onewire_bus_write_byte(ds->ow_driver, 0x44); // Issue convert T command
return OW_OK;
}
uint8_t ds18b20_check_busy(ds18b20_t *ds) {
uint8_t done = onewire_bus_read_bit(ds->ow_driver);
if(done) return 0;
return 1;
}
onewire_ret_t ds18b20_read_temperature(ds18b20_t *ds, ds18b20_temp_t *temp) {
onewire_bus_reset(ds->ow_driver);
ds18b20_match_rom(ds);
onewire_bus_write_byte(ds->ow_driver, 0xBE); // Issue read scrachpad command
temp->t_low = onewire_bus_read_byte(ds->ow_driver);
temp->t_high = onewire_bus_read_byte(ds->ow_driver);
onewire_bus_reset(ds->ow_driver);
temp->t_decimal = (temp->t_high & 0xF8) ? 0x8000 : 0x0000;
temp->t_decimal |= (temp->t_high & 0x07) << 8U;
temp->t_decimal |= temp->t_low;
temp->t_decimal = temp->t_decimal * 625 / 1000;
return OW_OK;
}