My implementation of Bosh BMI160 Only I2C is tested so far.
Dependents: test_BMI160 TFT_test_MAX32630FTHR
Revision 1:d56df81c389b, committed 2017-08-25
- Comitter:
- Rhyme
- Date:
- Fri Aug 25 08:23:39 2017 +0000
- Parent:
- 0:9aed6f5a35c0
- Child:
- 2:4cc456503e9f
- Commit message:
- Minimum data acquisition functions are in place.; Still needs some more work though.
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 Fri Aug 25 05:07:26 2017 +0000
+++ b/BMI160.cpp Fri Aug 25 08:23:39 2017 +0000
@@ -96,12 +96,21 @@
#define REG_CMD 0x7E
/* 0x00 CHIP_ID reset value = 0xD1 */
-/* 0x02 ERR_REG
+/* 0x02 ERR_REG Reports sensor error flags. Flags are cleared when read.
* bit[7] mag_drdy_err
- * bit[6] drop_cmd_err
+ * bit[6] drop_cmd_err Dropped command to Register
* bit[5] i2c_fail_err
- * bit[4:1] err_code
- * bit[0] fatal_err
+ * bit[4:1] err_code error code
+ * 0000: no error
+ * 0001: error
+ * 0010: error
+ * 0011: low-power mode and interrupt uses pre-filtered data
+ * 0100-0101: reserved
+ * 0110: ODRs of enabled sensors in headerless mode do not match
+ * 0111: pre-filtered data are used in low power mode
+ * 1000-1111: reserved
+ * The first reported error will be shown in the error code
+ * bit[0] fatal_err : Chip not operatable
*/
/* 0x03 PMU_STATUS
* bit[7:6] (reserved)
@@ -545,9 +554,146 @@
{
}
+void BMI160::setCMD(uint8_t cmd)
+{
+ uint8_t data[2] ;
+ data[0] = REG_CMD ;
+ data[1] = cmd ;
+ writeRegs(data, 2) ;
+}
+
+uint8_t BMI160::getStatus(void)
+{
+ uint8_t status ;
+ readRegs(REG_STATUS, &status, 1) ;
+ return(status) ;
+}
+
uint8_t BMI160::getChipID(void)
{
uint8_t data ;
readRegs(REG_CHIP_ID, &data, 1) ;
return( data ) ;
-}
\ No newline at end of file
+}
+
+uint8_t BMI160::getAccRange(void)
+{
+ uint8_t data = 0 ;
+ uint8_t range = 0 ;
+ readRegs(REG_ACC_RANGE, &data, 1) ;
+ switch(data & 0x0F) {
+ case 3: /* +/- 2g */
+ range = 2 ;
+ break ;
+ case 5: /* +/- 4g */
+ range = 4 ;
+ break ;
+ case 8: /* +/- 8g */
+ range = 8 ;
+ break ;
+ default:
+ printf("illegal Acc Range %X detected\n", data & 0x0F) ;
+ break ;
+ }
+ return(range) ;
+}
+
+int16_t BMI160::getGyrRange(void)
+{
+ uint8_t data = 0 ;
+ int16_t range = 0 ;
+ readRegs(REG_GYR_RANGE, &data, 1) ;
+ switch(data & 0x07) {
+ case 0:
+ range = 2000 ;
+ break ;
+ case 1:
+ range = 1000 ;
+ break ;
+ case 2:
+ range = 500 ;
+ break ;
+ case 3:
+ range = 250 ;
+ break ;
+ case 4:
+ range = 125 ;
+ break ;
+ default:
+ printf("illegal Gyr Range %d detected\n", data & 0x07) ;
+ break ;
+ }
+ return(range) ;
+}
+
+int16_t BMI160::getAccX(void)
+{
+ uint8_t data[2] ;
+ int16_t value = 0 ;
+ readRegs(REG_DATA_14, data, 2) ;
+ value = (data[1] << 8) | data[0] ;
+ return( value ) ;
+}
+
+int16_t BMI160::getAccY(void)
+{
+ uint8_t data[2] ;
+ int16_t value = 0 ;
+ readRegs(REG_DATA_16, data, 2) ;
+ value = (data[1] << 8) | data[0] ;
+ return( value ) ;
+}
+
+int16_t BMI160::getAccZ(void)
+{
+ uint8_t data[2] ;
+ int16_t value = 0 ;
+ readRegs(REG_DATA_18, data, 2) ;
+ value = (data[1] << 8) | data[0] ;
+ return( value ) ;
+}
+
+void BMI160::getAcc(int16_t *value)
+{
+ uint8_t data[6] ;
+ readRegs(REG_DATA_14, data, 6) ;
+ value[0] = (data[1] << 8) | data[0] ;
+ value[1] = (data[3] << 8) | data[2] ;
+ value[2] = (data[5] << 8) | data[4] ;
+}
+
+int16_t BMI160::getGyrX(void)
+{
+ uint8_t data[2] ;
+ int16_t value = 0 ;
+ readRegs(REG_DATA_8, data, 2) ;
+ value = (data[1] << 8) | data[0] ;
+ return( value ) ;
+}
+
+int16_t BMI160::getGyrY(void)
+{
+ uint8_t data[2] ;
+ int16_t value = 0 ;
+ readRegs(REG_DATA_10, data, 2) ;
+ value = (data[1] << 8) | data[0] ;
+ return( value ) ;
+}
+
+int16_t BMI160::getGyrZ(void)
+{
+ uint8_t data[2] ;
+ int16_t value = 0 ;
+ readRegs(REG_DATA_12, data, 2) ;
+ value = (data[1] << 8) | data[0] ;
+ return( value ) ;
+}
+
+void BMI160::getGyr(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
--- a/BMI160.h Fri Aug 25 05:07:26 2017 +0000 +++ b/BMI160.h Fri Aug 25 08:23:39 2017 +0000 @@ -26,7 +26,20 @@ */ ~BMI160() ; + void setCMD(uint8_t cmd) ; + uint8_t getStatus(void) ; 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) ; + private: SPI *m_spi ; @@ -43,4 +56,13 @@ void writeRegs(uint8_t *data, int len) ; } ; +#define ACC_PMU_SUSPEND 0x00 +#define ACC_PMU_NORMAL 0x01 +#define ACC_PMU_LOWPOWER 0x02 +#define GYR_PMU_SUSPEND 0x00 +#define GYR_PMU_NORMAL 0x01 +#define GYR_PMU_FASTSU 0x03 +#define MAG_PMU_SUSPEND 0x00 +#define MAG_PMU_NORMAL 0x01 +#define MAG_PMU_LOWPOWER 0x02 #endif /* _BMI160_H_ */ \ No newline at end of file