最近在搞一个和加速度计相关的项目,所以接触到的传感器比较多,现在写一个总结吧,防止后来者和我一样走这么多的弯路。
  首先看到的是引脚图,如果驱动不了应该首先排除硬件的问题:
SPI接法

IIC接法

接着我们就着重看下面的几个寄存器:

传感器名(读/写) 寄存器号 功能
CHIPID® 0x00 芯片的ID,一般用来看驱动是否正常,固定值0xD1
PMU_STATUS® 0x03 显示当前各传感器的电源模式,分normal\low_power\suspend三种模式
ACC_CONF(RW) 0x40 设置输出数据速率、 带宽和加速度传感器读取的模式
ACC_RANGE 0x41 允许选择的加速度 g 范围
GYR_CONF(RW) 0x42 在传感器中设置输出数据速率、 带宽和陀螺仪读取的模式。
GYR_RANGE(RW) 0x43 定义 BMI160 角速度测量范围
INT_EN(RW) 0x50-0x52 启用各种中断,包括加速度数据、角速度数据和各种特殊功能的中断,使能后映射到INT1上输出,就可以触发单片机的外部中断了。
INT_OUT_CTRL(RW) 0x53 输出控制,包括输出使能,触发电平、边沿和输出模式(推挽和开漏)
INT_LATCH(RW) 0x54 设置中断锁存模式(不是很懂,一开始就是锁存了所以一直没有中断输出…,后来关掉就好了)
CMD® 0x7E 命令寄存器触发操作,如 softreset、 NVM 编程等。特殊的如:start_foc、acc_set_pmu_mode、gyr_set_pmu_mode、mag_set_pmu_mode、prog_nvm、fifo_flush、int_reset、softreset、step_cnt_clr

接下来就是各种特殊功能寄存器了,就不多说了,用哪个配置那个就可以了
重点说下这个计步的功能吧,现在还比较火:

传感器名(读/写) 寄存器号 功能
STEP_CONF(RW) 0x7A-0x7B 步数检测的配置,包括Normal mode,Sensitive mode,Robust mode三种也可以自己配置
STEP_CNT® 0x78-0x79 直接从这两个寄存器中读出记得步数,要注意的是范围是-32768——32768

下面的代码片是计步的初始化,用的是STM32F405:

void bmi160_init(void)
{uint8_t ui8Status = 0;uint8_t ui8Attempts = 20;uint8_t Device_ID;BMI160_SPI_Init();kprintf("BMI160 Init Ok.\n");BMI160_CS=1;          //SPI片选取消// Reset the BMI160 sensorbmi160_reset();// Put accel and gyro in normal mode.while (ui8Status != 0x20 && ui8Attempts--){BMI160_Write_Reg(AM_DEVICES_BMI160_CMD, 0x12);//设置加速度计为  low_powerBMI160_Write_Reg(AM_DEVICES_BMI160_CMD, 0x14);//设置陀螺仪          suspenddelay_ms(1);                 ui8Status = BMI160_Read_Reg(AM_DEVICES_BMI160_PMU_STATUS);//读加速度和陀螺仪是否初始化为low_power suspend}// BMI160 not in correct power modeif (!ui8Attempts){return;}kprintf("PMU_STATUS:0x%X \r\n",ui8Status);BMI160_Write_Reg( AM_DEVICES_BMI160_STEP_CONF_0, 0x15);//计步功能BMI160_Write_Reg( AM_DEVICES_BMI160_STEP_CONF_1, 0x0B);BMI160_Write_Reg( AM_DEVICES_BMI160_ACC_RANGE, 0x05);//设置加速度计+-4g// Read status register to clear it.ui8Status = BMI160_Read_Reg(AM_DEVICES_BMI160_ERR_REG);//读错误状态寄存器清ui8Status// Enable INT 1 output as active highBMI160_Write_Reg(AM_DEVICES_BMI160_INT_OUT_CTRL, 0x0A);//输出使能INT1引脚,高电平活跃//INT1 Set// Map INT1 to the Step detection interruptBMI160_Write_Reg(AM_DEVICES_BMI160_INT_MAP_1, 0x80);//映射INT1到 watermark中断// Enable INT 1 as FIFO watermarkBMI160_Write_Reg(AM_DEVICES_BMI160_INT_EN_1, 0x10);//使能data-ready
}
//得到步数
void bmi160_getStep(short *rawStep)
{uint8_t buf[2];buf[0]= BMI160_Read_Reg(AM_DEVICES_BMI160_STEP_CNT_1);buf[1]= BMI160_Read_Reg(AM_DEVICES_BMI160_STEP_CNT_0);*rawStep=((uint16_t)buf[0]<<8)|buf[1];
}

SPI的初始化(我一开始用的是EEPROM的SPI配置读写等,一直驱动不了,后来才突然发现是SPI的问题):

///以下为BMI160驱动
void BMI160_SPI_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能SPI1时钟//GPIOF9,F10初始化设置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//PB3~5复用功能输出   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1); //PI1复用为 SPI1GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1); //PI2复用为 SPI1GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1); //PI3复用为 SPI1//这里只针对SPI口初始化RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1SPI_I2S_DeInit(SPI1); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master;     //设置SPI工作模式:设置为主SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;       //设置SPI的数据大小:SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;       //串行同步时钟的空闲状态为高电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;  //串行同步时钟的第二个跳变沿(上升或下降)数据被采样SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;     //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;      //定义波特率预分频的值:波特率预分频值为256SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7;  //CRC值计算的多项式SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器SPI_Cmd(SPI1, ENABLE); //使能SPI外设SPI1_ReadWriteByte(0xff);//启动传输
}//SPI1速度设置函数
//SPI速度=fAPB2/分频系数
//@ref SPI_BaudRate_Prescaler:SPI_BaudRatePrescaler_2~SPI_BaudRatePrescaler_256
//fAPB2时钟一般为84Mhz:
void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)
{assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//判断有效性SPI1->CR1&=0XFFC7;//位3-5清零,用来设置波特率SPI1->CR1|=SPI_BaudRatePrescaler;   //设置SPI1速度 SPI_Cmd(SPI1,ENABLE); //使能SPI1
}
//SPI1 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(u8 TxData)
{u8 result,Retry=0;//result:返回spi读写的结果; retry:失败重试次数while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET){Retry++;if(Retry>200) return 0;}SPI_I2S_SendData(SPI1, TxData);while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET){Retry++;if(Retry>200) return 0;}return SPI_I2S_ReceiveData(SPI1);SPI_I2S_ClearFlag(SPI1,SPI_I2S_FLAG_RXNE);
}//读取SPI寄存器值
//reg:要读的寄存器
u8 BMI160_Read_Reg(u8 reg)
{   u8 reg_val;     BMI160_CS = 0;          //使能SPI传输  delay_ms(1);    SPI1_ReadWriteByte(reg|0x80);   //1.发送寄存器号 //Ored with "read request" bitreg_val=SPI1_ReadWriteByte(0XFF);//读取寄存器内容  // send a value of 0 to read the first byte returned:delay_ms(1);   BMI160_CS = 1;          //禁止SPI传输          return(reg_val);           //返回状态值
}//SPI写寄存器
//reg:指定寄存器地址
//value:写入的值
u8 BMI160_Write_Reg(u8 reg,u8 value)
{u8 status; BMI160_CS=0;                 //使能SPI传输status =SPI1_ReadWriteByte(reg&0x7f);//2.发送寄存器号SPI1_ReadWriteByte(value);      //写入寄存器的值BMI160_CS=1;                 //禁止SPI传输    return(status);                  //返回状态值
}

[Sensor]BMI160-加速度计、陀螺仪传感器相关推荐

  1. 维特智能蓝牙5.0加速度计陀螺仪传感器倾角电子罗盘磁力计仰卧起坐

    1.项目介绍 仰卧起坐检测项目是应用于中小学生或部队训练时,对仰卧起坐这个项目的监测.实现的功能包括以下方面: 引导用户规范动作,也就是动作必须达标才能算完成一个动作,平躺要躺平,坐起要到达90°. ...

  2. 一种基于陀螺仪传感器的准确计步器算法

    一种基于陀螺仪传感器的准确计步器算法 A Gyroscope Based Accurate Pedometer Algorithm 作者:Sampath Jayalath.Nimsiri Abhaya ...

  3. Android传感器之陀螺仪传感器

    代码片段,双击复制 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ...

  4. 重力加速度陀螺仪传感器MPU-…

    原文地址:重力加速度陀螺仪传感器MPU-6050(一)作者:liuzhangchao MPU-60X0 对陀螺仪和加速度计分别用了三个16 位的ADC,将其测量的模拟量转化 为可输出的数字量.为了精确 ...

  5. 重力加速度陀螺仪传感器MPU-6050

    MPU-60X0 对陀螺仪和加速度计分别用了三个16 位的ADC,将其测量的模拟量转化 为可输出的数字量.为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250,±50 ...

  6. 惯性导航原理(一)-航位推算+加速度计+陀螺仪+IMU+INS

    文章目录 导航定位原理分类 航位推算(Dead-Reckoning) 牛顿运动定律 惯性传感器--加速度计 力反馈原理 加速度计种类 惯性传感器--陀螺仪 转子陀螺-陀螺定轴性 振动陀螺-哥氏效应(C ...

  7. 手机中陀螺仪传感器的四大作用

    核心提示:陀螺仪传感器可以全方位的感受空间上位移的变化维较少,最早应用于航空.航天和航海等领域.随着陀螺仪传感器成本的下降,现在很多智能手机都集成有陀螺 陀螺仪传感器可以全方位的感受空间上位移的变化维 ...

  8. I2C通信之Arduino 陀螺仪传感器ITG3205

    topic I2C通信之Arduino与陀螺仪传感器ITG3205 I2C通信之Arduino与陀螺仪传感器ITG3205 转载自:https://www.geek-workshop.com/thre ...

  9. iOS平台使用陀螺仪传感器

    iOS平台使用陀螺仪传感器 在移动端开发过程中,有时候会用到陀螺仪传感器获取当前手机的姿态,下面给出iOS端如何获取陀螺仪姿态数据的代码: 1 //根据陀螺仪的四元数转换为矩阵 2 + (GLKMat ...

  10. [Sensor]--BMI160-加速度计、陀螺仪传感器

    最近在搞一个和加速度计相关的项目,所以接触到的传感器比较多,现在写一个总结吧,防止后来者和我一样走这么多的弯路. 首先看到的是引脚图,如果驱动不了应该首先排除硬件的问题: SPI接法 IIC接法 接着 ...

最新文章

  1. 如果我是博客园的产品经理【下】
  2. java 如何对由json对象构成的数组形式的字符串进行遍历?
  3. HBase 1.x Coprocessor使用指南
  4. PASTE Splay
  5. ArcGIS Engine 编辑- ITask
  6. 转:Fiddler抓包工具总结
  7. PHP获取表单数据的方法有几种,如何实现PHP获取表单数据与HTML嵌入PHP脚本
  8. Windows下Python3+nose+appium自动化测试之Android篇
  9. 史上最新最全的来自成都的Azure系列文章,助你上云!老少皆宜,童叟无欺!
  10. sqlyog备份数据和导入备份数据
  11. GloVe损失函数的理解
  12. endnote X7 超级初学者教程
  13. 国密SM2/SM3算法在单片机平台上的实现(C语言)
  14. 撬动百亿台设备,让物联网“造”起来!
  15. Gradle从入门到实战 - Groovy基础(by任玉刚)读后笔记
  16. 手机安装W ndows7镜像,Windows7专业版
  17. iReport导出Excel文件一个字段要占用多列问题的解决
  18. PS中蒙版使用简单实例
  19. 扬州美女能否走出传说产生经济价值?
  20. 多元回归分析(线性回归)

热门文章

  1. [转载]在安装win7系统时如何不产生100M的系统保留分区
  2. 在哪可以找c语言编程的答案,c语言程序设计课后习题答案.doc
  3. 好多游戏,大部分都有修改器,大家赶紧下!
  4. 汉字、图形,Zebra打印机完全解决方案
  5. 三菱触摸屏通讯错误_s7-200和三菱触摸屏通讯的问题
  6. 中兴新支点Linux国产操作系统安装windows字体的方法
  7. 使用minidwep-gtk
  8. 热敏电阻制作温度传感器的c语言,课题一NTC热敏电阻温度测量和控制系统.doc
  9. codeblock图形界面编程(二)
  10. A1 A2 B1 B2 英语分级单词 汇总