39template <
typename BusT>
42 explicit Driver(BusT& bus) noexcept : bus_(bus) {}
45 uint8_t
ChipId() const noexcept {
return chip_id_; }
59 if (!bus_.EnsureInitialized()) {
77 if (!WriteResetCommand()) {
84 nvm = NvmReadyCheck();
110 if (!WriteResetCommand()) {
141 if (!r.ok())
return r;
143 if (!r.ok())
return r;
145 if (!r.ok())
return r;
162 return DeepStandbyOrStandby();
192 return WritePowerModeBits(mode,
true)
221 if (
static_cast<uint8_t
>(c.odr) <
static_cast<uint8_t
>(
Odr::Hz5)) {
242 r[1] =
static_cast<uint8_t
>((r[1] & ~odr_config::kOdrMask) |
283 if (!r.ok())
return r;
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) {
379 if (pressure_enabled) {
380 s.pressure_raw = (
static_cast<uint32_t
>(d[5]) << 16) | (
static_cast<uint32_t
>(d[4]) << 8) | d[3];
393 if (nvm_addr < nvm::kStartAddr || nvm_addr >
nvm::kEndAddr) {
408 if (!WriteReg(
reg::kNvmAddr,
static_cast<uint8_t
>(nvm_addr & 0x3FU)) ||
413 err = NvmReadyCheck();
432 if (!bus_.ReadRegs(r, &v, 1)) {
499 const auto iir =
GetIir();
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
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
@ 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