M5Unit-IMU 0.0.2 git rev:e5b00aa
Loading...
Searching...
No Matches
unit_bmm350.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_IMU_UNIT_UNIT_BMM350_HPP
11#define M5_UNIT_IMU_UNIT_UNIT_BMM350_HPP
12
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15#include <memory>
16#include "unit_bmm350_data.hpp"
18
19namespace m5 {
20namespace unit {
21
26class UnitBMM350 : public Component,
27 public PeriodicMeasurementAdapter<UnitBMM350, bmm350::Data>,
29 M5_UNIT_COMPONENT_HPP_BUILDER(UnitBMM350, 0x14);
30
31public:
38 struct config_t {
40 bool start_periodic{true};
42 bmm350::DataRate rate{bmm350::DataRate::Rate100Hz};
44 bmm350::Averaging avg{bmm350::Averaging::X4};
45 };
46
49 explicit UnitBMM350(const uint8_t addr = DEFAULT_ADDRESS);
51 virtual ~UnitBMM350()
52 {
53 }
54
56 virtual bool begin() override;
59 virtual void update(const bool force = false) override;
60
66 {
67 return _cfg;
68 }
71 void config(const config_t& cfg)
72 {
73 _cfg = cfg;
74 }
76
82 bool writeDataRate(const bmm350::DataRate rate);
86 bool writeAveraging(const bmm350::Averaging avg);
96
105 bool softReset();
107
110
124
127
135 bool sleep() override;
143 bool wakeup() override;
145
150 virtual m5::imu::Capability imuSpec() const override
151 {
152 return m5::imu::Capability::Mag | m5::imu::Capability::Temp;
153 }
160 virtual void imuConvertParam(m5::imu::imu_convert_param_t& out) const override;
162
163protected:
164 bool start_periodic_measurement(const bmm350::DataRate rate, const bmm350::Averaging avg);
165 bool start_periodic_measurement();
166 bool stop_periodic_measurement();
167 bool read_measurement(bmm350::Data& d);
168 bool write_register8_verified(const uint8_t reg, const uint8_t val);
169 // BMM350 I2C reads are always prefixed with 2 dummy bytes; every register read
170 // (including REG_CHIP_ID) must go through this wrapper.
171 bool read_registers(const uint8_t reg, uint8_t* out, const uint32_t len);
172 bool read_register8(const uint8_t reg, uint8_t& out);
173 bool download_otp(bmm350::otp_compensation_t& comp);
174 // AGGR_SET->UPD_OAE->SUS->Normal tail shared by begin() and the writeDataRate()/
175 // writeAveraging() setters (Bosch bmm350_set_odr_performance() + bmm350_set_powermode():
176 // the SUS step is always issued here since REG_PMU_CMD was just left at UPD_OAE). Verifies
177 // REG_PMU_CMD_STATUS_0.pwr_mode_is_normal after the Normal transition.
178 bool commit_odr_avg(const bmm350::DataRate rate, const bmm350::Averaging avg);
179
180 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitBMM350, bmm350::Data);
181
182private:
183 config_t _cfg{};
184 bmm350::otp_compensation_t _comp{};
185 uint32_t _pushed{}, _consumed{}; // readImuRaw pop counters (do not disturb latest()/oldest())
186 std::unique_ptr<m5::container::CircularBuffer<bmm350::Data>> _data{};
187};
188
189namespace bmm350 {
192constexpr uint32_t DEFAULT_STORED_SIZE{8};
193
194namespace command {
196// Register addresses (I2C addr 0x14 (ADSEL=LOW) / 0x15 (ADSEL=HIGH))
197constexpr uint8_t REG_CHIP_ID{0x00};
198constexpr uint8_t REG_PMU_CMD_AGGR_SET{0x04}; // bits[3:0]=odr, bits[5:4]=avg
199constexpr uint8_t REG_PMU_CMD{0x06};
200constexpr uint8_t REG_PMU_CMD_STATUS_0{0x07}; // bit3=pwr_mode_is_normal, bit4=cmd_is_illegal
201constexpr uint8_t REG_INT_CTRL{0x2E}; // bit7 = drdy_data_reg_en
202constexpr uint8_t REG_INT_STATUS{0x30}; // bit2 = drdy_data_reg (clears on read)
203constexpr uint8_t REG_MAG_X_XLSB{0x31}; // 12 bytes: mag X/Y/Z (24bit each) + temperature (24bit)
204constexpr uint8_t REG_OTP_CMD{0x50};
205constexpr uint8_t REG_OTP_DATA_MSB{0x52};
206constexpr uint8_t REG_OTP_DATA_LSB{0x53};
207constexpr uint8_t REG_OTP_STATUS{0x55};
208constexpr uint8_t REG_CMD{0x7E};
210} // namespace command
211} // namespace bmm350
212
213} // namespace unit
214} // namespace m5
215#endif
Thin contract between measurement units and consumers (e.g. AHRS)
Definition imu_data_source.hpp:27
3-axis magnetometer unit (U231, GROVE)
Definition unit_bmm350.hpp:28
virtual m5::imu::Capability imuSpec() const override
Capability of this unit.
Definition unit_bmm350.hpp:150
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_bmm350.cpp:301
config_t config() const
Gets the configuration.
Definition unit_bmm350.hpp:65
bool writeAveraging(const bmm350::Averaging avg)
Write the averaging factor (clamped to what the current rate accepts)
Definition unit_bmm350.cpp:360
virtual m5::imu::Capability readImuRaw(m5::imu::imu_raw_data_t &out) override
Read the latest raw IMU data.
Definition unit_bmm350.cpp:537
bool readDataRate(bmm350::DataRate &rate)
Read the output data rate from the device (REG_PMU_CMD_AGGR_SET bits[3:0])
Definition unit_bmm350.cpp:375
bool sleep() override
Put the chip into suspend mode (REG_PMU_CMD suspend)
Definition unit_bmm350.cpp:306
bool softReset()
Soft reset (REG_CMD CMD_SOFTRESET), then re-run the mandatory post-reset initialization (OTP download...
Definition unit_bmm350.cpp:199
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_bmm350.cpp:296
void config(const config_t &cfg)
Set the configuration.
Definition unit_bmm350.hpp:71
bool writeDataRate(const bmm350::DataRate rate)
Write the output data rate (averaging is re-clamped to the new rate)
Definition unit_bmm350.cpp:344
bool readAveraging(bmm350::Averaging &avg)
Read the averaging factor from the device (REG_PMU_CMD_AGGR_SET bits[5:4])
Definition unit_bmm350.cpp:390
virtual void update(const bool force=false) override
Update the unit.
Definition unit_bmm350.cpp:239
virtual void imuConvertParam(m5::imu::imu_convert_param_t &out) const override
Gets the conversion parameters for raw IMU data.
Definition unit_bmm350.cpp:563
UnitBMM350(const uint8_t addr=DEFAULT_ADDRESS)
Construct with the I2C address the chip will answer on.
Definition unit_bmm350.cpp:153
virtual bool begin() override
Begin the unit.
Definition unit_bmm350.cpp:162
virtual ~UnitBMM350()
Destructor.
Definition unit_bmm350.hpp:51
bool wakeup() override
Return the chip to normal mode.
Definition unit_bmm350.cpp:320
Public interface for IMU data providers.
Capability
Capability of the IMU data source (bitwise combinable)
Definition imu_types.hpp:22
Top level namespace of M5Stack.
Definition ahrs_controller.cpp:26
Unit-related namespace.
Raw to physical unit conversion coefficients.
Definition imu_types.hpp:69
Unified raw data (chip-native axes, no remap applied)
Definition imu_types.hpp:57
Settings for begin()
Definition unit_bmm350.hpp:38
bool start_periodic
Start periodic measurement on begin()?
Definition unit_bmm350.hpp:40
bmm350::Averaging avg
Averaging factor (clamped to what the rate accepts, see clamp_averaging())
Definition unit_bmm350.hpp:44
bmm350::DataRate rate
Output data rate.
Definition unit_bmm350.hpp:42
One measurement (12 bytes burst from REG_MAG_X_XLSB, register 0x31): 9 bytes magnetometer (X,...
Definition unit_bmm350_data.hpp:152
Per-chip OTP compensation coefficients (read out at boot from the sensor's one-time-programmable memo...
Definition unit_bmm350_data.hpp:102
BMM350 setting enums and measurement data (framework independent)
Averaging
Averaging factor (REG_PMU_CMD_AGGR_SET register 0x04, bits[5:4])
Definition unit_bmm350_data.hpp:41
DataRate
Output data rate (REG_PMU_CMD_AGGR_SET register 0x04, bits[3:0])
Definition unit_bmm350_data.hpp:25