4 #if defined (ESP_PLATFORM)
7 #include <freertos/FreeRTOS.h>
8 #include <freertos/task.h>
16 : IMU_Base ( i2c_addr, freq, i2c )
19 bool BMI270_Class::_upload_file(
const uint8_t *config_data,
size_t index,
size_t write_len)
21 uint8_t addr_array[2] = {
22 (uint8_t)((index >> 1) & 0x0F),
26 if (config_data !=
nullptr
27 && writeRegister( INIT_ADDR_0, addr_array, 2 )
28 && writeRegister( INIT_DATA_ADDR, (uint8_t *)config_data, write_len))
35 IMU_Base::imu_spec_t BMI270_Class::begin(I2C_Class* i2c)
48 writeRegister8(CMD_REG_ADDR, SOFT_RESET_CMD);
52 while (0 == readRegister8(PWR_CONF_ADDR) && --retry);
55 writeRegister8(PWR_CONF_ADDR, 0x00);
57 bool res = _upload_file(bmi270_config_file, 0,
sizeof(bmi270_config_file));
58 writeRegister8(INIT_CTRL_ADDR, 0x01);
59 writeRegister8(INT_MAP_DATA_ADDR, 0xFF);
67 imu_spec_t spec = (imu_spec_t)(imu_spec_accel | imu_spec_gyro);
70 while (0 == readRegister8(INTERNAL_STATUS_ADDR) && --retry);
75 auxWriteRegister8(0x4B, 0x83);
76 auxReadRegister8(0x40);
77 auto who_am_i = auxReadRegister8(0x40);
80 auxWriteRegister8(0x4C, 0x38);
81 spec = (imu_spec_t)(imu_spec_accel | imu_spec_gyro | imu_spec_mag);
82 writeRegister8(AUX_IF_CONF_ADDR, 0x4F);
83 writeRegister8(AUX_RD_ADDR , 0x42);
84 writeRegister8(PWR_CTRL_ADDR, 0x0F);
89 bool BMI270_Class::auxSetupMode(std::uint8_t i2c_addr)
91 writeRegister8(IF_CONF_ADDR, 0x20);
92 writeRegister8(PWR_CONF_ADDR, 0x00);
93 writeRegister8(PWR_CTRL_ADDR, 0x0E);
94 writeRegister8(AUX_IF_CONF_ADDR, 0x80);
95 return writeRegister8(AUX_DEV_ID_ADDR , i2c_addr << 1);
98 bool BMI270_Class::auxWriteRegister8(std::uint8_t reg, std::uint8_t data)
100 writeRegister8(AUX_WR_DATA_ADDR, data);
101 writeRegister8(AUX_WR_ADDR, reg);
103 while ((readRegister8(STATUS_ADDR) & 0b100) && --retry) { vTaskDelay(1); }
107 std::uint8_t BMI270_Class::auxReadRegister8(std::uint8_t reg)
109 writeRegister8(AUX_IF_CONF_ADDR, 0x80);
110 writeRegister8(AUX_RD_ADDR, reg);
112 while ((readRegister8(STATUS_ADDR) & 0b100) && --retry) { vTaskDelay(1); }
113 return readRegister8(AUX_X_LSB_ADDR);
116 std::uint8_t BMI270_Class::WhoAmI(
void)
118 return readRegister8(CHIP_ID_ADDR);
121 IMU_Base::imu_spec_t BMI270_Class::getImuRawData(imu_raw_data_t* data)
const
123 imu_spec_t res = imu_spec_none;
124 std::uint8_t intstat = readRegister8(INT_STATUS_1_ADDR);
127 std::int16_t buf[10];
128 if (readRegister(AUX_X_LSB_ADDR, (std::uint8_t*)buf, 20))
132 data->accel.x = buf[4];
133 data->accel.y = buf[5];
134 data->accel.z = buf[6];
135 res = (imu_spec_t)(res | imu_spec_accel);
139 data->gyro.x = buf[7];
140 data->gyro.y = buf[8];
141 data->gyro.z = buf[9];
142 res = (imu_spec_t)(res | imu_spec_gyro);
146 data->mag.x = buf[0] >> 2;
147 data->mag.y = buf[1] >> 2;
148 data->mag.z = buf[2] & 0xFFFE;
149 res = (imu_spec_t)(res | imu_spec_mag);
156 void BMI270_Class::getConvertParam(imu_convert_param_t* param)
const
158 param->mag_res = 10.0f * 4912.0f / 32760.0f;
159 param->temp_offset = 23.0f;
160 param->temp_res = 1.0f / 512.0f;
163 bool BMI270_Class::getTempAdc(int16_t *t)
const
166 bool res = readRegister(TEMPERATURE_0_ADDR, (std::uint8_t*)&buf, 2);
167 if (res) { *t = buf; }
BMI270_Class(std::uint8_t i2c_addr=DEFAULT_ADDRESS, std::uint32_t freq=400000, I2C_Class *i2c=&In_I2C)