Gsensor:BMA250E驱动实现

来源:互联网 发布:网络改造项目实施方案 编辑:程序博客网 时间:2024/05/22 00:30

一、前言

BMA250E是一款比较常用的三轴加速度传感器,主要在微电子可穿戴设备上获取设备当前的空间姿态信息。

二、程序流程

2.1 获取CHIP ID

寄存器0x00存放Gsensor的Chip ID, 值为0xF9
uint8_t BMA250E_Get_ChipID(void){uint8_t chipID;STA_I2C_Mem_Read(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_BGW_CHIPID, 1, &chipID, 1);return chipID;}
其中的I2C_Mem_Read函数为I2C驱动,在此不赘述。可参考HAL库的I2C驱动函数。也可查找相关的I2C驱动。

2.2 偏移量计算

Gsensor启动时需要load一下偏移量,写入到偏移量寄存器中。偏移量的通常保存在Flash中,而偏移量的计算过程如下:

2.2.1 获取当前的校准补偿状态

首先读取一下寄存器0x36的值判断当前是否为ready状态,ready以后才能进行后续的操作。若超时以后仍未进入ready状态才写0xFF
<span style="white-space:pre"></span>STA_I2C_Mem_Read(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_OFC_CTRL, 1, &set_data, 1);STA_Delay(10);counter=0;while((set_data&0x10)==0x00){ if(counter<WAIT_LIMIT) {counter++;STA_Delay(10); STA_I2C_Mem_Read(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_OFC_CTRL, 1, &set_data, 1); } else { counter=0;for(uint8_t i=0;i<3;i++)p_start[i]=0xFF; }}

2.2.2 执行校准补偿(完整代码 包含2.2.1)

依次执行X Y Z三轴的校准操作,校准完成后读取校准值存放到p_start这个数组当中。
void BMA250E_Get_CalOffset(uint8_t *p_start){uint8_t set_data,counter;set_data=0x08;//check Y-axis +1g  //0x02;//check X-axis 0x20;//check Z-axis?????STA_I2C_Mem_Write(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_OFC_SETTING, 1,&set_data, 1,300);STA_Delay(10);STA_I2C_Mem_Read(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_OFC_CTRL, 1, &set_data, 1);STA_Delay(10);counter=0;while((set_data&0x10)==0x00){ if(counter<WAIT_LIMIT) {counter++;STA_Delay(10); STA_I2C_Mem_Read(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_OFC_CTRL, 1, &set_data, 1); } else { counter=0;for(uint8_t i=0;i<3;i++)p_start[i]=0xFF;return; }}set_data=0x20;STA_I2C_Mem_Write(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_OFC_CTRL, 1,&set_data, 1,300);STA_Delay(10);STA_I2C_Mem_Read(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_OFC_CTRL, 1, &set_data, 1);counter=0;while((set_data&0x10)==0x00){ if(counter<WAIT_LIMIT) {counter++;STA_Delay(10); STA_I2C_Mem_Read(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_OFC_CTRL, 1, &set_data, 1); } else { counter=0;for(uint8_t i=0;i<3;i++)p_start[i]=0xFF;return; }}set_data=0x40;STA_I2C_Mem_Write(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_OFC_CTRL, 1,&set_data, 1,300);STA_Delay(10);STA_I2C_Mem_Read(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_OFC_CTRL, 1, &set_data, 1);counter=0;while((set_data&0x10)==0x00){ if(counter<WAIT_LIMIT) {counter++;STA_Delay(10);STA_I2C_Mem_Read(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_OFC_CTRL, 1, &set_data, 1); } else { counter=0;for(uint8_t i=0;i<3;i++)p_start[i]=0xFF;return; }}set_data=0x60;STA_I2C_Mem_Write(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_OFC_CTRL, 1,&set_data, 1,300);STA_Delay(10);STA_I2C_Mem_Read(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_OFC_CTRL, 1, &set_data, 1);counter=0;while((set_data&0x10)==0x00){ if(counter<WAIT_LIMIT) {counter++;STA_Delay(10); STA_I2C_Mem_Read(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_OFC_CTRL, 1, &set_data, 1); } else { counter=0;for(uint8_t i=0;i<3;i++)p_start[i]=0xFF;return; }}STA_I2C_Mem_Read(BMA250E_I2C, BMA250E_DEV_ADDR, BMA250E_OFC_OFFSET_X, 1, p_start, 3);}

2.3 整体流程

校准并不是每次都会执行,需要等待用户测试指令才会执行,执行以后保存于FLASH中,上电后读取这三个BYTE的值,作为偏移补偿。
MCU通过I2C接口循环读取三轴的结果寄存器即可。

0 0
原创粉丝点击