My implementation of Bosh BMI160 Only I2C is tested so far.
Dependents: test_BMI160 TFT_test_MAX32630FTHR
Revision 3:9d3079170b35, committed 2017-09-12
- Comitter:
- Rhyme
- Date:
- Tue Sep 12 00:34:16 2017 +0000
- Parent:
- 2:4cc456503e9f
- Child:
- 4:93f16677f730
- Commit message:
- started adding documents
Changed in this revision
| BMI160.cpp | Show annotated file Show diff for this revision Revisions of this file |
| BMI160.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/BMI160.cpp Mon Sep 11 23:53:22 2017 +0000
+++ b/BMI160.cpp Tue Sep 12 00:34:16 2017 +0000
@@ -95,6 +95,8 @@
#define REG_STEP_CONF_1 0x7B
#define REG_CMD 0x7E
+#define FLOAT_MAX_16BIT 32768.0
+
/* 0x00 CHIP_ID reset value = 0xD1 */
/* 0x02 ERR_REG Reports sensor error flags. Flags are cleared when read.
* bit[7] mag_drdy_err
@@ -552,8 +554,11 @@
void BMI160::init(void)
{
+ acc_range = getAccRange() ;
+ gyr_range = getGyrRange() ;
}
+
void BMI160::setCMD(uint8_t cmd)
{
uint8_t data[2] ;
@@ -595,6 +600,7 @@
printf("illegal Acc Range %X detected\n", data & 0x0F) ;
break ;
}
+ acc_range = range ;
return(range) ;
}
@@ -623,10 +629,11 @@
printf("illegal Gyr Range %d detected\n", data & 0x07) ;
break ;
}
+ gyr_range = range ;
return(range) ;
}
-int16_t BMI160::getAccX(void)
+int16_t BMI160::getAccRawX(void)
{
uint8_t data[2] ;
int16_t value = 0 ;
@@ -635,7 +642,7 @@
return( value ) ;
}
-int16_t BMI160::getAccY(void)
+int16_t BMI160::getAccRawY(void)
{
uint8_t data[2] ;
int16_t value = 0 ;
@@ -644,7 +651,7 @@
return( value ) ;
}
-int16_t BMI160::getAccZ(void)
+int16_t BMI160::getAccRawZ(void)
{
uint8_t data[2] ;
int16_t value = 0 ;
@@ -653,7 +660,7 @@
return( value ) ;
}
-void BMI160::getAcc(int16_t *value)
+void BMI160::getAccRaw(int16_t *value)
{
uint8_t data[6] ;
readRegs(REG_DATA_14, data, 6) ;
@@ -662,7 +669,7 @@
value[2] = (data[5] << 8) | data[4] ;
}
-int16_t BMI160::getGyrX(void)
+int16_t BMI160::getGyrRawX(void)
{
uint8_t data[2] ;
int16_t value = 0 ;
@@ -671,7 +678,7 @@
return( value ) ;
}
-int16_t BMI160::getGyrY(void)
+int16_t BMI160::getGyrRawY(void)
{
uint8_t data[2] ;
int16_t value = 0 ;
@@ -680,7 +687,7 @@
return( value ) ;
}
-int16_t BMI160::getGyrZ(void)
+int16_t BMI160::getGyrRawZ(void)
{
uint8_t data[2] ;
int16_t value = 0 ;
@@ -689,11 +696,71 @@
return( value ) ;
}
-void BMI160::getGyr(int16_t *value)
+void BMI160::getGyrRaw(int16_t *value)
{
uint8_t data[6] ;
readRegs(REG_DATA_8, data, 6) ;
value[0] = (data[1] << 8) | data[0] ;
value[1] = (data[3] << 8) | data[2] ;
value[2] = (data[5] << 8) | data[4] ;
-}
\ No newline at end of file
+}
+
+float BMI160::getAccX(void)
+{
+ float value ;
+ value = acc_range * getAccRawX() / FLOAT_MAX_16BIT ;
+ return(value) ;
+}
+
+float BMI160::getAccY(void)
+{
+ float value ;
+ value = acc_range * getAccRawY() / FLOAT_MAX_16BIT ;
+ return(value) ;
+}
+
+float BMI160::getAccZ(void)
+{
+ float value ;
+ value = acc_range * getAccRawZ() / FLOAT_MAX_16BIT ;
+ return(value) ;
+}
+
+void BMI160::getAcc(float *value)
+{
+ int16_t data[3] ;
+ getAccRaw(data) ;
+ value[0] = acc_range * data[0] / FLOAT_MAX_16BIT ;
+ value[1] = acc_range * data[1] / FLOAT_MAX_16BIT ;
+ value[2] = acc_range * data[2] / FLOAT_MAX_16BIT ;
+}
+
+float BMI160::getGyrX(void)
+{
+ float value ;
+ value = gyr_range * getGyrRawX() / FLOAT_MAX_16BIT ;
+ return(value) ;
+}
+
+float BMI160::getGyrY(void)
+{
+ float value ;
+ value = gyr_range * getGyrRawY() / FLOAT_MAX_16BIT ;
+ return(value) ;
+}
+
+float BMI160::getGyrZ(void)
+{
+ float value ;
+ value = gyr_range * getGyrRawZ() / FLOAT_MAX_16BIT ;
+ return(value) ;
+}
+
+void BMI160::getGyr(float *value)
+{
+ int16_t data[3] ;
+ getGyrRaw(data) ;
+ value[0] = gyr_range * data[0] / FLOAT_MAX_16BIT ;
+ value[1] = gyr_range * data[1] / FLOAT_MAX_16BIT ;
+ value[2] = gyr_range * data[2] / FLOAT_MAX_16BIT ;
+}
\ No newline at end of file
--- a/BMI160.h Mon Sep 11 23:53:22 2017 +0000 +++ b/BMI160.h Tue Sep 12 00:34:16 2017 +0000 @@ -29,27 +29,56 @@ * BMI160 destructor */ ~BMI160() ; - + +/** + * setCMD set value to the CMD register (0x7E) + * + * @param cmd uint8_t value to write + * @returns none + */ void setCMD(uint8_t cmd) ; + +/** + * getStatus get value of the STATUS register (0x1B) + * @param none + * @returns the value of the STATUS register + */ uint8_t getStatus(void) ; + +/** + * getChipID get value of the CHIP_ID register (0x10) + * @param none + * @returns the chip ID (supposed to be 0xD1) + */ uint8_t getChipID(void) ; uint8_t getAccRange(void) ; int16_t getGyrRange(void) ; - int16_t getAccX(void) ; - int16_t getAccY(void) ; - int16_t getAccZ(void) ; - int16_t getGyrX(void) ; - int16_t getGyrY(void) ; - int16_t getGyrZ(void) ; - void getAcc(int16_t *value) ; - void getGyr(int16_t *value) ; + + int16_t getAccRawX(void) ; + int16_t getAccRawY(void) ; + int16_t getAccRawZ(void) ; + int16_t getGyrRawX(void) ; + int16_t getGyrRawY(void) ; + int16_t getGyrRawZ(void) ; + void getAccRaw(int16_t *value) ; + void getGyrRaw(int16_t *value) ; - + float getAccX(void) ; + float getAccY(void) ; + float getAccZ(void) ; + float getGyrX(void) ; + float getGyrY(void) ; + float getGyrZ(void) ; + void getAcc(float *value) ; + void getGyr(float *value) ; + private: SPI *m_spi ; I2C *m_i2c ; DigitalOut *m_cs ; int m_addr ; + int acc_range ; + int gyr_range ; void init(void) ; void i2c_readRegs(int addr, uint8_t *data, int len) ;