博世BMI160简介
Bosch Sensortec公司推出的最新BMI160惯性测量单元将最顶尖的16位3轴重力加速度计和超低功耗3轴陀螺仪集成于单一封装。采用14管脚LGA封装,尺寸为2.5×3.0×0.8mm3。当加速度计和陀螺仪在全速模式下运行时,耗电典型值低至950µA,仅为市场上同类产品耗电量的50%或者更低。
BMI160是一款高度集成的低功耗惯性测量单元(IMU),可提供精确的加速度和角速率(陀螺 仪)测量。
主要特点
高性能加速度计和陀螺仪(硬件同步)
功耗极低:典型值。 920μA(全功能加速度计和陀螺仪)
符合Android Kitkat:重要的运动和步进检测器/步进计数器(每个5μA)
占地面积2.5 x 3.0 mm2,高度0.83 mm
内置电源管理单元(PMU),用于高级电源管理
具有快速启动陀螺仪模式的省电功能
宽电源范围:1.71V …… 3.6V
可分配的1024字节FIFO缓冲区(能够处理外部传感器数据)
硬件传感器时间戳,用于精确的传感器数据融合
集成中断,用于增强自主运动检测
灵活的数字主接口,通过I2C或SPI连接主机
扩展I2C模式,时钟频率高达1 MHz
用于OIS应用的附加二级高速接口
能够处理外部传感器数据 (例如Bosch Sensortec的地磁或气压传感器)
下载地址
BMI160的中文Datasheet的下载连接如下: [点击此处进入下载网页]
主接口I2C / SPI协议选择
从上面的框图中,我们可以看到,BMI160与外部进行双向数据传输的方式有两种:SPI和I2C。下面,我们来看下通过I2C与外部进行通信的方式。当BMI160通过I2C与外部进行通信的时候,BMI160将作为I2C从设备挂到主控芯片(主设备)的I2C总线上,所以,主控芯片在配置其对应的I2C驱动时就需要知道BMI160的从设备地址。
上电后,根据芯片选择CSB引脚行为自动选择协议。复位/上电时,BMI160处于I2C模式。 如果CSB在上电期间连接到VDDIO且未更改,则传感器接口 在I2C模式下工作。 对于使用I2C,建议将CSB线硬连线到VDDIO。 由于上电复位仅在VDD和 VDDIO都建立时执行,因此不存在由于上电顺序而导致协议检测错误的风险。
如果CSB在上电后看到上升沿,则BMI160接口切换到SPI直到复位或下一次上电。 因此,在启 动SPI之前需要CSB上升沿通讯。
因此,建议在实际通信之前对ADDRESS 0x7F执行SPI单读访问,以便使用SPI接口。 如果没有数据,则无法切换CSB位通信时,寄存器(0x70)NV_CONF中还有spi_en位,可用于将 主接口永久设置为SPI,而无需在每次上电或复位时切换CSB引脚。
本文采用的是I2C接口
I2C接口
如果SDO引脚被拉至’GND‘,器件的I²C地址为0b1101000(0x68)。
如果SDO引脚被拉至VDDIO‘,器件的I²C地址为0b1101001(0x69)。
I2C时序图
下图给出的I²C时序的定义
I²C协议的工作原理如下:
START: 总线上的数据传输从SDA线上的高电平到低电平转换开始,而SCL保持高电平(I²C总 线主机指示的启动条件(S))。 一旦主机传输START信号,总线就会被认为是忙碌的。
STOP: 每个数据传输应由主机产生的停止信号(P)终止。 STOP条件是SDA线上的低电平到高 电平转换,而SCL保持高电平。
ACKS: 必须确认传输的每个数据字节。 它由接收器发送的确认位指示。 发送器必须在应答脉冲 期间释放SDA线(无下拉),而接收器必须将SDA线拉低,以便在应答时钟周期的高电平期间保 持稳定的低电平。
I²C写数据
I²C写访问可用于在一个序列中写入数据字节。 该序列以主机产生的启动条件开始,后跟7位从机地址和写入位(RW = 0)。 从器件发送一个应 答位(ACKS = 0)并释放总线。 然后主机发送一个字节的寄存器地址。 从机再次确认传输并等 待8位数据,这些数据应写入指定的寄存器地址。 从机确认数据字节后,主机产生停止信号并终 止写入协议。I²C写访问的示例:
I²C读数据
I²C读访问也可用于在一个序列中读取一个或多个数据字节。
I²C读访问也可用于在一个序列中读取一个或多个数据字节。
读序列由一个字节的I²C写阶段和I C读阶段组成。变速器的两个部分必须通过重复启动条件(S)分开。 I²C写入阶段寻址从器件并发送要读取的寄存器地址。从机确认发送后,主机再次产生一个起始条件,并将从机地址与读取位(RW = 1)一起发送。然后主机释放总线并等待从从机读出数据字节。在每个数据字节之后,主机必须生成应答位(ACKS = 0)以启用进一步的数据传输。
来自主设备的NACKM(ACKS = 1)停止从从设备传输的数据。从器件释放总线,以便主器件可以生成STOP条件并终止传输。
寄存器地址自动递增,因此可以顺序读出多个字节。一旦新的数据读取传输开始,起始地址将被设置为自最新的I²C写入命令以来指定的寄存器地址。默认情况下,起始地址设置为0x00。以这种方式,可以从相同的起始地址重复多字节读取。
I²C读访问示例(读取陀螺仪数据):
I²C读写初始化程序
1 | /**************************实现函数******************************************** |
初始化完成之后,就可以结合官方库区读取数据了。
首先对BMI160初始化
1 | struct bmi160_dev bmi160sensor ; |
获取陀螺仪和加速度数据
1 | //获取数据 |
设置为任意方向中断,这样可以通过示波器查看,当摇晃BMI160时,观察中断通道1是否有高电平产生了。
1 | void bmi160_Interrupt(void)//设置任意方向中断 |
更多其他详细程序请到我的公众号或者github查找。