本帖最后由 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; |
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;
先结贴,后期再看看这个小问题到底是什么原因
我的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
请问你指的读id是读00地址的寄存器么,我初始化以后配置了一下量程还有其他的一些东西,这些都不会有影响,应该发命令reset一下以后就可以开始正常读数据了,先确保硬件接线正确,CSB3也要接地。
BMA253这个型号没接触过,不好意思
你这样操作应该是没问题的,可能是哪边的细节上有问题,读和写之间加点延时看一下,片选拉低之前也延时一下会不会有和正确的输出。
问题解决了,自己写的有问题,iic接收确实好多数据,时间长了点。也要看看spi搞下了
恩 这个的意思应该是免去了频繁的发指令读取,只要保持CSB的低电平,读取地址就会在前一个地址成功读取后自增。谢谢你的回答,问题解决了