你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于SPI方式读取博世BMX055九轴模块不成功的问题

[复制链接]
车厘子 提问时间:2016-12-7 17:17 /
本帖最后由 sunnydevil 于 2016-12-8 16:12 编辑

  最近实验用到博世BMX055模块,其中包含三轴陀螺仪,三轴加速度和三轴磁力计。目前用i2c方式通信可以正确收到数据,但是i2c接收数据时间太长,系统解算姿态的周期会因此受到影响,所以打算采用该模块的SPI方式读取。但是在写驱动时发现了一些问题很是不解,希望有接触过该模块或是感兴趣的坛友可以予以解答。
实验平台是stm32f103系列,现遇到的问题:
  该模块的SPI分为三线或是四线驱动,我采用的是平常用的四线驱动。文档给出的读写时序如下图:

读时序

读时序

写时序

写时序

图中的位说明如下图:

位说明

位说明

文档的意思是否是 在读模式时发出读命令后,同一个16位周期内的后八位SDO线上的数据就是前八位刚刚发出读命令所对应的数据?
但是在实验时我读了陀螺仪00地址的一个固定值,发现是在后一个周期的前八位才是正确的值(一般SPI会在后一个周期或是后两个周期会在SDO线上出现相应的值,而且文档会说明的很清楚),很是不解,也就是程序中的temp[2]读到了正确的值,但是在紧接着读加速度00地址的固定值时,又没有一个值是正确的,请问有坛友用SPI调试过该模块的可以解答下该疑问么?多谢
                        BMX055_GYRO_LOW; //陀螺仪片选
                        BMX055_SPI_Send(0x80); //读00寄存器
                        temp[0] = BMX055_SPI_ReceiveByte();
                        BMX055_SPI_Send(0xff);
                        temp[1] = BMX055_SPI_ReceiveByte();
                        BMX055_SPI_Send(0xff);
                        temp[2] = BMX055_SPI_ReceiveByte();
                        BMX055_SPI_Send(0xff);
                        temp[3] = BMX055_SPI_ReceiveByte();
                        BMX055_GYRO_HIGH;


                        BMX055_ACC_LOW; //加速度片选
                        BMX055_SPI_Send(0x80);
                        temp[3] = BMX055_SPI_ReceiveByte();
                        BMX055_SPI_Send(0xff);
                        temp[4] = BMX055_SPI_ReceiveByte();
                        BMX055_SPI_Send(0xff);
                        temp[5] = BMX055_SPI_ReceiveByte();
                        BMX055_SPI_Send(0xff);
                        temp[6] = BMX055_SPI_ReceiveByte();
                        BMX055_ACC_HIGH;


收藏 2 评论21 发布时间:2016-12-7 17:17

举报

21个回答
车厘子 回答时间:2016-12-8 16:11:21
驱动已经能够正确读取传感器的数值,部分读取如下:
        BMX055_ACC_LOW;
        BMX055_SPI_Send(0x82);
        BMX055_SPI_Send(0xff);
        BMX055_SPI_ReceiveByte();//一定要读取,否则导致以下的数据接收不准确,原因可能与模块内部的锁寄存器有关??而且读出的值是一个固定值,
        BMX055_SPI_Send(0xff);
        temp[0] = BMX055_SPI_ReceiveByte();//XLSB
        BMX055_SPI_Send(0xff);
        temp[1] = BMX055_SPI_ReceiveByte();//XMSB
        BMX055_SPI_Send(0xff);
        temp[2] = BMX055_SPI_ReceiveByte();//YLSB
        BMX055_SPI_Send(0xff);
        temp[3] = BMX055_SPI_ReceiveByte();//YMSB
        BMX055_SPI_Send(0xff);
        temp[4] = BMX055_SPI_ReceiveByte();//ZLSB
        BMX055_SPI_Send(0xff);
        temp[5] = BMX055_SPI_ReceiveByte();//ZMSB
        BMX055_ACC_HIGH;
先结贴,后期再看看这个小问题到底是什么原因
longway630 回答时间:2016-12-8 11:32:09
sunnydevil 发表于 2016-12-8 11:24
请问你指的读id是读00地址的寄存器么,我初始化以后配置了一下量程还有其他的一些东西,这些都不会有影响 ...

我的CSB3已经接地了。BMX055在iic通讯时有回应ack。我的初始化程序:
Single_Write(0x18,0x14,0xb6);//reset
Single_Write(0x18,0x0f,0x0c);//+/- 16g
Single_Write(0x68,0x14,0xb6);
Single_Write(0x68,0x0f,0x02);// 500
Single_Write(0x10,0x4b,0x81);
然后执行读ID操作:
ID = Single_Read(0x18,0x00);
看datasheet上写的应该回应0xFA,但是我这边一直都是0xFF。用示波器看也是0xFF
车厘子 回答时间:2016-12-8 11:24:38
longway630 发表于 2016-12-8 11:08
你好,我在用模拟iic调bmx055,用的是stm8l152的ic,现在iic每次读id都是读到0xff,我参考例程,是不是只要 ...

请问你指的读id是读00地址的寄存器么,我初始化以后配置了一下量程还有其他的一些东西,这些都不会有影响,应该发命令reset一下以后就可以开始正常读数据了,先确保硬件接线正确,CSB3也要接地。
飞儿 回答时间:2016-12-7 17:23:04
我正在调博世的BMA253,你调通I2C了吗?能发一份给我看看不?
jackten 回答时间:2016-12-7 17:46:36
学习一下               
车厘子 回答时间:2016-12-8 08:04:06
风铃草2 发表于 2016-12-7 17:23
我正在调博世的BMA253,你调通I2C了吗?能发一份给我看看不?

BMA253这个型号没接触过,不好意思
longway630 回答时间:2016-12-8 11:08:52
你好,我在用模拟iic调bmx055,用的是stm8l152的ic,现在iic每次读id都是读到0xff,我参考例程,是不是只要发初始化后,就可以读id了?不知道是什么原因。硬件:3.3v GND,PS接了3.3v,SDO1、SDO2接了地。
yhyeefocus 回答时间:2016-12-8 13:06:55
学习学习
车厘子 回答时间:2016-12-8 13:14:14
longway630 发表于 2016-12-8 11:32
我的CSB3已经接地了。BMX055在iic通讯时有回应ack。我的初始化程序:
Single_Write(0x18,0x14,0xb6);//re ...

你这样操作应该是没问题的,可能是哪边的细节上有问题,读和写之间加点延时看一下,片选拉低之前也延时一下会不会有和正确的输出。
longway630 回答时间:2016-12-8 13:26:44
sunnydevil 发表于 2016-12-8 13:14
你这样操作应该是没问题的,可能是哪边的细节上有问题,读和写之间加点延时看一下,片选拉低之前也延时一 ...

问题解决了,自己写的有问题,iic接收确实好多数据,时间长了点。也要看看spi搞下了
废鱼 回答时间:2016-12-8 14:39:00
楼主读取的有问题,发送地址完成后,直接读取需要的个数。如下图说明:
截图_1.png
车厘子 回答时间:2016-12-8 15:52:14
安 发表于 2016-12-8 14:39
楼主读取的有问题,发送地址完成后,直接读取需要的个数。如下图说明:
...

恩 这个的意思应该是免去了频繁的发指令读取,只要保持CSB的低电平,读取地址就会在前一个地址成功读取后自增。谢谢你的回答,问题解决了
zbber 回答时间:2016-12-8 21:03:10
强烈支持楼主ing……
YQQLX 回答时间:2017-3-6 17:37:37
你好,关于i2c的BMX055初始化能不能给我发一份呢,我的陀螺仪数据调的不准,静止状态时,波动太大
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版