BMA150例程.docx
- 文档编号:4323791
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:31
- 大小:175.46KB
BMA150例程.docx
《BMA150例程.docx》由会员分享,可在线阅读,更多相关《BMA150例程.docx(31页珍藏版)》请在冰豆网上搜索。
BMA150例程
BMA150例程
BMA150,是用于读取XYZ三维坐标器件,主要用于手机加速传感器和一些安防产品,这是一个成功的全程,本例程采用I2C通信,简单易用,能读出XYZ三个状态和加速度值,精度是11位,有正负值,对于有意开发此项目的人有一定的帮助。
直接移值过去就可以用了。
有BMA150的datasheet,原理图,和程序。
拿来就用。
***************************程序********************************
//BAM150.H定义
#defineSENSOR_NAME"bma150"
#defineGRAVITY_EARTH9806550
#defineABSMIN_2G(-GRAVITY_EARTH*2)
#defineABSMAX_2G(GRAVITY_EARTH*2)
#defineBMA150_MAX_DELAY200
#defineBMA150_CHIP_ID2
#defineBMA150_RANGE_SET0
#defineBMA150_BW_SET4
#defineBMA150_CHIP_ID_REG0x00
#defineBMA150_X_AXIS_LSB_REG0x02
#defineBMA150_X_AXIS_MSB_REG0x03
#defineBMA150_Y_AXIS_LSB_REG0x04
#defineBMA150_Y_AXIS_MSB_REG0x05
#defineBMA150_Z_AXIS_LSB_REG0x06
#defineBMA150_Z_AXIS_MSB_REG0x07
#defineBMA150_TEMP_REG0x08
#defineBMA150_STATUS_REG0x09
#defineBMA150_CTRL_REG0x0a
#defineBMA150_CONF1_REG0x0b
#defineBMA150_LG_THRES0x0c
#defineBMA150_LG_DUR0x0d
#defineBMA150_HG_THRES0x0e
#defineBMA150_HG_DUR0x0f
#defineBMA150_ANY_MOTION0x10
#defineBMA150_CUSTOMER1_REG0x12
#defineBMA150_CUSTOMER2_REG0x13
#defineBMA150_RANGE_BWIDTH_REG0x14
#defineBMA150_CONF2_REG0x15
#defineBMA150_OFFS_GAIN_X_REG0x16
#defineBMA150_OFFS_GAIN_Y_REG0x17
#defineBMA150_OFFS_GAIN_Z_REG0x18
#defineBMA150_OFFS_GAIN_T_REG0x19
#defineBMA150_OFFSET_X_REG0x1a
#defineBMA150_OFFSET_Y_REG0x1b
#defineBMA150_OFFSET_Z_REG0x1c
#defineBMA150_OFFSET_T_REG0x1d
#defineBMA150_CHIP_ID__POS0
#defineBMA150_CHIP_ID__MSK0x07
#defineBMA150_CHIP_ID__LEN3
#defineBMA150_CHIP_ID__REGBMA150_CHIP_ID_REG
/*DATAREGISTERS*/
#defineBMA150_NEW_DATA_X__POS0
#defineBMA150_NEW_DATA_X__LEN1
#defineBMA150_NEW_DATA_X__MSK0x01
#defineBMA150_NEW_DATA_X__REGBMA150_X_AXIS_LSB_REG
#defineBMA150_ACC_X_LSB__POS6
#defineBMA150_ACC_X_LSB__LEN2
#defineBMA150_ACC_X_LSB__MSK0xC0
#defineBMA150_ACC_X_LSB__REGBMA150_X_AXIS_LSB_REG
#defineBMA150_ACC_X_MSB__POS0
#defineBMA150_ACC_X_MSB__LEN8
#defineBMA150_ACC_X_MSB__MSK0xFF
#defineBMA150_ACC_X_MSB__REGBMA150_X_AXIS_MSB_REG
#defineBMA150_ACC_Y_LSB__POS6
#defineBMA150_ACC_Y_LSB__LEN2
#defineBMA150_ACC_Y_LSB__MSK0xC0
#defineBMA150_ACC_Y_LSB__REGBMA150_Y_AXIS_LSB_REG
#defineBMA150_ACC_Y_MSB__POS0
#defineBMA150_ACC_Y_MSB__LEN8
#defineBMA150_ACC_Y_MSB__MSK0xFF
#defineBMA150_ACC_Y_MSB__REGBMA150_Y_AXIS_MSB_REG
#defineBMA150_ACC_Z_LSB__POS6
#defineBMA150_ACC_Z_LSB__LEN2
#defineBMA150_ACC_Z_LSB__MSK0xC0
#defineBMA150_ACC_Z_LSB__REGBMA150_Z_AXIS_LSB_REG
#defineBMA150_ACC_Z_MSB__POS0
#defineBMA150_ACC_Z_MSB__LEN8
#defineBMA150_ACC_Z_MSB__MSK0xFF
#defineBMA150_ACC_Z_MSB__REGBMA150_Z_AXIS_MSB_REG
/*CONTROLBITS*/
#defineBMA150_SLEEP__POS0
#defineBMA150_SLEEP__LEN1
#defineBMA150_SLEEP__MSK0x01
#defineBMA150_SLEEP__REGBMA150_CTRL_REG
#defineBMA150_SOFT_RESET__POS1
#defineBMA150_SOFT_RESET__LEN1
#defineBMA150_SOFT_RESET__MSK0x02
#defineBMA150_SOFT_RESET__REGBMA150_CTRL_REG
#defineBMA150_EE_W__POS4
#defineBMA150_EE_W__LEN1
#defineBMA150_EE_W__MSK0x10
#defineBMA150_EE_W__REGBMA150_CTRL_REG
#defineBMA150_UPDATE_IMAGE__POS5
#defineBMA150_UPDATE_IMAGE__LEN1
#defineBMA150_UPDATE_IMAGE__MSK0x20
#defineBMA150_UPDATE_IMAGE__REGBMA150_CTRL_REG
#defineBMA150_RESET_INT__POS6
#defineBMA150_RESET_INT__LEN1
#defineBMA150_RESET_INT__MSK0x40
#defineBMA150_RESET_INT__REGBMA150_CTRL_REG
/*BANDWIDTHdependenddefinitions*/
#defineBMA150_BANDWIDTH__POS0
#defineBMA150_BANDWIDTH__LEN3
#defineBMA150_BANDWIDTH__MSK0x07
#defineBMA150_BANDWIDTH__REGBMA150_RANGE_BWIDTH_REG
/*RANGE*/
#defineBMA150_RANGE__POS3
#defineBMA150_RANGE__LEN2
#defineBMA150_RANGE__MSK0x18
#defineBMA150_RANGE__REGBMA150_RANGE_BWIDTH_REG
/*WAKEUP*/
#defineBMA150_WAKE_UP__POS0
#defineBMA150_WAKE_UP__LEN1
#defineBMA150_WAKE_UP__MSK0x01
#defineBMA150_WAKE_UP__REGBMA150_CONF2_REG
#defineBMA150_WAKE_UP_PAUSE__POS1
#defineBMA150_WAKE_UP_PAUSE__LEN2
#defineBMA150_WAKE_UP_PAUSE__MSK0x06
#defineBMA150_WAKE_UP_PAUSE__REGBMA150_CONF2_REG
#defineBMA150_GET_BITSLICE(regvar,bitname)\
((regvar&bitname##__MSK)>>bitname##__POS)
#defineBMA150_SET_BITSLICE(regvar,bitname,val)\
((regvar&~bitname##__MSK)|((val< /*rangeandbandwidth*/ #defineBMA150_RANGE_2G0 #defineBMA150_RANGE_4G1 #defineBMA150_RANGE_8G2 #defineBMA150_BW_25HZ0 #defineBMA150_BW_50HZ1 #defineBMA150_BW_100HZ2 #defineBMA150_BW_190HZ3 #defineBMA150_BW_375HZ4 #defineBMA150_BW_750HZ5 #defineBMA150_BW_1500HZ6 /*modesettings*/ #defineBMA150_MODE_NORMAL0 #defineBMA150_MODE_SLEEP2 #defineBMA150_MODE_WAKE_UP3 /*wake_up_pause*/ #defineBMA150_PAUSE_20MS0 #defineBMA150_PAUSE_80MS1 #defineBMA150_PAUSE_320MS2 #defineBMA150_PAUSE_2560MS3 /*中断类型*/ #defineBMA150_ENABLE_LG1 #defineBMA150_ENABLE_HG2 #defineBMA150_ENABLE_ANY_MOTION3 #defineBMA150_ENABLE_ALART4 structbma150acc{ s16x, y, z; }; u8bma150_smbus_write_byte(u8reg_addr,u8data); u8bma150_smbus_read_byte(u8reg_addr,u8*data,u8len); u8bma150_get_chip_id(u8*chip_id); u8bma150_read_accel_xyz(structbma150acc*acc); u8bma150_set_mode(u8mode); u8bma150_set_wake_up_pause(u8pause); u8bma150_set_range(u8Range); u8bma150_get_range(u8*Range); u8bma150_set_bandwidth(u8BW); u8bma150_get_bandwidth(u8*BW); u8bma150_get_status(u8*status); u8bma150_get_temp(u8*temp); u8bma150_reset_int(void); u8bma150_update_image(void); u8bma150_ee_w(u8status); u8bma150_self_test(u8status); u8bma150_soft_reset(void); u8bma150_set_int_mode(u8mode); u8bma150_int_trig_mode(u8mode); u8bma150_counter(u8counter); u8bma150_set_thres(u8int_type,u8thres); u8bma150_set_dur(u8int_type,u8dur); u8bma150_set_hyst(u8hyst); ****************IIC通信低层************************** voidI2C_IO_Init(void) { SetIoHi(bma_sda); SetIoHi(bma_scl); SetIoOut(bma_scl); SetIoOut(bma_sda); } voidI2C_Start(void) { SetIoHi(bma_sda); Delay(); SetIoHi(bma_scl); Delay(); SetIoLo(bma_sda); Delay(); SetIoLo(bma_scl); Delay(); } voidI2C_Stop(void) { SetIoLo(bma_sda); Delay(); SetIoHi(bma_scl); Delay(); SetIoHi(bma_sda); Delay(); } voidI2C_Ack(void) { SetIoLo(bma_sda); Delay(); SetIoHi(bma_scl); Delay(); SetIoLo(bma_scl); Delay(); } voidI2C_NoAck(void) { SetIoHi(bma_sda); Delay(); SetIoHi(bma_scl); Delay(); SetIoLo(bma_scl); Delay(); } u8Check_Acknowledge(void) { u8i=100; SetIoIn(bma_sda); Delay(); SetIoHi(bma_scl); while(GetIo(bma_sda)) { if(--i==0)break; } SetIoLo(bma_scl); Delay(); SetIoOut(bma_sda); Delay(); returni; } /****************************************************** 函数名: I2C_SendByte ******************************************************/ voidI2C_SendByte(u8byte) { u8i; for(i=0;i<8;i++) { if((byte&0x80)) { SetIoHi(bma_sda); } else { SetIoLo(bma_sda); } SetIoHi(bma_scl); Delay(); SetIoLo(bma_scl); Delay(); byte<<=1; } } /****************************************************** 函数名: I2C_ReadByte ******************************************************/ u8I2C_ReadByte(void) { u8i; u8byte=0; SetIoIn(bma_sda); Delay(); for(i=0;i<8;i++) { byte<<=1; if(GetIo(bma_sda)) byte|=1; SetIoHi(bma_scl); Delay(); SetIoLo(bma_scl); Delay(); } SetIoOut(bma_sda); returnbyte; } ***********************BMA150通信*********************** /****************************************************** 函数名: bma150_smbus_write_byte 功能: bma150iic写单字节 参数: 写的寄存器地址,写的数据 返回: 1,写失败0,写成功 备注: 无 ******************************************************/ u8bma150_smbus_write_byte(u8reg_addr,u8data) { I2C_Start(); I2C_SendByte(0x70);//从机地址 if(! Check_Acknowledge()) { I2C_Stop(); return1;//未响应 } I2C_SendByte(reg_addr); if(! Check_Acknowledge()) { I2C_Stop(); return1;//未响应 } I2C_SendByte(data); if(! Check_Acknowledge()) { I2C_Stop(); return1;//未响应 } I2C_Stop(); return0; } /****************************************************** 函数名: bma150_smbus_read_byte 功能: bma150iic读多字节 参数: 读的寄存器地址,读的数据指针,读的长度 返回: 1,读失败0,读成功 备注: 无 ******************************************************/ u8bma150_smbus_read_byte(u8reg_addr,u8*data,u8len) { u8i; I2C_Start(); I2C_SendByte(0x70);//从机地址 if(! Check_Acknowledge()) { I2C_Stop(); return1;//未响应 } I2C_SendByte(reg_addr); if(! Check_Acknowledge()) { I2C_Stop(); return1;//未响应 } I2C_Stop(); I2C_Start(); I2C_SendByte(0x71);//从机地址 if(! Check_Acknowledge()) { I2C_Stop(); return1;//未响应 } for(i=0;i { data[i]=I2C_ReadByte(); if(i<(len-1))I2C_Ack(); elseI2C_NoAck(); } I2C_Stop(); return0; } /****************************************************** 函数名: bma150_get_chip_id 功能: 读取bma150芯片id 参数: 存放ID指针 返回: 1,失败0,成功 备注: 无 ******************************************************/ u8bma150_get_chip_id(u8*chip_id) { if(bma150_smbus_read_byte(BMA150_CHIP_ID_REG,chip_id,1))return1;//未响应 *chip_id&=BMA150_CHIP_ID__MSK; return0; } /****************************************************** 函数名: bma150_read_accel_xyz 功能: 获取XYZ加速度值 参数: 加速度值存放结构体 返回: 1,失败0,成功 备注: 无 ******************************************************/ u8bma150_read_accel_xyz(structbma150acc*acc) { u8data[6]; if(bma150_smbus_read_byte(BMA150_ACC_X_LSB__REG,data,6))return1; acc->x=BMA150_GET_BITSLICE(data[0],BMA150_ACC_X_LSB)| (BMA150_GET_BITSLICE(data[1],BMA150_ACC_X_MSB)<< BMA150_ACC_X_LSB__LEN); acc->x=acc->x<<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BMA150 例程
![提示](https://static.bdocx.com/images/bang_tan.gif)