BMP581 Driver 1.0.0
API reference
Loading...
Searching...
No Matches
bmp581_driver.hpp
Go to the documentation of this file.
1
24#pragma once
25
27#include "bmp581_registers.hpp"
28#include "bmp581_types.hpp"
29
30#include <cstddef>
31#include <cstdint>
32
33namespace bmp581 {
34
39template <typename BusT>
40class Driver {
41public:
42 explicit Driver(BusT& bus) noexcept : bus_(bus) {}
43
45 uint8_t ChipId() const noexcept { return chip_id_; }
46 bool Initialized() const noexcept { return chip_id_ != 0; }
47
48 // ------------------------------------------------------------------ lifecycle
49
58 chip_id_ = 0;
59 if (!bus_.EnsureInitialized()) {
61 }
62 if (!SelectSpi()) {
64 }
65 uint8_t id = 0;
66 if (!bus_.ReadRegs(reg::kChipId, &id, 1)) {
68 }
69 if (id == 0) {
71 }
72 DriverError nvm = NvmReadyCheck();
73 if (nvm == DriverError::NvmNotReady) {
74 /* Seen on hardware: a part that answers its chip id with STATUS == 0
75 * (core/NVM boot never completed after power-up). A soft reset
76 * re-runs the NVM boot; give it t_soft_reset + margin and re-check. */
77 if (!WriteResetCommand()) {
79 }
81 if (!SelectSpi()) {
83 }
84 nvm = NvmReadyCheck();
85 }
86 if (nvm != DriverError::None) {
88 }
89 if (id != chip_id::kPrimary && id != chip_id::kSecondary) {
91 }
92 chip_id_ = id;
94 }
95
110 if (!WriteResetCommand()) {
112 }
113 bus_.DelayUs(timing::kSoftResetUs);
114 if (!SelectSpi()) {
116 }
117 uint8_t id = 0;
118 if (!bus_.ReadRegs(reg::kChipId, &id, 1)) {
120 }
121 if (id == 0) {
123 }
124 const DriverError nvm = NvmReadyCheck();
125 if (nvm != DriverError::None) {
126 return DriverResult<void>::failure(nvm);
127 }
128 uint8_t st = 0;
129 if (!bus_.ReadRegs(reg::kIntStatus, &st, 1)) {
131 }
132 if ((st & int_status::kPorSoftResetComplete) == 0U) {
134 }
136 }
137
139 DriverResult<void> Configure(const Config& cfg) noexcept {
141 if (!r.ok()) return r;
142 r = SetOsrOdr(cfg.osr_odr);
143 if (!r.ok()) return r;
144 r = SetIir(cfg.iir);
145 if (!r.ok()) return r;
146 return SetPowerMode(cfg.power_mode);
147 }
148
149 // ---------------------------------------------------------------- power mode
150
152 uint8_t odr = 0;
153 if (!bus_.ReadRegs(reg::kOdrConfig, &odr, 1)) {
155 }
156 const uint8_t mode = odr & odr_config::kPowerModeMask;
157 if (mode == static_cast<uint8_t>(PowerMode::Standby)) {
158 const bool deep_disabled = (odr & odr_config::kDeepDisableMask) != 0U;
159 if (deep_disabled) {
161 }
162 return DeepStandbyOrStandby();
163 }
164 return DriverResult<PowerMode>::success(static_cast<PowerMode>(mode));
165 }
166
172 const auto cur = GetPowerMode();
173 if (!cur.ok()) {
174 return DriverResult<void>::failure(cur.error);
175 }
176 if (cur.value != PowerMode::Standby) {
177 if (!WritePowerModeBits(PowerMode::Standby, /*deep_disable=*/true)) {
179 }
180 bus_.DelayUs(timing::kStandbyUs);
181 }
182 switch (mode) {
186 return WritePowerModeBits(PowerMode::Standby, /*deep_disable=*/false)
192 return WritePowerModeBits(mode, /*deep_disable=*/true)
195 }
197 }
198
199 // ------------------------------------------------------------- OSR / ODR / IIR
200
202 uint8_t r[2]{};
203 if (!bus_.ReadRegs(reg::kOsrConfig, r, 2)) {
205 }
206 OsrOdrConfig c{};
208 c.osr_pressure = static_cast<Oversampling>((r[0] & osr_config::kPressOsMask) >>
210 c.pressure_enable = (r[0] & osr_config::kPressEnMask) != 0U;
211 c.odr = static_cast<Odr>((r[1] & odr_config::kOdrMask) >> odr_config::kOdrShift);
213 }
214
221 if (static_cast<uint8_t>(c.odr) < static_cast<uint8_t>(Odr::Hz5)) {
222 const auto cur = GetPowerMode();
223 if (!cur.ok()) {
224 return DriverResult<void>::failure(cur.error);
225 }
226 if (cur.value == PowerMode::DeepStandby) {
227 if (!WritePowerModeBits(PowerMode::Standby, true)) {
229 }
230 }
231 }
232 uint8_t r[2]{};
233 if (!bus_.ReadRegs(reg::kOsrConfig, r, 2)) {
235 }
236 r[0] = static_cast<uint8_t>((r[0] & ~(osr_config::kTempOsMask | osr_config::kPressOsMask |
238 (static_cast<uint8_t>(c.osr_temperature) & osr_config::kTempOsMask) |
239 ((static_cast<uint8_t>(c.osr_pressure) << osr_config::kPressOsShift) &
241 (c.pressure_enable ? osr_config::kPressEnMask : 0U));
242 r[1] = static_cast<uint8_t>((r[1] & ~odr_config::kOdrMask) |
243 ((static_cast<uint8_t>(c.odr) << odr_config::kOdrShift) &
245 return bus_.WriteRegs(reg::kOsrConfig, r, 2) ? DriverResult<void>::success()
247 }
248
250 uint8_t v = 0;
251 if (!bus_.ReadRegs(reg::kOsrEff, &v, 1)) {
253 }
254 EffectiveOsr e{};
256 e.osr_pressure = static_cast<Oversampling>((v & osr_eff::kPressOsMask) >> osr_eff::kPressOsShift);
257 e.odr_valid = (v & osr_eff::kOdrValidMask) != 0U;
259 }
260
262 uint8_t r[2]{};
263 if (!bus_.ReadRegs(reg::kDspConfig, r, 2)) {
265 }
266 IirConfig c{};
268 c.shadow_iir_pressure = (r[0] & dsp_config::kShadowIirPressMask) != 0U;
269 c.flush_forced_enable = (r[0] & dsp_config::kIirFlushForcedEnMask) != 0U;
270 c.temperature = static_cast<IirFilter>(r[1] & dsp_iir::kTempMask);
271 c.pressure = static_cast<IirFilter>((r[1] & dsp_iir::kPressMask) >> dsp_iir::kPressShift);
273 }
274
277 const auto cur = GetPowerMode();
278 if (!cur.ok()) {
279 return DriverResult<void>::failure(cur.error);
280 }
281 if (cur.value != PowerMode::Standby) {
282 const auto r = SetPowerMode(PowerMode::Standby);
283 if (!r.ok()) return r;
284 }
285 uint8_t r[2]{};
286 if (!bus_.ReadRegs(reg::kDspConfig, r, 2)) {
288 }
289 r[0] = static_cast<uint8_t>((r[0] & ~(dsp_config::kShadowIirTempMask | dsp_config::kShadowIirPressMask |
291 (c.shadow_iir_temperature ? dsp_config::kShadowIirTempMask : 0U) |
292 (c.shadow_iir_pressure ? dsp_config::kShadowIirPressMask : 0U) |
293 (c.flush_forced_enable ? dsp_config::kIirFlushForcedEnMask : 0U));
294 r[1] = static_cast<uint8_t>((r[1] & ~(dsp_iir::kTempMask | dsp_iir::kPressMask)) |
295 (static_cast<uint8_t>(c.temperature) & dsp_iir::kTempMask) |
296 ((static_cast<uint8_t>(c.pressure) << dsp_iir::kPressShift) &
298 if (!bus_.WriteRegs(reg::kDspConfig, r, 2)) {
300 }
301 if (cur.value != PowerMode::Standby && cur.value != PowerMode::DeepStandby) {
302 return SetPowerMode(cur.value);
303 }
305 }
306
307 // ---------------------------------------------------------------- interrupts
308
311 uint8_t cfg = 0;
312 if (!bus_.ReadRegs(reg::kIntConfig, &cfg, 1)) {
314 }
315 if (!WriteReg(reg::kIntSource, 0x00)) {
317 }
318 uint8_t st = 0;
319 if (!bus_.ReadRegs(reg::kIntStatus, &st, 1)) { // clears pending status
321 }
322 cfg = static_cast<uint8_t>((cfg & ~(int_config::kModeMask | int_config::kPolMask | int_config::kOdMask |
324 (c.mode == IntMode::Latched ? int_config::kModeMask : 0U) |
325 (c.polarity == IntPolarity::ActiveHigh ? int_config::kPolMask : 0U) |
326 (c.drive == IntDrive::OpenDrain ? int_config::kOdMask : 0U) |
327 (c.enable ? int_config::kEnableMask : 0U));
328 return WriteReg(reg::kIntConfig, cfg) ? DriverResult<void>::success()
330 }
331
333 const uint8_t v = static_cast<uint8_t>((s.data_ready ? int_source::kDataReady : 0U) |
334 (s.fifo_full ? int_source::kFifoFull : 0U) |
335 (s.fifo_threshold ? int_source::kFifoThreshold : 0U) |
336 (s.pressure_out_of_range ? int_source::kPressureOor : 0U));
337 return WriteReg(reg::kIntSource, v) ? DriverResult<void>::success()
339 }
340
343 uint8_t st = 0;
344 if (!bus_.ReadRegs(reg::kIntStatus, &st, 1)) {
346 }
348 }
349
352 const auto st = ReadInterruptStatus();
353 if (!st.ok()) {
354 return DriverResult<bool>::failure(st.error);
355 }
356 return DriverResult<bool>::success((st.value & int_status::kDataReady) != 0U);
357 }
358
359 // ---------------------------------------------------------------------- data
360
362 DriverResult<Sample> ReadSample(bool pressure_enabled = true) noexcept {
363 uint8_t d[6]{};
364 if (!bus_.ReadRegs(reg::kTempDataXlsb, d, 6)) {
366 }
367 return DriverResult<Sample>::success(DecodeSample(d, pressure_enabled));
368 }
369
371 static Sample DecodeSample(const uint8_t d[6], bool pressure_enabled) noexcept {
372 Sample s{};
373 uint32_t t = (static_cast<uint32_t>(d[2]) << 16) | (static_cast<uint32_t>(d[1]) << 8) | d[0];
374 if ((t & 0x800000U) != 0U) {
375 t |= 0xFF000000U;
376 }
377 s.temperature_raw = static_cast<int32_t>(t);
378 s.temperature_c = static_cast<float>(s.temperature_raw) / kTemperatureLsbPerC;
379 if (pressure_enabled) {
380 s.pressure_raw = (static_cast<uint32_t>(d[5]) << 16) | (static_cast<uint32_t>(d[4]) << 8) | d[3];
381 s.pressure_pa = static_cast<float>(s.pressure_raw) / kPressureLsbPerPa;
382 }
383 return s;
384 }
385
386 // ----------------------------------------------------------------------- NVM
387
392 DriverResult<uint16_t> ReadNvm(uint8_t nvm_addr) noexcept {
393 if (nvm_addr < nvm::kStartAddr || nvm_addr > nvm::kEndAddr) {
395 }
396 const auto cur = GetPowerMode();
397 if (!cur.ok()) {
398 return DriverResult<uint16_t>::failure(cur.error);
399 }
400 if (cur.value != PowerMode::Standby) {
401 const auto r = SetPowerMode(PowerMode::Standby);
402 if (!r.ok()) return DriverResult<uint16_t>::failure(r.error);
403 }
404 DriverError err = NvmReadyCheck();
405 if (err != DriverError::None) {
407 }
408 if (!WriteReg(reg::kNvmAddr, static_cast<uint8_t>(nvm_addr & 0x3FU)) ||
409 !WriteReg(reg::kCmd, cmd::kNvmFirst) || !WriteReg(reg::kCmd, cmd::kNvmReadEnable)) {
411 }
412 bus_.DelayUs(timing::kNvmReadyReadUs);
413 err = NvmReadyCheck();
414 if (err != DriverError::None) {
416 }
417 uint8_t d[2]{};
418 if (!bus_.ReadRegs(reg::kNvmDataLsb, d, 2)) {
420 }
421 if (cur.value != PowerMode::Standby) {
422 const auto r = SetPowerMode(cur.value);
423 if (!r.ok()) return DriverResult<uint16_t>::failure(r.error);
424 }
425 return DriverResult<uint16_t>::success(static_cast<uint16_t>((d[1] << 8) | d[0]));
426 }
427
428 // ---------------------------------------------------------------- raw access
429
431 uint8_t v = 0;
432 if (!bus_.ReadRegs(r, &v, 1)) {
434 }
436 }
437
438 DriverResult<void> WriteRegister(uint8_t r, uint8_t v) noexcept {
439 return WriteReg(r, v) ? DriverResult<void>::success()
441 }
442
443private:
444 static constexpr Interface kInterface = kBusInterface<BusT>;
445
446 bool WriteReg(uint8_t r, uint8_t v) noexcept { return bus_.WriteRegs(r, &v, 1); }
447
454 bool WriteResetCommand() noexcept {
455 const bool sent = WriteReg(reg::kCmd, cmd::kSoftReset);
456 if constexpr (kInterface == Interface::Spi) {
457 return sent;
458 } else {
459 (void)sent;
460 return true;
461 }
462 }
463
470 bool SelectSpi() noexcept {
471 if constexpr (kInterface == Interface::I2c) {
472 return true;
473 } else {
474 uint8_t dummy = 0;
475 return bus_.ReadRegs(reg::kChipId, &dummy, 1);
476 }
477 }
478
479 bool WritePowerModeBits(PowerMode mode, bool deep_disable) noexcept {
480 uint8_t odr = 0;
481 if (!bus_.ReadRegs(reg::kOdrConfig, &odr, 1)) {
482 return false;
483 }
484 odr = static_cast<uint8_t>((odr & ~(odr_config::kPowerModeMask | odr_config::kDeepDisableMask)) |
485 (static_cast<uint8_t>(mode) & odr_config::kPowerModeMask) |
487 return WriteReg(reg::kOdrConfig, odr);
488 }
489
492 DriverResult<PowerMode> DeepStandbyOrStandby() noexcept {
493 uint8_t fifo_sel = 0;
494 if (!bus_.ReadRegs(reg::kFifoSel, &fifo_sel, 1)) {
496 }
497 const auto osr = GetOsrOdr();
498 if (!osr.ok()) return DriverResult<PowerMode>::failure(osr.error);
499 const auto iir = GetIir();
500 if (!iir.ok()) return DriverResult<PowerMode>::failure(iir.error);
501 if ((fifo_sel & 0x03U) == 0U &&
502 static_cast<uint8_t>(osr.value.odr) > static_cast<uint8_t>(Odr::Hz5) &&
503 iir.value.temperature == IirFilter::Bypass && iir.value.pressure == IirFilter::Bypass) {
505 }
507 }
508
509 DriverError NvmReadyCheck() noexcept {
510 uint8_t st = 0;
511 if (!bus_.ReadRegs(reg::kStatus, &st, 1)) {
512 return DriverError::Bus;
513 }
514 if ((st & status::kNvmCmdErr) != 0U) {
516 }
517 if ((st & status::kNvmRdy) == 0U || (st & status::kNvmErr) != 0U) {
519 }
520 return DriverError::None;
521 }
522
523 BusT& bus_;
524 uint8_t chip_id_{0};
525};
526
527} // namespace bmp581
CRTP register transport for the Bosch BMP581 (I2C or SPI).
BMP581 register map, bit fields, enumerations and timing constants.
BMP581 driver types: results, configuration, samples.
BMP581 client.
Definition bmp581_driver.hpp:40
DriverResult< void > SetOsrOdr(const OsrOdrConfig &c) noexcept
Write OSR_CONFIG / ODR_CONFIG preserving power-mode bits. ODR faster than 5 Hz is only valid with dee...
Definition bmp581_driver.hpp:220
DriverResult< Sample > ReadSample(bool pressure_enabled=true) noexcept
Burst-read 0x1D..0x22 → temperature (1/65536 °C) and pressure (1/64 Pa).
Definition bmp581_driver.hpp:362
DriverResult< IirConfig > GetIir() noexcept
Definition bmp581_driver.hpp:261
DriverResult< void > SoftReset() noexcept
Soft reset: CMD = 0xB6, wait t_soft_res (2 ms), reselect SPI, verify.
Definition bmp581_driver.hpp:109
DriverResult< PowerMode > GetPowerMode() noexcept
Definition bmp581_driver.hpp:151
DriverResult< uint8_t > ReadRegister(uint8_t r) noexcept
Definition bmp581_driver.hpp:430
DriverResult< bool > DataReady() noexcept
Convenience: INT_STATUS.drdy_data_reg.
Definition bmp581_driver.hpp:351
DriverResult< uint16_t > ReadNvm(uint8_t nvm_addr) noexcept
Read one 16-bit NVM user word (0x20..0x22). Requires standby; previous mode is restored.
Definition bmp581_driver.hpp:392
DriverResult< void > SetIir(const IirConfig &c) noexcept
IIR registers are writable in standby only; previous mode is restored.
Definition bmp581_driver.hpp:276
DriverResult< void > SetPowerMode(PowerMode mode) noexcept
Set power mode. Always hops through standby (t_standby 2.5 ms) as the data sheet requires before ente...
Definition bmp581_driver.hpp:171
DriverResult< uint8_t > ReadInterruptStatus() noexcept
INT_STATUS (read clears in pulsed mode).
Definition bmp581_driver.hpp:342
Driver(BusT &bus) noexcept
Definition bmp581_driver.hpp:42
static Sample DecodeSample(const uint8_t d[6], bool pressure_enabled) noexcept
Decode a 6-byte data-register burst (also used by tests).
Definition bmp581_driver.hpp:371
DriverResult< void > Configure(const Config &cfg) noexcept
Standby → OSR/ODR → IIR → power mode, in the order the device requires.
Definition bmp581_driver.hpp:139
DriverResult< OsrOdrConfig > GetOsrOdr() noexcept
Definition bmp581_driver.hpp:201
DriverResult< void > ConfigureInterrupt(const InterruptConfig &c) noexcept
Disable sources, clear status, then write mode/polarity/drive/enable.
Definition bmp581_driver.hpp:310
uint8_t ChipId() const noexcept
Chip id read by the last successful Init() (0 before).
Definition bmp581_driver.hpp:45
DriverResult< void > SelectInterruptSources(const InterruptSources &s) noexcept
Definition bmp581_driver.hpp:332
DriverResult< EffectiveOsr > GetEffectiveOsr() noexcept
Definition bmp581_driver.hpp:249
DriverResult< void > Init() noexcept
Verify chip id (0x50 / 0x51) and NVM readiness.
Definition bmp581_driver.hpp:57
DriverResult< void > WriteRegister(uint8_t r, uint8_t v) noexcept
Definition bmp581_driver.hpp:438
bool Initialized() const noexcept
Definition bmp581_driver.hpp:46
constexpr uint8_t kSecondary
Definition bmp581_registers.hpp:26
constexpr uint8_t kPrimary
Definition bmp581_registers.hpp:25
constexpr uint8_t kNvmReadEnable
Definition bmp581_registers.hpp:68
constexpr uint8_t kSoftReset
Definition bmp581_registers.hpp:66
constexpr uint8_t kNvmFirst
Definition bmp581_registers.hpp:67
constexpr uint8_t kShadowIirTempMask
Definition bmp581_registers.hpp:149
constexpr uint8_t kIirFlushForcedEnMask
Definition bmp581_registers.hpp:148
constexpr uint8_t kShadowIirPressMask
Definition bmp581_registers.hpp:151
constexpr uint8_t kTempMask
Definition bmp581_registers.hpp:158
constexpr uint8_t kPressMask
Definition bmp581_registers.hpp:159
constexpr uint8_t kPressShift
Definition bmp581_registers.hpp:160
constexpr uint8_t kEnableMask
Definition bmp581_registers.hpp:117
constexpr uint8_t kPolMask
0 active-low, 1 active-high
Definition bmp581_registers.hpp:115
constexpr uint8_t kOdMask
0 push-pull, 1 open-drain
Definition bmp581_registers.hpp:116
constexpr uint8_t kModeMask
0 pulsed, 1 latched
Definition bmp581_registers.hpp:114
constexpr uint8_t kFifoThreshold
Definition bmp581_registers.hpp:108
constexpr uint8_t kPressureOor
Definition bmp581_registers.hpp:109
constexpr uint8_t kDataReady
Definition bmp581_registers.hpp:106
constexpr uint8_t kFifoFull
Definition bmp581_registers.hpp:107
constexpr uint8_t kDataReady
Definition bmp581_registers.hpp:97
constexpr uint8_t kPorSoftResetComplete
Definition bmp581_registers.hpp:101
constexpr uint8_t kEndAddr
Definition bmp581_registers.hpp:84
constexpr uint8_t kDeepDisableMask
1 = deep standby disabled
Definition bmp581_registers.hpp:135
constexpr uint8_t kPowerModeMask
Definition bmp581_registers.hpp:132
constexpr uint8_t kOdrShift
Definition bmp581_registers.hpp:134
constexpr uint8_t kOdrMask
Definition bmp581_registers.hpp:133
constexpr uint8_t kPressOsMask
Definition bmp581_registers.hpp:125
constexpr uint8_t kPressEnMask
Definition bmp581_registers.hpp:127
constexpr uint8_t kPressOsShift
Definition bmp581_registers.hpp:126
constexpr uint8_t kTempOsMask
Definition bmp581_registers.hpp:124
constexpr uint8_t kPressOsShift
Definition bmp581_registers.hpp:142
constexpr uint8_t kTempOsMask
Definition bmp581_registers.hpp:140
constexpr uint8_t kPressOsMask
Definition bmp581_registers.hpp:141
constexpr uint8_t kOdrValidMask
Definition bmp581_registers.hpp:143
constexpr uint8_t kOdrConfig
Definition bmp581_registers.hpp:59
constexpr uint8_t kFifoSel
Definition bmp581_registers.hpp:39
constexpr uint8_t kOsrConfig
Definition bmp581_registers.hpp:58
constexpr uint8_t kOsrEff
Definition bmp581_registers.hpp:60
constexpr uint8_t kIntConfig
Definition bmp581_registers.hpp:35
constexpr uint8_t kTempDataXlsb
0x1D..0x1F temperature, 0x20..0x22 pressure
Definition bmp581_registers.hpp:40
constexpr uint8_t kNvmAddr
Definition bmp581_registers.hpp:49
constexpr uint8_t kNvmDataLsb
Definition bmp581_registers.hpp:50
constexpr uint8_t kCmd
Definition bmp581_registers.hpp:61
constexpr uint8_t kIntStatus
Definition bmp581_registers.hpp:46
constexpr uint8_t kDspConfig
Definition bmp581_registers.hpp:52
constexpr uint8_t kChipId
Definition bmp581_registers.hpp:31
constexpr uint8_t kIntSource
Definition bmp581_registers.hpp:36
constexpr uint8_t kStatus
Definition bmp581_registers.hpp:47
constexpr uint8_t kNvmRdy
Definition bmp581_registers.hpp:90
constexpr uint8_t kNvmErr
Definition bmp581_registers.hpp:91
constexpr uint8_t kNvmCmdErr
Definition bmp581_registers.hpp:92
constexpr uint32_t kSoftResetUs
Definition bmp581_registers.hpp:74
constexpr uint32_t kStartupUs
t_startup: standby to start of measurement
Definition bmp581_registers.hpp:78
constexpr uint32_t kStandbyUs
Definition bmp581_registers.hpp:75
constexpr uint32_t kNvmReadyReadUs
Definition bmp581_registers.hpp:76
Definition bmp581.hpp:19
Interface
Bus an adapter drives, declared as static constexpr Interface kInterface (optional).
Definition bmp581_bus_interface.hpp:45
constexpr float kTemperatureLsbPerC
temperature_c = raw / 65536
Definition bmp581_registers.hpp:223
constexpr Interface kBusInterface
The interface adapter Bus declares, or Interface::Unspecified.
Definition bmp581_bus_interface.hpp:69
IirFilter
IIR filter coefficient (DSP_IIR).
Definition bmp581_registers.hpp:211
Odr
Output data rate (ODR_CONFIG bits 6:2). Codes ascend as rate descends.
Definition bmp581_registers.hpp:178
constexpr float kPressureLsbPerPa
Raw → engineering scaling (data sheet §4.x, Bosch API).
Definition bmp581_registers.hpp:222
PowerMode
Power modes (ODR_CONFIG bits 1:0; deep standby = standby with deep_dis = 0).
Definition bmp581_registers.hpp:164
@ Continuous
back-to-back conversions
@ DeepStandby
pseudo-mode: standby + deep_dis cleared
@ Normal
periodic at ODR
@ Forced
one conversion then standby
DriverError
Driver-level error codes (stable for logging / telemetry).
Definition bmp581_types.hpp:17
@ NvmInvalidAddr
outside 0x20..0x22
@ NvmCommandError
STATUS.nvm_cmd_err set.
@ NvmNotReady
STATUS.nvm_rdy clear or nvm_err set.
@ Bus
register read/write failed
@ PorSoftReset
INT_STATUS.por_softreset_complete not set after reset.
@ NotInitialized
transport EnsureInitialized() failed
@ InvalidChipId
CHIP_ID not 0x50 / 0x51.
Oversampling
Oversampling (OSR_CONFIG).
Definition bmp581_registers.hpp:173
Convenience: one-call configuration for Driver::Configure().
Definition bmp581_types.hpp:127
Definition bmp581_types.hpp:47
static constexpr DriverResult success(T v) noexcept
Definition bmp581_types.hpp:54
static constexpr DriverResult failure(DriverError e) noexcept
Definition bmp581_types.hpp:55
Effective oversampling and ODR validity (OSR_EFF).
Definition bmp581_types.hpp:96
Oversampling osr_temperature
Definition bmp581_types.hpp:97
IIR configuration (DSP_CONFIG + DSP_IIR). Writable in standby only.
Definition bmp581_types.hpp:87
bool shadow_iir_temperature
data registers show IIR-filtered temperature
Definition bmp581_types.hpp:90
Interrupt pin configuration (INT_CONFIG).
Definition bmp581_types.hpp:103
Interrupt sources (INT_SOURCE).
Definition bmp581_types.hpp:111
Oversampling / ODR / pressure-enable (OSR_CONFIG + ODR_CONFIG).
Definition bmp581_types.hpp:79
Oversampling osr_temperature
Definition bmp581_types.hpp:80
One pressure / temperature sample.
Definition bmp581_types.hpp:119
int32_t temperature_raw
24-bit two's complement, 1/65536 °C
Definition bmp581_types.hpp:121