本篇内容为,通过 I2C 配置 GY-91 MPU9250+BMP280 里面的 MPU9250 连接 AK8963 磁感应。两个办法,1)MPU9250 设置 Master Mode 通过 AUX I2C 读写,2)Pass Through Mode 由 Host (单片机或者本文的 BBB)直接用 I2C 读写。本文两种方式都会操作一次。

最初看到淘宝上面有卖 GY91 MPU9250+BMP280 时候,它写着九轴,是九个轴。地球上原来除了 X Y Z 之外,还有四五维空间里面的 6 个轴,原来所谓的九轴,是陀螺仪三轴,加速度三轴,磁感应三轴(指南针),才叫做九轴。MPU9250 是 InvenSense 出品,它本身就是一个模块集成了三个东西,还有个自身的温度计(芯片温度),FIFO,Digital Motion Processor(DMP,就是姿势识别,计步器那些),Interrupt(可惜 INT 脚在 GY91 没有了)。而我买了的 GY91 MPU9250+BMP280,又再集成了 Bosch BMP280 在一起。三个字,比较贵。

其实这个模块产品我是看了很久很久,一直就在购物车里面,最近才舍得拍下。

上一篇只从I2C总线操作 BMP280,http://www.cnblogs.com/leptonation/p/5210331.html,这次分三篇博文,我希望全面攻克这整个模块,用于我将来的遥控直升机项目里。上一篇已经介绍过 I2C 的基本操作,这次内容主要是 Data Sheet 资料和快速的命令行操作方式。

第一部分,是I2C接 MPU9250,操作里面的磁感应。

MPU9250 地址

接线和原理图在上一篇。说明书上说,MPU9250 I2C 从机地址是 110100X,LSB取决于 AD0 是否拉低。从原理图看到是拉低了的,就是 1101000(0x68),见下图:

图片中另一个地址,0x76,是上一篇博文的 BMP280 温度气压传感器地址。

Dump 一下:

看看说明,Device ID 在,WHO AM I 寄存器,地址 0x75:

再看看 Register 描述,只读 value 为 0x71,与上面 Dump 出来结果一致。

但事情还没结束。说明书提到 MPU9250,是磁感应作为一块,加速和陀螺仪为一块,分开两个 die house。看 Register Map 可见,两者是分开描述的,各自有自己的 Device ID。这是因为,磁感应是 Asahi Kasei Microdevices Corporation 生产的 AKM8963 集成进去的,它是连接着 AUX I2C 引脚的,不是我现在接着的总线。GY-91 MPU9250+BMP280 的情况如下面简图:

就是说,还有一个 Device ID,AKM8963的。要它出现,两个办法,第一,利用加速陀螺仪作为 MASTER 让它去读取 AKM8963 的 Device ID Register,或者,Pass-Through Mode,由 Host 接管(本实验的 Host 即 BBB)。两个都操作一次看看。

(1)MPU9250 作为 I2C MASTER 从 AUX I2C 与从机交互

MPU9250 作为 Master 最多只能储存 Slave 的 24 bytes,暂存 AKM 的感应数据,卓卓有余。寄存器是 EXT_SENS_DATA_00 至 23,地址 0x49 至  0x60。多一个从机也是一样,共用的,相关详情、顺序、重置等等的方法,请自己看说明书。

只读的话,关键部位五个:

  • I2C Master Mode Enable(MPU 作为主机),
  • Slave 0 Enable(启用第一个从机配置),
  • Slave 0 I2C Address(从机实际总线地址),
  • Slave 0 Register Address (开始读取的地址),
  • Slave 0 Length (读取或写入的数据长度,多少个 byte)。

Slave 0 Enable 与 Slave 0 Length

从机连线读取数据的配置,在这里:

Enable 和 读取长度,都在 0x27 I2C_SLV0_CTRL 寄存器内设置。bit 7 为 1 时候启用,我只读一个 byte 所以 <3:0> 设成 1 即可。就是I2C_SLV0_CTRL(0x27) 设成 10000001 (0x81)。

Slave 0 Register Address

起始读取位置设置在 0x26 I2C_SLV0_REG。由于 AKM8963 的 Device ID 在 0x00,I2C_SLV0_REG(0x26) 默认值就是 0x00,不用调,我就只读它。

Slave 0 I2C Address

AKM8963 的从机地址,请参看这里:
http://www.akm.com/akm/en/file/datasheet/AK8963.pdf

文档描述截图中下半部的是加上的 LSB R/W bit, 只看地址不用管它,RW 在 MPU 那边配。7 bit 地址就 0001100 至 0001111 可选,视乎接线,我瞎猜,第一个就中了,0001100 (0x0C),然后回到 MPU9250 Data Sheet 的从机地址配置描述:

RW 在 MSB 的。我只读,那整个 I2C_SLV0_ADDR (0x25) 从机地址配置的 8 bit 值,就是 10001100 (0x8C)。

I2C Master Mode Enable

主机模式配置在这里USER_CTRL register (0x6A) 里面,bit5,I2C_MST_EN:

需要给它值,00100000(0x20)。

总结,用命令行的话,就是这样操作:

i2cset -y 1 0x68 0x25 0x8C
i2cset -y 1 0x68 0x27 0x81
i2cset -y 1 0x68 0x6A 0x20

MPU9250 直接读取从机 AKM 磁感应 Register 效果

再 dump 一次看看效果:

刚才说过,用来放从机读取值的第一个寄存器,EXT_SENS_DATA_00,地址 0x49,现在有值了,它就是从 AKM8963 的 0x00 Device ID 寄存器读取到的值,01001000(0x48),与 AKM 的 Data Sheet 描述一致:

成功。

从 MPU9250 对 AKM8963 的寄存器写入值

然后到 MPU 对 AKM 寄存器写入值。说在前面,说明书的建议是 I2C Pass Through 由 Host 做好 AKM 的配置,然后才使用 AUX I2C,从 SLV0 不断读取。

要 AKM 工作测量,就要设置它的工作模式,CNTL1 Register,地址 0x0A:

我选择连续测量模式,100Hz,16bit Output ,参考上图,0x0A 的值就应该设置为 000 1 0110(0x16),测试而已。知道了要设置哪个寄存器,知道要写入什么值,然后就是如何操作 MPU9250 的 AUX Slave 写入。方法就是把写入的值放在 I2C_SLV0_DO (0x63)。但首先,要配置好 SLV0 先。

指定 SLV0 参数,同上 0x25 指定AKM的 I2C地址,不过这次 bit 7 为零,写入模式。写入的寄存器地址是 0x0A。然后启用 SLV0,虽然是写入,但同样长度是一个byte,所以写入 0x81 到 0x27 寄存器:

i2cset -y 1 0x68 0x25 0x0C
i2cset -y 1 0x68 0x26 0x0A
i2cset -y 1 0x68 0x27 0x81

启用 I2C MASTER 模式(如果你之前还没启用的话):

i2cset -y 1 0x68 0x6A 0x20

最后写入值到 I2C_SLV0_DO,让 MPU 传给 AKM,0x16:

i2cset -y 1 0x68 0x63 0x16

怎么验证是否正确写入了?读出来就知道了,把地址 bit 7 改为 1:

i2cset -y 1 0x68 0x25 0x8C

效果:

上图红框,储存在寄存器 EXT_SENS_DATA_00 (0x49)的值 0x16 ,它就是通过 MPU 读取 AKM 的 0x0A 寄存器的值,同样地是我刚刚通过 MPU 写入的值。这样就确认了写入正确。指南针已经处于连续测量状态,你喜欢的还可以用 AKM 的状态寄存器读取状态,或者做些更有意义的事,看看已测量到的值:

目标数据,在 0x03 至 0x08,共 6 bytes。

i2cset -y 1 0x68 0x25 0x8C
i2cset -y 1 0x68 0x26 0x03
i2cset -y 1 0x68 0x27 0x86

取得的值,单位是 μT,上图中 X 值占 2 bytes,0x49 地址是 LSB,就是说十进位值为 32:

X

32 μT

 

Y

65394 μT

(注)

Z

65452 μT

(注)

(注)上表的 Y / Z 是错误的。写这部分时候,我实在非常大意,没注意是二补数,带正负值的。感谢网友RealMagic 提点指出问题,详见评论五楼,和六楼我的回复。

(2)Pass Through Mode,从 Host 用 I2C 总线直接连 AKM

Pass Through Mode 的设置,在 INT Pin / ByPass Register,寄存器地址 0x37,说明如下图:

之前提到这说明书建议,出自这里,Pass-Through mode is useful for configuring the external sensors,or for keeping MPU in a low-power mode ….。先看看怎么做,然后才判断到底应该怎样做。

MASTER 禁用然后 Pass Through 启用后,i2cdetect 就会看到 0x0c 直接出现在总线上,0x0c 就是磁感应的 I2C 地址。

操作一下,连续读取模式,然后 dump 就看到磁感应数据了。

就是普通的 I2C 通讯方式,非常简单。其他的写入值到寄存器等等,与其他 I2C 一样,不写出来了。

为何要用 Master Mode

既然 Pass Through 那么简单,为何不用 Pass Through 而要用 Master mode?因为我希望,生死攸关的数据,用最高速度传给控制器,然后它迅速作出适当反应。SPI 比 I2C 快,倾斜角,对于飞控是生死攸关,所以,我选用 SPI 连。

但是,GY91 这模块没有暴露 AKM 指南针的 SPI 接口给我,引脚的片选只有两个,一个是温度计,一个是 MPU,这情况,用 SPI 之后要接 AKM 我别无选择,只能 MASTER MODE。下一篇,SPI 通讯,读取 Accelerometer/Gyroscope(飞控当前姿态),再通过 Master Mode 用 AUX I2C 定时获取 Magnetometer(飞控航角)。希望在下一篇,事情会变得稍为有趣一些。

我在这群里,欢迎加入交流:
开发板玩家群 578649319
硬件创客 (10105555)

转载于:https://www.cnblogs.com/leptonation/p/5225889.html

Beaglebone Black – 连接 GY-91 MPU9250+BMP280 九轴传感器(1)相关推荐

  1. arduino调试BNO080高精准度九轴传感器模块

    arduino调试BNO080高精准度九轴传感器模块 原文链接:https://www.yourcee.com/newsinfo/2925867.html 1.简介 2.原理图 3.使用前准备 4.接 ...

  2. 三轴加速度计测量值生成算法matlab,[算法][三轴、六轴、九轴传感器算法分析] 1、分享一个三轴加速计matlab动态可视化脚本...

    一.有啥用 这里用的是LIS3DH三轴加速计,输出为X.Y.Z轴的加速度,通过串口连接电脑,电脑里运行matlab脚本通过串口实时获取数据并做可视化显示. 这里虽然是针对LIS3DH的,其实稍作修改即 ...

  3. 九轴传感器姿态----AHRS算法开源项目推荐

    1. AHRS简介 九轴MEMS传感器(三轴陀螺仪+三轴加速度计+三轴磁强计)可以用来做航向和姿态参考系统,即AHRS(attitude &heading reference system), ...

  4. 四旋翼无人机学习第6节--SPL06气压传感器和MPU9250九轴传感器电路分析

    文章目录 0 前言 1 SPL06气压传感器芯片手册示例图分析 2 原理图绘制成果分享 3 芯片IIC功能介绍 4 MPU9250气压传感器芯片手册示例图分析 5 原理图绘制成果分享 6 防护罩原理图 ...

  5. 九轴传感器MPU9250数据读取磁力计

    有的小伙伴找不到MPU9250的中文资料,只能根据MPU6500的例程读取六轴. 关键的地方是MPU9250里已经说明了,看不到实在不应该. MPU9150里面是MPU6500+AK8975,MPU9 ...

  6. 三轴加速度传感器和六轴惯性传感器_[算法][三轴、六轴、九轴传感器算法分析] 1、分享一个三轴加速计matlab动态可视化脚本...

    一.有啥用 这里用的是LIS3DH三轴加速计,输出为X.Y.Z轴的加速度,通过串口连接电脑,电脑里运行matlab脚本通过串口实时获取数据并做可视化显示. 这里虽然是针对LIS3DH的,其实稍作修改即 ...

  7. UAV021(三):九轴传感器(加速度计、陀螺仪和磁力计)校准方法

    目录 序 一. 加速度计简单校准 二.陀螺仪简单校准 三.磁力计简单校准 序 UAV021(二)中使用STM32F4通过IIC协议实现了读取加速度.角速度以及Yaw角.然而,原始数据是不能用的,校准是 ...

  8. 关于MPU9250的六轴DMP和九轴MPL

    九轴MPL刷新的最快频率应该是200HZ,直接出三个欧拉角--偏航.俯仰.翻滚(可以查看四元素),三轴加速度.角速度.磁力值和温度都能读,有单独的读取函数,读出来的都是原始值,还要处理(例程正点原子的 ...

  9. STM32应用(七)JY901九轴姿态模块(串口DMA空闲中断和I2C通信)

    文章目录 0.相关基础知识介绍 0.1六轴.九轴传感器有什么区别? 1.JY901模块简介 1.1 产品概述 1.2 性能参数 1.3 实物图和接线 2.软件和使用说明书 3.串口通信JY901 3. ...

  10. 九轴陀螺仪ICM20948磁力计校准

    九轴陀螺仪ICM20948磁力计校准 ICM20948九轴传感器目前应用广泛,是非常适合用于智能手机,平板电脑,可穿戴式传感器,物联网和应 用的全球功耗最低的9轴MotionTracking设备.其融 ...

最新文章

  1. 数据传送到后端(二)
  2. UVa540 Team Queue
  3. liunx服务(Nginx服务器 web服务器源码包和rpm 服务平滑升级)
  4. 面试Nginx的几个常见问题(
  5. 【算法精讲】集成分类与随机森林
  6. 《Java从入门到放弃》JavaSE入门篇:文件操作
  7. 招聘 | 微生太高薪招聘多组学生信官(硕士及以上),月薪12k(北京为例),全国均可办公,推荐成功者奖励2000元...
  8. SentinelResource注解配置下_客户自定义限流处理_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0047
  9. SQLi LABS Less-21
  10. QtCreator中导入“.lib(.a)”和“.dll(.so)”文件的方法
  11. Underscore.js
  12. ibm linux mq 发送消息_面试官提问:说说你对消息队列的理解
  13. 在html5水平边距属性hspace,响应式网页设计(html5+css3+cms)教学课件作者李文奎第2章html基础.pptx...
  14. android北京实时公交,北京公交实时掌上查询
  15. Ribbon负载均衡分析
  16. 鼠标能动但是无法点击屏幕(间歇性)
  17. iOS 一步步带你实践组件二进制方案
  18. gossiping路由协议仿真
  19. Google CardBoard SDK for Unity集成指南
  20. Java中扫雷游戏的递归算法_扫雷之递归

热门文章

  1. HTML5教程书籍电子版30本合集
  2. python分割图片、合并图片
  3. Linux的远程管理协议是什么,2-Linux权限与远程管理
  4. 电子设计(8)NPN和PNP三极管驱动LED电路
  5. SPA(单页面应用)的理解
  6. Qt5.9生成一个Adroid的apk应用实例
  7. 关键字CORRESPONDING的用法
  8. F.interpolate——数组采样操作
  9. Linux动态链接库.so文件的命名及用途总结
  10. [自用代码]基于python的遥感影像传统分割方法(直方图双峰法,阈值分割法,模糊C均值法,超像素分割法,K-means,snake)