#include "BMI160.h"
#include "MCU_Driver.h"
#include "stm32f0xx_i2c.h"
#include "stm32f0xx_conf.h"
signed short acc[3] = {0};
signed short gry[3] = {0};
signed short mag[3] = {0};
uint8_t g_BMI160_Error = 0;
void BMI160_Init(void)
{
IIC_Init();
while(BMI160_ID != BMI160_CheckId());
BMI160_SetACC_Range(BMI160_ACC_Range16G);
BMI160_SetGRY_Range(BMI160_GRY_Range2000);
BMI160_SetMAG_Range(BMI160_MAG_Range50);
}
void BMI160_WriteOneByte(uint8_t WriteAddr, uint8_t WriteData)
{
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET);//IF BUSY
I2C_TransferHandling(I2C1, BMI_WRITE_ADDR, 2, I2C_AutoEnd_Mode,I2C_Generate_Start_Write);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);//If Write OK
I2C_SendData(I2C1, WriteAddr);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);//If Write OK
I2C_SendData(I2C1, WriteData);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET);
}
uint8_t BMI160_ReadOneByte(uint8_t ReadAddr)
{
uint8_t tmp;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET);//IF BUSY
I2C_TransferHandling(I2C1, BMI_WRITE_ADDR, 1, I2C_SoftEnd_Mode,I2C_Generate_Start_Write); //softend 自动发送停止位
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);//If Write OK
I2C_SendData(I2C1, ReadAddr);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TC) == RESET);
I2C_TransferHandling(I2C1, BMI_READ_ADDR, 1, I2C_AutoEnd_Mode, I2C_Generate_Start_Read);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET);
tmp = I2C_ReceiveData(I2C1);
return tmp;
}
uint8_t BMI160_CheckId(void)
{
return BMI160_ReadOneByte(BMI_CHIPID);
}
/************************************
* BMI160_GetPMU_Status
* use BMI160_PMU_STATUS_TRANSBMI160_PMU_STATUS_TRANS(status, offset) to get trans
*
**************************************/
uint8_t BMI160_GetPMU_Status(void)
{
return BMI160_ReadOneByte(BMI_PMU_STATUS);
}
/**************************************
* BMI160_SetACC_Range
*range :
* BMI160_ACC_Range2G
* BMI160_ACC_Range4G
* BMI160_ACC_Range8G
* BMI160_ACC_Range16G
******************************************/
void BMI160_SetACC_Range(uint8_t range)
{
BMI160_WriteOneByte(BMI_ACC_RANGE, range);
}
/**************************************
* BMI160_SetACC_Range
*range :
* BMI160_GRY_Range2000
* BMI160_GRY_Range1000
* BMI160_GRY_Range500
* BMI160_GRY_Range250
* BMI160_GRY_Range125
******************************************/
void BMI160_SetGRY_Range(uint8_t range)
{
BMI160_WriteOneByte(BMI_GYR_RANGE, range);
}
/**************************************
* BMI160_SetACC_Range
*range :
* BMI160_MAG_Range25_32
* BMI160_MAG_Range25_16
* BMI160_MAG_Range25_8
* BMI160_MAG_Range25_4
* BMI160_MAG_Range25_2
* BMI160_MAG_Range25
* BMI160_MAG_Range50
******************************************/
void BMI160_SetMAG_Range(uint8_t range)
{
BMI160_WriteOneByte(BMI_MAG_CONF, range);
}
signed short BMI160_GetAccX(void)
{
signed short acc_x = 0;
unsigned short x = 0;
uint8_t xl = 0,xm = 0;
xl = BMI160_ReadOneByte(BMI_DATA_AX_L);
xm = BMI160_ReadOneByte(BMI_DATA_AX_M);
x = ((unsigned short)(xm<<8)) | ((unsigned short)(xl));
acc_x = (signed short)(x*10)/(0x8000/16);
return acc_x;
//return x;
}
signed short BMI160_GetAccY(void)
{
signed short acc_y = 0;
unsigned short y = 0;
uint8_t yl = 0,ym = 0;
yl = BMI160_ReadOneByte(BMI_DATA_AY_L);
ym = BMI160_ReadOneByte(BMI_DATA_AY_M);
y = ((unsigned short)(ym<<8)) | ((unsigned short)(yl));
acc_y = (signed short)(y*10)/(0x8000/16);
return acc_y;
//return y;
}
signed short BMI160_GetAccZ(void)
{
signed short acc_z = 0;
unsigned short z = 0;
uint8_t zl = 0,zm = 0;
zl = BMI160_ReadOneByte(BMI_DATA_AZ_L);
zm = BMI160_ReadOneByte(BMI_DATA_AZ_M);
z = ((unsigned short)(zm<<8)) | ((unsigned short)(zl));
acc_z = (signed short)(z*10)/(0x8000/16);
return acc_z;
//return z;
}
signed short BMI160_GetGryX(void)
{
signed short gry_x = 0;
unsigned short x = 0;
uint8_t xl = 0,xm = 0;
xl = BMI160_ReadOneByte(BMI_DATA_GX_L);
xm = BMI160_ReadOneByte(BMI_DATA_GX_M);
x = ((unsigned short)(xm<<8)) | ((unsigned short)(xl));
gry_x = x;//(signed long)(x*2000)/0x8000;
return gry_x;
}
signed short BMI160_GetGryY(void)
{
signed short gry_y = 0;
unsigned short y = 0;
uint8_t yl = 0,ym = 0;
yl = BMI160_ReadOneByte(BMI_DATA_GY_L);
ym = BMI160_ReadOneByte(BMI_DATA_GY_M);
y = ((unsigned short)(ym<<8)) | ((unsigned short)(yl));
gry_y = y;//(signed long)(y*2000)/0x8000;
return gry_y;
}
signed short BMI160_GetGryZ(void)
{
signed short gry_z = 0;
unsigned short z = 0;
uint8_t zl = 0,zm = 0;
zl = BMI160_ReadOneByte(BMI_DATA_GZ_L);
zm = BMI160_ReadOneByte(BMI_DATA_GZ_M);
z = ((unsigned short)(zm<<8)) | ((unsigned short)(zl));
gry_z = z;//(signed long)(z*2000)/0x8000;
return gry_z;
}
signed short BMI160_GetMagX(void)
{
signed short mag_x = 0;
unsigned short x = 0;
uint8_t xl = 0,xm = 0;
xl = BMI160_ReadOneByte(BMI_DATA_MX_L);
xm = BMI160_ReadOneByte(BMI_DATA_MX_M);
x = ((unsigned short)(xm<<8)) | ((unsigned short)(xl));
mag_x = (signed short)x/25;//(signed short)(x*2000)/0x8000;
return mag_x;
}
signed short BMI160_GetMagY(void)
{
signed short mag_y = 0;
unsigned short y = 0;
uint8_t yl = 0,ym = 0;
yl = BMI160_ReadOneByte(BMI_DATA_MY_L);
ym = BMI160_ReadOneByte(BMI_DATA_MY_M);
y = ((unsigned short)(ym<<8)) | ((unsigned short)(yl));
mag_y = (signed short)y/25;//(signed short)(x*2000)/0x8000;
return mag_y;
}
signed short BMI160_GetMagZ(void)
{
signed short mag_z = 0;
unsigned short z = 0;
uint8_t zl = 0,zm = 0;
zl = BMI160_ReadOneByte(BMI_DATA_MZ_L);
zm = BMI160_ReadOneByte(BMI_DATA_MZ_M);
z = ((unsigned short)(zm<<8)) | ((unsigned short)(zl));
mag_z = (signed short)z/25;//(signed short)(x*2000)/0x8000;
return mag_z;
}
void getAccelerometerValue(void)
{
/************* write cmd set to acc normal mode ********************/
BMI160_WriteOneByte(BMI_CMD, BMI160_CMD_ACC_Normal);
/************* wait acc normal mode ********************/
while(BMI160_PMU_STATUS_TRANS(BMI160_GetPMU_Status(), ACC_PMU_STATUS_OFFSET) != BMI160_PMU_NORMAL);
/********** Get Data **********/
acc[0] = BMI160_GetAccX();
acc[1] = BMI160_GetAccY();
acc[2] = BMI160_GetAccZ();
}
void getGyroscopeValue(void)
{
/************* write cmd set to gry normal mode ********************/
BMI160_WriteOneByte(BMI_CMD, BMI160_CMD_GRY_Normal);
/************* wait gry normal mode ********************/
while(BMI160_PMU_STATUS_TRANS(BMI160_GetPMU_Status(), GRY_PMU_STATUS_OFFSET) != BMI160_PMU_NORMAL);
/********** Get Data **********/
gry[0] = BMI160_GetGryX();
gry[1] = BMI160_GetGryY();
gry[2] = BMI160_GetGryZ();
}
void getMagnetometerValue(void)
{
/************* write cmd set to gry normal mode ********************/
BMI160_WriteOneByte(BMI_CMD, BMI160_CMD_MAG_Normal);
/************* wait gry normal mode ********************/
while(BMI160_PMU_STATUS_TRANS(BMI160_GetPMU_Status(), MAG_PMU_STATUS_OFFSET) != BMI160_PMU_NORMAL);
/********** Get Data **********/
mag[0] = BMI160_GetMagX();
mag[1] = BMI160_GetMagY();
mag[2] = BMI160_GetMagZ();
}
/*********************************************
* BMI160_SetInt_EN
* INT_EN_ADDR:
BMI_INT_EN_0
BMI_INT_EN_1
BMI_INT_EN_2
* INT_EN:
BMI160_INT_0_FLAT
BMI160_INT_0_ORIENT
BMI160_INT_0_S_TAP
BMI160_INT_0_D_TAP
BMI160_INT_0_ANYMO_Z
BMI160_INT_0_ANYMO_Y
BMI160_INT_0_ANYMO_X
博世BMI160自写驱动
4星 · 超过85%的资源 需积分: 46 186 浏览量
2018-11-02
11:59:10
上传
评论 2
收藏 6KB RAR 举报
海边的栗子
- 粉丝: 1
- 资源: 2