2023-02-04 15:38:05 +08:00
|
|
|
# BMI088
|
|
|
|
|
|
|
|
## 数据读写规则(so called 16-bit protocol)
|
|
|
|
|
|
|
|
加速度计读取read:
|
|
|
|
1. bit 0 :1 bit 1-7: reg address
|
|
|
|
2. dummy read,加速度计此时返回的数据无效
|
|
|
|
3. 真正的数据从第三个字节开始.
|
|
|
|
|
|
|
|
通过SPI传输三个字节(分三次)
|
|
|
|
byte1: 1(读)+7位寄存器地址
|
|
|
|
byte2: 没用
|
|
|
|
byte3: 读取到的数据
|
|
|
|
|
|
|
|
write写入:
|
|
|
|
1. bit 0: 0 bit1-7: reg address
|
|
|
|
2. 要写入寄存器的数据(注意没有dummy byte)
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
**注意,陀螺仪和加速度计的读取不同**
|
|
|
|
|
|
|
|
陀螺仪gyro读取read:
|
|
|
|
1. bit 0 :1 bit1-7: reg address
|
|
|
|
2. 读回的数据
|
|
|
|
|
|
|
|
通过SPI传输两个字节(分两次)
|
|
|
|
byte1: 1(读)+7位寄存器地址
|
|
|
|
byte2: 读取到的数据
|
|
|
|
|
|
|
|
write写入:
|
|
|
|
1. bit0 : 0 bit1-7 : reg address
|
|
|
|
2. 写入的数据
|
|
|
|
|
|
|
|
|
|
|
|
## IT非阻塞模式下BMI088读取流程
|
|
|
|
|
|
|
|
数据准备完成标志位:`uint8_t BMI088_READY_FLAG` 总共8个位 也可以用位域可读性更高
|
|
|
|
|
|
|
|
1. 当accel int中断发生,开启DMA SPI传输,完成后将acc ready置位
|
|
|
|
2. 当gyro int中断发生,开启DMA SPI传输,完成后将gyro ready置位
|
2023-02-04 22:48:53 +08:00
|
|
|
3. 当温度数据中断(温度传感器在accel内部,也是accel int)发生,开启DMA传输,完成后将温度标志位置位
|
2023-02-04 15:38:05 +08:00
|
|
|
|
|
|
|
> 由于DMA传输非阻塞,启动传输后只有到传输完成时才会拉高片选结束SPI transfer,因此需要在callback中加入标志位置位的操作.
|
|
|
|
这可以通过条件编译完成.
|
|
|
|
|
|
|
|
温度数据不需要和accel和gyro同步,它不参与姿态解算,可以不用管.
|
|
|
|
|
|
|
|
当加速度数据和陀螺仪数据都准备完成之后,唤醒姿态解算任务INs_taSk,进行一次解算.唤醒可以通过软件开启EXTI中断,在中断中调用实时系统的vTaskNotifyFromISR()完成,也可以将任务ready标志位置位,当运行到对应位置时检查标志位判断是否要进行任务.时间间隔不是大问题,inS_TAsK中有dwt用于计算两次任务执行的间隔,它将会自动处理好bias的大小
|
2023-02-14 11:13:32 +08:00
|
|
|
|
|
|
|
`__HAL_GPIO_EXTI_GENERATE_SWIT()` `HAL_EXTI_GENERATE_SWI()` 可以触发软件中断
|
2023-02-04 15:38:05 +08:00
|
|
|
|
|
|
|
of course,两者的数据更新实际上可以异步进行,这里为了方便起见当两者数据都准备好以后再行融合
|