diff --git a/drivers/sensor/bosch/bmp581/bmp581.c b/drivers/sensor/bosch/bmp581/bmp581.c index 8d36b8e846513..f556a94af5133 100644 --- a/drivers/sensor/bosch/bmp581/bmp581.c +++ b/drivers/sensor/bosch/bmp581/bmp581.c @@ -405,11 +405,17 @@ static int bmp581_sample_fetch(const struct device *dev, enum sensor_channel cha ret = bmp581_reg_read_rtio(&conf->bus, BMP5_REG_TEMP_DATA_XLSB, data, 6); if (ret == BMP5_OK) { - /* convert raw sensor data to sensor_value. Shift the decimal part by 1 decimal - * place to compensate for the conversion in sensor_value_to_double() + /* convert raw sensor data to sensor_value. + * BMP581 temperature data is 24-bit signed with LSB = 1/65536 °C */ - drv->last_sample.temperature.val1 = data[2]; - drv->last_sample.temperature.val2 = (data[1] << 8 | data[0]) * 10; + int32_t raw_temp = ((int32_t)((uint32_t)(((uint32_t)data[2] << 16) | + ((uint16_t)data[1] << 8) | data[0]) + << 8) >> + 8); + + /* Convert raw temperature: LSB = 1/65536 °C, val2 in millionths */ + drv->last_sample.temperature.val1 = raw_temp / 65536; + drv->last_sample.temperature.val2 = ((int64_t)(raw_temp % 65536) * 1000000) / 65536; if (drv->osr_odr_press_config.press_en == BMP5_ENABLE) { /* convert raw sensor data to sensor_value. Shift the decimal part by