BMX055に4線式SPIモードで接続するためのライブラリです

Dependents:   SensorManager

Revision:
1:fed25406cc14
Parent:
0:c317a0f96763
--- a/BMX055.cpp	Mon Nov 28 10:48:59 2016 +0000
+++ b/BMX055.cpp	Tue Feb 13 04:13:42 2018 +0000
@@ -7,11 +7,11 @@
     gyrss=1;
     magss=1;
     wait(0.1);
-    bmx.frequency(1000000);
+    bmx.frequency(10000000);
     bmx.format(8,3);
-    init_acc(RANGE_2G,BW_1000);
-    init_gyr(RANGE_250,ODR_BW_2000_523);
-    init_mag();
+    init_acc(RANGE_2G,BW_250);
+    init_gyr(RANGE_250,ODR_BW_2000_230);
+    init_mag(0,0);
 
 
 
@@ -40,14 +40,14 @@
     bmx.write(data);
     accss=1;
 }
-bool BMX055::read_acc(float *acc){
+bool BMX055::read_acc(short *acc){
     char data[6];
     readnbyte_acc(0x02,data,6);
     unsigned short buf[3];
     for(int i=0;i<3;i++){
     buf[i]=(data[2*i]>>4)|(data[2*i+1]<<4);
-    if(buf[i]>0x800)acc[i]=(float)-1*((~buf[i]+1)&0xfff);
-    else acc[i]=(float)buf[i];
+    if(buf[i]>0x800)acc[i]=(short)-1*((~buf[i]+1)&0xfff);
+    else acc[i]=(short)buf[i];
     }
     return true;
 }
@@ -56,8 +56,9 @@
 }
 void BMX055::calib_acc(){
     //sensor offset
-    writebyte_acc(0x37,0b00100000);
+    writebyte_acc(0x37,0b01111110);
     
+    wait_ms(10);
     while(((readbyte_acc(0x36)&0b00010000)>>4)!=1);
     writebyte_acc(0x36,0b00100000);
     while(((readbyte_acc(0x36)&0b00010000)>>4)!=1);
@@ -99,13 +100,13 @@
     bmx.write(data);
     gyrss=1;
 }
-bool BMX055::read_gyr(float *gyr){
+bool BMX055::read_gyr(short *gyr){
     char data[6];
     readnbyte_gyr(0x02,data,6);
     short buf[3];
     for(int i=0;i<3;i++){
     buf[i]=data[2*i]|(data[2*i+1]<<8);
-    gyr[i]=(float)buf[i];
+    gyr[i]=buf[i];
     }
     
     return true;
@@ -143,39 +144,51 @@
     for(int i=0;i<num;i++)data[i]=bmx.write(0xFF);
     magss=1;
 }
-bool BMX055::read_mag(float *mag){
+bool BMX055::read_mag(short *mag){
     if((readbyte_mag(0x48)&0x01)==1){
     char data[8];
     readnbyte_mag(0x42,data,8);
     short buf[4];
     
     buf[0]=(data[0]>>3)|(data[1]<<5);
-    if(buf[0]>0x1000)mag[0]=(float)-1*((~buf[0]+1)&0xfff);
-    else mag[0]=(float)buf[0];
+    if(buf[0]>0x1000)mag[0]=-1*((~buf[0]+1)&0xfff);
+    else mag[0]=buf[0];
     
     buf[1]=(data[2]>>3)|(data[3]<<5);
-    if(buf[1]>0x1000)mag[1]=(float)-1*((~buf[1]+1)&0xfff);
-    else mag[1]=(float)buf[1];
+    if(buf[1]>0x1000)mag[1]=-1*((~buf[1]+1)&0xfff);
+    else mag[1]=buf[1];
     
     buf[2]=((short)data[4]>>1)|((short)data[5]<<7);
-    if(buf[2]>0x4000)mag[2]=(float)-1*((~buf[2]+1)&0x7fff);
-    else mag[2]=(float)buf[2];
+    if(buf[2]>0x4000)mag[2]=-1*((~buf[2]+1)&0x7fff);
+    else mag[2]=buf[2];
     
     buf[3]=((short)data[6]>>2)|((short)data[7]<<6);
-    if(buf[3]>0x2000)mag[3]=(float)-1*((~buf[3]+1)&0x3fff);
-    else mag[3]=(float)buf[3];
+    if(buf[3]>0x2000)mag[3]=-1*((~buf[3]+1)&0x3fff);
+    else mag[3]=buf[3];
+    
+    writebyte_mag(0x4c,0b00000010);//forced mode trigger
+    
     
     return true;
     
     }else return false;
 }
-void BMX055::init_mag(){
+void BMX055::init_mag(unsigned char REPXY,unsigned char REPZ){
     magss=1;
-    writebyte_mag(0x4b,0b10000000);//soft reset
-    writebyte_mag(0x4b,0b00000001);//power mode
+    writebyte_mag(0x4b,0b00000001);//go sleep mode
+    wait_ms(50);
+    writebyte_mag(0x4b,0b10000011);//soft reset&go sleep mode
     wait_ms(50);
-    //printf("id is %d\r\n",readbyte_mag(0x40));
-    writebyte_mag(0x4c,0b00111000);//data enable
+    
+    writebyte_mag(0x51,REPXY);//set REPXY
+    //1+REPXY
+    wait_ms(50);
+    
+    writebyte_mag(0x52,REPZ);//set REPZ
+    //1+REPZ 
+    wait_ms(50);
+    
+    writebyte_mag(0x4c,0b00000010);//forced modetrigger
 }