39 lsm6dsv16x_data_ready_t drdy;
40 lsm6dsv16x_status_master_t
ms;
44 ret |= lsm6dsv16x_sh_master_set(&imu->
ctx, PROPERTY_ENABLE);
45 ret |= lsm6dsv16x_xl_data_rate_set(&imu->
ctx, LSM6DSV16X_ODR_AT_120Hz);
46 ret |= lsm6dsv16x_acceleration_raw_get(&imu->
ctx, raw);
50 do {
dly(imu, 5);
if (lsm6dsv16x_flag_data_ready_get(&imu->
ctx, &drdy))
return IMU_ERR_BUS; }
56 ret |= lsm6dsv16x_sh_master_set(&imu->
ctx, PROPERTY_DISABLE);
57 ret |= lsm6dsv16x_xl_data_rate_set(&imu->
ctx, LSM6DSV16X_ODR_OFF);
62static int32_t
sh_write(
imu_t *imu, uint8_t addr8, uint8_t reg, uint8_t val)
64 lsm6dsv16x_sh_cfg_write_t w = { addr8, reg, val };
65 if (lsm6dsv16x_xl_data_rate_set(&imu->
ctx, LSM6DSV16X_ODR_OFF))
return IMU_ERR_BUS;
67 if (lsm6dsv16x_sh_write_mode_set(&imu->
ctx, LSM6DSV16X_ONLY_FIRST_CYCLE))
return IMU_ERR_BUS;
71static int32_t
sh_read(
imu_t *imu, uint8_t addr8, uint8_t reg, uint8_t *buf, uint8_t len)
73 lsm6dsv16x_sh_cfg_read_t r = { addr8, reg, len };
74 if (lsm6dsv16x_xl_data_rate_set(&imu->
ctx, LSM6DSV16X_ODR_OFF))
return IMU_ERR_BUS;
75 if (lsm6dsv16x_sh_slv_cfg_read(&imu->
ctx, 0, &r))
return IMU_ERR_BUS;
76 if (lsm6dsv16x_sh_slave_connected_set(&imu->
ctx, LSM6DSV16X_SLV_0))
return IMU_ERR_BUS;
131 memset(imu, 0,
sizeof *imu);
143 if (lsm6dsv16x_block_data_update_set(&imu->
ctx, PROPERTY_ENABLE))
return IMU_ERR_BUS;
157 ret |= lsm6dsv16x_gy_full_scale_set(&imu->
ctx, LSM6DSV16X_2000dps);
158 ret |= lsm6dsv16x_xl_full_scale_set(&imu->
ctx, LSM6DSV16X_16g);
159 ret |= lsm6dsv16x_filt_gy_lp1_set(&imu->
ctx, PROPERTY_ENABLE);
160 ret |= lsm6dsv16x_filt_gy_lp1_bandwidth_set(&imu->
ctx,
161 (lsm6dsv16x_filt_gy_lp1_bandwidth_t)cfg->
gy_lpf1_bw);
162 ret |= lsm6dsv16x_filt_xl_lp2_set(&imu->
ctx, cfg->
xl_lpf2_enable ? PROPERTY_ENABLE : PROPERTY_DISABLE);
164 ret |= lsm6dsv16x_filt_xl_lp2_bandwidth_set(&imu->
ctx,
165 (lsm6dsv16x_filt_xl_lp2_bandwidth_t)cfg->
xl_lpf2_bw);
171 ret |= lsm6dsv16x_fifo_xl_batch_set(&imu->
ctx, fast ? LSM6DSV16X_XL_BATCHED_AT_1920Hz
172 : LSM6DSV16X_XL_BATCHED_AT_960Hz);
173 ret |= lsm6dsv16x_fifo_gy_batch_set(&imu->
ctx, fast ? LSM6DSV16X_GY_BATCHED_AT_1920Hz
174 : LSM6DSV16X_GY_BATCHED_AT_960Hz);
175 if (imu->
mag_enabled) ret |= lsm6dsv16x_fifo_sh_batch_slave_set(&imu->
ctx, 0, PROPERTY_ENABLE);
177 ret |= lsm6dsv16x_fifo_mode_set(&imu->
ctx, LSM6DSV16X_STREAM_MODE);
185 ret |= lsm6dsv16x_sh_slv_cfg_read(&imu->
ctx, 0, &r);
189 ret |= lsm6dsv16x_sh_slv_cfg_read(&imu->
ctx, imu->
baro_slot, &r);
191 ret |= lsm6dsv16x_sh_data_rate_set(&imu->
ctx, cfg->
mag_fast ? LSM6DSV16X_SH_120Hz
192 : LSM6DSV16X_SH_60Hz);
193 ret |= lsm6dsv16x_sh_slave_connected_set(&imu->
ctx,
195 ret |= lsm6dsv16x_sh_master_set(&imu->
ctx, PROPERTY_ENABLE);
200 lsm6dsv16x_pin_int_route_t pin = { 0 };
201 pin.fifo_th = PROPERTY_ENABLE;
202 if (lsm6dsv16x_pin_int1_route_set(&imu->
ctx, &pin))
return IMU_ERR_BUS;
205 const lsm6dsv16x_data_rate_t odr = fast ? LSM6DSV16X_ODR_AT_1920Hz : LSM6DSV16X_ODR_AT_960Hz;
206 ret |= lsm6dsv16x_xl_mode_set(&imu->
ctx, LSM6DSV16X_XL_HIGH_PERFORMANCE_MD);
207 ret |= lsm6dsv16x_gy_mode_set(&imu->
ctx, LSM6DSV16X_GY_HIGH_PERFORMANCE_MD);
208 ret |= lsm6dsv16x_xl_data_rate_set(&imu->
ctx, odr);
209 ret |= lsm6dsv16x_gy_data_rate_set(&imu->
ctx, odr);
212 imu->
odr_hz = fast ? 1920.0f : 960.0f;
238 const float ka = 0.488e-3f;
241 for (uint16_t w = 0; w < words &&
n <
cap; ++w) {
243 const uint8_t tag = (uint8_t)(p[0] >> 3);
244 const uint8_t *d = &p[1];
248 case LSM6DSV16X_GY_NC_TAG:
250 for (
int i = 0; i < 3; ++i) ev[
n].v[i] = (
float)
le16(&d[2*i]) * kg;
251 n++;
if (
st)
st->gyro++;
253 case LSM6DSV16X_XL_NC_TAG:
255 for (
int i = 0; i < 3; ++i) ev[
n].v[i] = (
float)
le16(&d[2*i]) * ka;
256 n++;
if (
st)
st->acc++;
258 case LSM6DSV16X_SENSORHUB_SLAVE0_TAG:
259 case LSM6DSV16X_SENSORHUB_SLAVE1_TAG: {
260 const uint8_t
slot = (tag == LSM6DSV16X_SENSORHUB_SLAVE0_TAG) ? 0u : 1u;
266 int32_t pr = (int32_t)((uint32_t)d[0] | ((uint32_t)d[1] << 8) | ((uint32_t)d[2] << 16));
267 if (pr & 0x00800000) pr -= 0x01000000;
269 ev[
n].
v[0] = (float)pr * (100.0f / 4096.0f);
270 ev[
n].
v[1] = (float)
le16(&d[3]) * 0.01f;
272 n++;
if (
st)
st->baro++;
277 if (
st)
st->mag_dup++;
284 n++;
if (
st)
st->mag++;
287 case LSM6DSV16X_SENSORHUB_NACK_TAG:
288 if (
st)
st->sh_nack++;
290 case LSM6DSV16X_FIFO_EMPTY:
294 if (
st)
st->unknown++;
size_t imu_fifo_parse(imu_t *imu, const uint8_t *raw, uint16_t words, imu_event_t *ev, size_t cap, imu_parse_stats_t *st)
Decodes 'words' words read in a burst from IMU_FIFO_REG.