上一篇提到过位域的问题,而我学习位域主要是,运用在BMX055的驱动上,这篇博客讲讲怎么驱动BMX055,BMX055是一款九轴传感器(包含陀螺仪,加速度计和地磁计)。用店家的例程时候发现数据完全不对,但是至少出来了数据,说明I2C部分是对的,于是我把原工程的I2C部分保留了下来,其余部分准备自己翻看手册来写。
翻看手册后,大概看了一下,前面一大堆讲的是芯片特性,各种模式,中断配置等等,由于之前使用过MPU6050,所以对这类传感器的配置较为熟悉,所以直接直接跳到了寄存器部分,找到软件复位的寄存器,配置让加速度计先软件复位,之后再设置了传感器的范围,然后开始从寄存器读数据,加速度计是12位的,存在两个寄存器里面,所以需要将两个寄存器的数据相或,并且用位域的方法取出12位有效数据并强制转化为32位,同样的方法用于陀螺仪的时候不行,看了好久才发现问题所在。错误代码如下:
for(i = 0; i < 3;i ++)//0 1 2  0 1 2 3 4 5
{
Gyro_dat[i] = (float)((int)(BMX055_GBUF[2*i] | BMX055_GBUF[2*i+1]<<8))*GyroSen;
}

其中,int是32位的,而数组定义是无符号8位,首先ARM存储数据是按4字节空间来存储的,所以8位char类型可以直接左移,但是,左移后直接转化为32的数据这个过程中会丢掉符号位,所以实验结果陀螺仪数据全是正数,这里算是个小坑,把int 换为 short int 结果就正常了。
最后用同样的方法处理地磁计,结果地磁计的数据还是全0,回去翻看数据手册,看到磁力计有四种模式,睡眠,挂起,掉电,工作模式,手册上写着“Soft reset always brings the device into sleep mode”,意思软复位会将传感器变为睡眠模式,所以需要再将传感器变为工作模式,之后数据终于正常了。至此,BMX055驱动编写完成。
另外BMX055还有其他一些功能,包括支持SPI接口,暂时用不到所以没有继续研究。