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

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

[复制链接]
sunnydevil 提问时间: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个回答
风铃草2 回答时间:2016-12-7 17:23:04
我正在调博世的BMA253,你调通I2C了吗?能发一份给我看看不?
jackten 回答时间:2016-12-7 17:46:36
学习一下               
sunnydevil 回答时间: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接了地。
sunnydevil 回答时间:2016-12-8 11:24:38
longway630 发表于 2016-12-8 11:08
你好,我在用模拟iic调bmx055,用的是stm8l152的ic,现在iic每次读id都是读到0xff,我参考例程,是不是只要 ...

请问你指的读id是读00地址的寄存器么,我初始化以后配置了一下量程还有其他的一些东西,这些都不会有影响,应该发命令reset一下以后就可以开始正常读数据了,先确保硬件接线正确,CSB3也要接地。
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
yhyeefocus 回答时间:2016-12-8 13:06:55
学习学习
sunnydevil 回答时间: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搞下了
123下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版