BMI055编程

2023-05-16

BMI055与其他imu不同的地方是他的加速度硬件单元和陀螺仪硬件单元是分开独立的(两个不同的CHIPID),他们使用两个不同的片选,地址空间重叠。

一般的imu如 mpu6050,mpu6500,mpu9250,imu160等等都是加速度硬件单元和陀螺仪硬件单元一体,一个片选,地址不重叠。
所以BMI055的编程稍微复杂点,需要两个spi,如果共用GPIO的话那就至少需要一个IO口模拟的spi(1硬件1模拟或者2个模拟)。
代码如下:

#include "imu.h"

void IMU_init(void)
{   
    u8 imu_data[12] = {0};
    u16 imu_dat[6] = {0};

    my_spi_io_init();
    IMU_config(RANGE_2G,RANGE_2000);
    while(1){//for test
      IMU_Read(imu_data);
      //acc
      imu_dat[0] = (u16)imu_data[1]<<4 | imu_data[0]>>4;
      imu_dat[1] = (u16)imu_data[3]<<4 | imu_data[2]>>4;
      imu_dat[2] = (u16)imu_data[5]<<4 | imu_data[4]>>4;
      //gyr
      imu_dat[3] = imu_data[7]<<8  | imu_data[6];
      imu_dat[4] = imu_data[9]<<8  | imu_data[8];
      imu_dat[5] = imu_data[11]<<8 | imu_data[10];
      asm("nop");
    }
}

void IMU_Read(u8 *buf)
{
    u8 i = 0;
    u8 addr = 0x00; 
    addr |= 0x80;//read
    //read acc data
    SPI_CS_ACC = 0;
    addr |= ACC_X_LSB_REG;
    My_SPI_ReadWriteByte(addr);
    for(i=0;i<6;i++){
        *(buf+i) = My_SPI_ReadWriteByte(0);     
        asm("nop");
    }
    SPI_CS_ACC = 1;
    //read gyr data
    SPI_CS_GYR = 0;
    addr |= GYR_X_LSB_REG;
    My_SPI_ReadWriteByte(addr);
    for(i=6; i<12; i++){
        *(buf+i) = My_SPI_ReadWriteByte(0);     
        asm("nop");
    }
    SPI_CS_GYR = 1;
}
//   for(i=0;i<6;i++){
//        SPI_CS_ACC=0;
//        addr |= (ACC_X_LSB_REG+i);
//        RW_SPI(addr);
//        acc[i] = RW_SPI(0);       
//        SPI_CS_ACC=1;
//    } 

u8 My_SPI_ReadWriteByte(u8 val)
{
    u8 i;
    for(i=0;i<8;i++){ 
        SPI_CLK = 0;
        asm("nop"); asm("nop"); asm("nop");
        //write
        if(val & 0x80)                                
            SPI_DO = 1;
        else
            SPI_DO = 0;
        val <<= 1;
        SPI_CLK = 1;
        asm("nop"); asm("nop"); asm("nop");
        //read
        if(SPI_DI)
            val |= 1;                                       
    }
    SPI_CLK = 0;    
    return val;
}

u8  IMU_config(u8 acc_range,u8 gyr_range)
{
    u8 res = 0;
    u8 reg = 0x00;//REG_CHIPID 
    reg |= 0x80;//read    

    //Check ACC CHIP_ID
    SPI_CS_ACC=0;
    My_SPI_ReadWriteByte(reg);          
    res = My_SPI_ReadWriteByte(0);      
    SPI_CS_ACC=1;
    if(res != ACC_CHIP_ID){
        res = 1;
    }
    //Check GYR CHIP_ID
    SPI_CS_GYR=0;
    My_SPI_ReadWriteByte(reg);          
    res = My_SPI_ReadWriteByte(0);      
    SPI_CS_GYR=1;
    if(res != GYR_CHIP_ID){
        res = 2;
    }   
    //Config ACC RANGE
    SPI_CS_ACC=0;
    My_SPI_ReadWriteByte(IMU_CONFIG_REG);//write            
    My_SPI_ReadWriteByte(acc_range);
    SPI_CS_ACC=1;
    SPI_CS_ACC=0;
    My_SPI_ReadWriteByte(reg | IMU_CONFIG_REG);         
    res = My_SPI_ReadWriteByte(0);//read reg 
    if(res != acc_range){//Write failed.
        res = 3;
    }
    SPI_CS_ACC=1;   
    //Config GYR RANGE
    SPI_CS_GYR=0;
    My_SPI_ReadWriteByte(IMU_CONFIG_REG);//write            
    My_SPI_ReadWriteByte(gyr_range);
    SPI_CS_GYR=1;
    SPI_CS_GYR=0;
    My_SPI_ReadWriteByte(reg | IMU_CONFIG_REG);         
    res = My_SPI_ReadWriteByte(0);//read reg 
    if(res != gyr_range){//Write failed.
        res = 4;
    }else{
        res = 0;//ok
    }
    SPI_CS_GYR=1; 
    return res;
}  


void my_spi_io_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;        
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );//PORTB奀笘妏夔 

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13 |  GPIO_Pin_15;//sck,miso
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);    
    GPIO_SetBits(GPIOB, GPIO_Pin_13 |  GPIO_Pin_15);  

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //MOSI  input
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //PA4: CS_ACC
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_SetBits(GPIOA,GPIO_Pin_4);

    //PB12: CS_GYR
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB,GPIO_Pin_12);    
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BMI055编程 的相关文章

  • 39.App中用户验证方案

    注 xff1a 这篇文章为15 app后端怎么设计用户登录方案的修改版 xff0c 以前的这篇博客写得太简单了 xff0c 弄得很多同学理解不了 xff0c 趁着写书 App后台开发运维和架构实践 的机会 xff0c 把这篇文章重写了 Ap
  • 电子爱好者必备,强烈推荐这些常用工具

    工欲善其事 xff0c 必先利其器 xff01 要想 DIY xff0c 工具同样重要 xff01 下面按照工具的必须程度从 初学者 至 发烧友 逐级提出建议 xff0c 供大家参考 xff01 首先明确一点 xff1a 本配置是针对电子类
  • 40.用创业思维复盘:写技术博客到出书

    在2013初 xff0c 笔者把过去两年开发app后端的经验总结成十多篇文章发表在博客上 xff0c 那些笔记发表以后的反响出乎本人的意料 xff0c 本人从网络上得到网友的支持和肯定 xff0c 证明这些知识还是有价值 2013年离开了当
  • 41.学习这事没有你想象那么难

    偶尔面试应聘者的时候 xff0c 发现有的应聘者虽然已经毕业一两年了 xff0c 但和他们聊天时 xff0c 觉得他们的技术水平怎么就像刚毕业的情况 xff0c 问他们基础的技术问题好像都不了解 xff1f 但是有的人毕业一两年后 xff0
  • 42.docker简介

    今年京东的618活动 xff0c 京东启动了将近15万个Docker容器 xff0c 这些Docker容器用于商品页 xff0c 订单 xff0c 搜索 xff0c 缓存 xff0c 数据库等服务 为啥docker能在京东大放异彩 xff1
  • 《App后台开发运维和架构实践》勘误

    49页第二行 提示客App 户端程序员 应改为 提示App客户端程序员 57页最后标题 2 PRC 应改为 RPC 61页中间 这个过程就是建立倒序搜引 应改为这个过程就是建立倒序索引 75页表格中 HTTP 请求方式 应为 HTTP 返回
  • golang时间相关的用法总结

    显示当前的时间 格式 34 2006 01 02 15 04 05 34 time Now Format 34 2006 01 02 15 04 05 34 显示当前的时间 格式 34 2006 01 02 15 04 05 232 34
  • 一路有你,倍感幸福!

    1 2012年的夏天 xff0c 一个男孩得知自己一个月后要到上海出差 xff0c 想学个技能以便到上海之后闷骚一把 有一天在网上看到了达芬奇的名字 xff0c 灵光一闪 xff1a 绘画不是逼格爆灯吗 xff1f 男孩兴冲冲地从网上买了一
  • golang: 把sql结果集以json格式输出

    代码出处 xff1a http stackoverflow com questions 19991541 dumping mysql tables to json with golang func getJSON sqlString str
  • mongodb: "Overflow sort stage buffered data usage of 33557904 bytes exceeds internal limit of 33554"

    mongodb报错 xff1a Overflow sort stage buffered data usage of 33557904 bytes exceeds internal limit of 33554432 bytes 这个问题是
  • 奇迹冥想后的奇迹

    lt Font Definitions 64 font face font family 宋体 panose 1 2 1 6 0 3 1 1 1 1 1 mso font alt SimSun mso font charset 134 ms
  • 《五天学会绘画》读后感-1至五章中

    五天学会绘画 xff0c 一个无比俗气的中文名 xff08 这本书的英文名字精准多了 xff1a The New Drawing on the Right Side of the Brain xff0c 大意为 使用右脑的新画画方式 xff
  • 电机驱动TB6612FNG全网断货,可替代方案来了,文末送模块!

    正巧 xff0c 这几天准备设计一款小型mini的小车车 xff0c 准备选用TB6612作为电机驱动 TB6612FNG是一款便宜且性能较好的一款电机驱动 xff0c 单个IC可以用来驱动2个直流减速电机 xff0c 电机电压在6 15V
  • ubuntu常见错误--could not get lock /var/lib/dpkg/lock -open

    最近研究ubuntu xff0c 用apt get命令安装一些软件包时 xff0c 总报错 xff1a E xff1a could not get lock var lib dpkg lock open等 出现这个问题的原因可能是有另外一个
  • Ubuntu 9.10, Java 5 and the Android Open Source Project

    出处 xff1a http blog enea com Blog bid 32050 Ubuntu 9 10 Java 5 and the Android Open Source Project Currently there is an
  • ubuntu 11.04下搭建android开发/编译环境 安装必要工作用软件

    出处 xff1a http jack22 iteye com blog 1125063 在ubuntu下工作一段时间了 xff0c 总结一下android开发 编译环境的搭建 JDK的安装 xff1a 自动安装 xff1a ubuntu的源

随机推荐

  • Debian包管理工具——APT的工作原理详解

    出处 xff1a http www opendigest org article php 726 Debian包管理工具 APT的工作原理与使用详解 概要 本文档的写作目的是帮助用户了解Debian包管理工具 APT的工作原理 xff0c
  • 《五天学会绘画》阅读感受(全,附绘画作品)

    五天学会绘画 http product dangdang com product aspx product id 61 20920637 xff0c 一个无比俗气的中文名 xff08 这本书的英文名字靠谱多了 xff1a The New D
  • 网络时代购买书

    一直很喜欢看书和买书 xff0c 从大学算起买书的钱都相当于现在一个月的工资了 但在这个年代有这么多的出版刊部 xff0c 应该怎么购买实体书呢 xff1f 下面是我总结的一些经验 xff1a 1 逛书店 这是我的一个特殊爱好 xff0c
  • 冰箱中得到的启示

    周末回到家中 xff0c 听到老妈对着冰箱抱怨 xff1a 冰箱又塞满了 xff0c 老妈对着满冰箱的食物左右为难 xff0c 不知道应该把哪些食物哪出来 这使我想起了一位朋友 xff0c 那时我买了一个160G的移动硬盘 xff0c 我朋
  • Andorid Ubuntu 11.4 中安装sun-java5-jdk

    终于找到了能安装jdk5的sources xff01 xff01 xff01 出处 xff1a http hi baidu com panda heroes blog item ebb4e72b88ac2c4a4ec2267e html 由
  • Ubuntu Linux下设置IP的配置命令

    出处 xff1a http www cnblogs com empire archive 2011 01 10 1931877 html 今天装了Ubuntu xff0c 但是发现不能上网 xff0c 开始排查问题 xff1a 1 首先确定
  • ubuntu设置ip和dns

    出处 xff1a http wenku baidu com view 3c587d370b4c2e3f5727634c html 装完ubuntu 第一件事情就是连上网 xff0c 换个源 xff0c 进行更新操作 xff0c 但前提条件是
  • 模电,没有你想象的那么难。

    无意中看到这个文章 xff0c 虽然自己也搞了4年模电了 xff0c 但后看完之后发现自己原来根本就没有入门阿 xff01 现发上来和大家共享 xff01 复旦攻读微电子专业模拟芯片设计方向研究生开始到现在五年工作经验 xff0c 已经整整
  • ubuntu 下用xampp配置虚拟站点

    1 编辑 opt lampp etc httpd conf a lt Directory gt Options FollowSymLinks AllowOverride all XAMPP Order deny allow Deny fro
  • Ubutu 10.10 配置ftp服务器

    出处 xff1a http blog csdn net jiabangok article details 6412742 配置FTP环境 配置好FTP还是非常有必要的 那么就开始配置FTP吧 xff0c 我的Ubuntu Server使用
  • Ubuntu 11.04下安装SVN图形界面客户端

    1 安装svn客户端 xff1a sudo apt get install subversion 2 安装图形界面客户端Rabbitvcs xff1a xff08 1 xff09 下载 http rabbitvcs googlecode c
  • ubuntu 11.04 安装gvim

    折腾了N久 xff0c 终于安装成功了 1 在www vim org上 下载 源码包 vim 7 3 tar bz2 2 开发库libncurses5 dev安装 xff1a sudo apt get install libncurses5
  • 解决安装magento时“Unable to read response, or response is empty” 的错误

    在安装magento时有时会出现 Url http 79 170 40 182 cosmeticsfairy co uk magento is not accessible Unable to read response or respon
  • Magento Enterprise Full Page Caching

    出处 xff1a https aniscartujo com webproxy default aspx prx 61 http magentophp blogspot com 2011 02 magento enterprise full
  • linux压缩和解压缩命令大全

    tar 解包 xff1a tar zxvf FileName tar 打包 xff1a tar czvf FileName tar DirName gz 解压1 xff1a gunzip FileName gz 解压2 xff1a gzip
  • SQL养成一个好习惯是一笔财富

    出处 xff1a http topic csdn net u 20110928 13 546b917a c048 4a04 8423 6f093596d3cd html 我们做软件开发的 xff0c 大部分人都离不开跟数据库打交道 xff0
  • 清除目录下的SVN信息

    出处 xff1a http apps hi baidu com share detail 21551981 在项目开发和日常文档管理时 xff0c 用到了SVN xff0c 由于要把一些文档发给同事 xff0c 这时想删除SVN版本信息文件
  • magento下生成excle文件方法

    注意 xff0c 这种方法本质上是生成xml文件 xff0c 但excel是能打开这种xml格式 xff0c 以下是一个demo xff1a data 61 array array 39 name 39 39 birthday 39 arr
  • 为什么电子通信,嵌入式工程师会有中年危机(修订版)

    中年危机在IT圈是个老生常谈的词了 xff0c 火哥第一篇文章也给大家分享这个话题 xff0c 当然火哥不是一个俗套的人 xff0c 就不去说一些不断学习 xff0c 提升技能的鸡汤了 我们先追本溯源地发现电子通信 xff0c 嵌入式工程师
  • BMI055编程

    BMI055与其他imu不同的地方是他的加速度硬件单元和陀螺仪硬件单元是分开独立的 xff08 两个不同的CHIPID xff09 xff0c 他们使用两个不同的片选 xff0c 地址空间重叠 一般的imu如 mpu6050 mpu6500