10#ifndef M5_UNIT_IMU_UNIT_UNIT_BMI270_HPP
11#define M5_UNIT_IMU_UNIT_UNIT_BMI270_HPP
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
33 public PeriodicMeasurementAdapter<UnitBMI270, bmi270::Data>,
35 M5_UNIT_COMPONENT_HPP_BUILDER(
UnitBMI270, 0x69);
76 explicit UnitBMI270(
const uint8_t addr = DEFAULT_ADDRESS);
83 virtual bool begin()
override;
86 virtual void update(
const bool force =
false)
override;
204 bool sleep()
override;
223 return Capability::Accel | Capability::Gyro | Capability::Temp;
240 bool start_periodic_measurement();
241 bool stop_periodic_measurement();
247 bool write_register8_verified(
const uint8_t reg,
const uint8_t val);
251 bool read_register8_quiet(
const uint8_t reg, uint8_t& out);
257 bool recover_wedged_interface(
const uint8_t
id);
262 bool upload_config();
273 bmi270::AccelRange _accel_range{};
274 bmi270::GyroRange _gyro_range{};
275 bmi270::AccelODR _accel_odr{};
276 bmi270::GyroODR _gyro_odr{};
281 bmi270::FilterPerf _accel_filter_perf{};
282 bmi270::AccelBwp _accel_bwp{};
283 bmi270::FilterPerf _gyro_filter_perf{};
284 bmi270::GyroBwp _gyro_bwp{};
285 int16_t _last_temp{};
286 uint32_t _pushed{}, _consumed{};
287 std::unique_ptr<m5::container::CircularBuffer<bmi270::Data>> _data{};
293constexpr uint32_t DEFAULT_STORED_SIZE{8};
298constexpr uint8_t REG_DATA_0{0x04};
299constexpr uint8_t REG_STATUS{0x03};
301constexpr uint8_t REG_DATA_8{0x0C};
302constexpr uint8_t REG_INT_STATUS_1{0x1D};
303constexpr uint8_t REG_TEMPERATURE_0{0x22};
304constexpr uint8_t REG_INTERNAL_STATUS{0x21};
305constexpr uint8_t REG_ACC_CONF{0x40};
306constexpr uint8_t REG_ACC_RANGE{0x41};
307constexpr uint8_t REG_GYR_CONF{0x42};
308constexpr uint8_t REG_GYR_RANGE{0x43};
309constexpr uint8_t REG_AUX_DEV_ID{0x4B};
311constexpr uint8_t REG_AUX_CONF{0x44};
312constexpr uint8_t REG_AUX_IF_CONF{
314constexpr uint8_t REG_AUX_RD_ADDR{0x4D};
315constexpr uint8_t REG_AUX_WR_ADDR{0x4E};
316constexpr uint8_t REG_AUX_WR_DATA{0x4F};
317constexpr uint8_t REG_INIT_CTRL{0x59};
318constexpr uint8_t REG_INIT_ADDR_0{0x5B};
319constexpr uint8_t REG_INIT_DATA{0x5E};
320constexpr uint8_t REG_IF_CONF{0x6B};
321constexpr uint8_t REG_PWR_CONF{0x7C};
322constexpr uint8_t REG_PWR_CTRL{0x7D};
323constexpr uint8_t REG_CMD{0x7E};
324constexpr uint8_t REG_CHIP_ID{0x00};
329constexpr uint8_t REG_BMM150_CHIP_ID{0x40};
330constexpr uint8_t REG_BMM150_DATA_X_LSB{0x42};
331constexpr uint8_t REG_BMM150_POWER_CONTROL{0x4B};
332constexpr uint8_t REG_BMM150_OP_MODE{0x4C};
333constexpr uint8_t REG_BMM150_REP_XY{0x51};
334constexpr uint8_t REG_BMM150_REP_Z{0x52};
354template <
class ReadReg>
357 for (
const uint8_t candidate : {
static_cast<uint8_t
>(0x68),
static_cast<uint8_t
>(0x69)}) {
359 if (read(candidate, command::REG_CHIP_ID,
id) &&
id ==
CHIP_ID) {
Thin contract between measurement units and consumers (e.g. AHRS)
Definition imu_data_source.hpp:27
6-axis (accel + gyro) IMU unit. CoreS3/AtomS3R built-in
Definition unit_bmi270.hpp:34
virtual m5::imu::Capability readImuRaw(m5::imu::imu_raw_data_t &out) override
Read the latest raw IMU data.
Definition unit_bmi270.cpp:556
config_t config() const
Gets the configuration.
Definition unit_bmi270.hpp:92
bool readGyroRange(bmi270::GyroRange &range)
Read the gyroscope range from the device (REG_GYR_RANGE bits[2:0])
Definition unit_bmi270.cpp:354
virtual void imuConvertParam(m5::imu::imu_convert_param_t &out) const override
Gets the conversion parameters for raw IMU data.
Definition unit_bmi270.cpp:589
bool readAccelODR(bmi270::AccelODR &odr)
Read the accelerometer output data rate from the device (REG_ACC_CONF bits[3:0])
Definition unit_bmi270.cpp:397
bool readAccelRange(bmi270::AccelRange &range)
Read the accelerometer range from the device (REG_ACC_RANGE bits[1:0])
Definition unit_bmi270.cpp:344
bool writeGyroRange(const bmi270::GyroRange range)
Write the gyroscope range.
Definition unit_bmi270.cpp:331
virtual ~UnitBMI270()
Destructor.
Definition unit_bmi270.hpp:78
virtual bool begin() override
Begin the unit.
Definition unit_bmi270.cpp:81
bool writeAccelRange(const bmi270::AccelRange range)
Write the accelerometer range.
Definition unit_bmi270.cpp:318
bool sleep() override
Suspend the chip (REG_PWR_CTRL off, REG_PWR_CONF adv_power_save)
Definition unit_bmi270.cpp:288
virtual void update(const bool force=false) override
Update the unit.
Definition unit_bmi270.cpp:199
virtual m5::imu::Capability imuSpec() const override
Capability of this unit.
Definition unit_bmi270.hpp:220
void config(const config_t &cfg)
Set the configuration.
Definition unit_bmi270.hpp:98
UnitBMI270(const uint8_t addr=DEFAULT_ADDRESS)
Construct with the I2C address the chip will answer on.
Definition unit_bmi270.cpp:72
bool writeGyroODR(const bmi270::GyroODR odr)
Write the gyroscope output data rate.
Definition unit_bmi270.cpp:383
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_bmi270.cpp:283
bool readGyroODR(bmi270::GyroODR &odr)
Read the gyroscope output data rate from the device (REG_GYR_CONF bits[3:0])
Definition unit_bmi270.cpp:412
bool softReset()
Soft reset (REG_CMD CMD_SOFTRESET), then re-run the mandatory post-reset initialization (config blob ...
Definition unit_bmi270.cpp:128
bool writeAccelODR(const bmi270::AccelODR odr)
Write the accelerometer output data rate.
Definition unit_bmi270.cpp:368
bool wakeup() override
Resume the chip from sleep()
Definition unit_bmi270.cpp:303
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_bmi270.cpp:278
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
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_bmi270.hpp:47
bmi270::AccelBwp accel_bwp
Definition unit_bmi270.hpp:67
bmi270::FilterPerf gyro_filter_perf
Gyroscope filter performance mode.
Definition unit_bmi270.hpp:69
bmi270::FilterPerf accel_filter_perf
Definition unit_bmi270.hpp:63
bmi270::AccelODR accel_odr
Definition unit_bmi270.hpp:56
bmi270::AccelRange accel_range
Accelerometer range.
Definition unit_bmi270.hpp:51
bmi270::GyroODR gyro_odr
Definition unit_bmi270.hpp:60
bmi270::GyroRange gyro_range
Gyroscope range.
Definition unit_bmi270.hpp:53
bool start_periodic
Start periodic measurement on begin()?
Definition unit_bmi270.hpp:49
bmi270::GyroBwp gyro_bwp
Gyroscope bandwidth parameter (the chip's power-on default)
Definition unit_bmi270.hpp:71
One measurement. Accel/gyro are always 12 bytes, little-endian (register 0x0C when the AUX/BMM150 bri...
Definition unit_bmi270_data.hpp:179
constexpr uint8_t CHIP_ID
BMI270 chip identifier (value read from command::REG_CHIP_ID)
Definition unit_bmi270.hpp:339
bool detectAddress(ReadReg read, uint8_t &addr)
Detect which I2C address a built-in BMI270 uses on a bus (0x68 or 0x69, board-dependent)
Definition unit_bmi270.hpp:355
BMI270 setting enums and measurement data (framework independent)
GyroBwp
Gyroscope bandwidth parameter (REG_GYR_CONF register 0x42, bits[5:4])
Definition unit_bmi270_data.hpp:110
AccelBwp
Accelerometer bandwidth parameter (REG_ACC_CONF register 0x40, bits[6:4])
Definition unit_bmi270_data.hpp:93
FilterPerf
Filter performance mode (REG_ACC_CONF bit7 / REG_GYR_CONF bit7)
Definition unit_bmi270_data.hpp:81
GyroODR
Gyroscope output data rate (REG_GYR_CONF register 0x42, bits[3:0])
Definition unit_bmi270_data.hpp:65
GyroRange
Gyroscope full scale range (REG_GYR_RANGE register 0x43)
Definition unit_bmi270_data.hpp:38
AccelRange
Accelerometer full scale range (REG_ACC_RANGE register 0x41)
Definition unit_bmi270_data.hpp:25
AccelODR
Accelerometer output data rate (REG_ACC_CONF register 0x40, bits[3:0])
Definition unit_bmi270_data.hpp:50
BMM150 setting enums and measurement data (framework independent)