BMI160 Initial

Dependents:   MAX32630HSP3_IMU_HelloWorld MAX32630HSP3_IMU_HelloWorld MAX32630HSP3_Pitch_Charles Maxim_Squeeks

Files at this revision

API Documentation at this revision

Comitter:
j3
Date:
Tue Dec 20 00:10:04 2016 +0000
Parent:
7:9848196cb65e
Child:
9:ca6b5fecdd63
Commit message:
Added ACC get data fxs

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	Thu Dec 15 23:46:42 2016 +0000
+++ b/bmi160.cpp	Tue Dec 20 00:10:04 2016 +0000
@@ -84,3 +84,67 @@
     
     return rtnVal;
 }
+
+
+//*****************************************************************************
+int32_t BMI160::getSensorDataAndTime(uint8_t *data)
+{
+    return readBlock(DATA_0, SENSORTIME_2, data);
+}
+
+
+//*****************************************************************************
+int32_t BMI160::getAccAxis(SensorAxis axis, AxisData &data)
+{
+    uint8_t localData[2];
+    int32_t rtnVal;
+    
+    switch(axis)
+    {
+        case X_AXIS:
+            rtnVal = readBlock(DATA_14, DATA_15, localData);
+        break;
+        
+        case Y_AXIS:
+            rtnVal = readBlock(DATA_16, DATA_17, localData);
+        break;
+        
+        case Z_AXIS:
+            rtnVal = readBlock(DATA_18, DATA_19, localData);
+        break;
+        
+        default:
+            rtnVal = -1;
+        break;
+    }
+    
+    if(rtnVal == RTN_NO_ERROR)
+    {
+        data.raw = ((localData[1] << 8) | localData[0]);
+        data.scaled = (data.raw/16384.0F); //only 2G range right now
+    }
+    
+    return rtnVal;
+}
+    
+
+//*****************************************************************************    
+int32_t BMI160::getAccXYZ(SensorData &data)
+{
+    uint8_t localData[6];
+    int32_t rtnVal = readBlock(DATA_14, DATA_19, localData);
+    
+    if(rtnVal == RTN_NO_ERROR)
+    {
+        data.xAxis.raw = ((localData[1] << 8) | localData[0]);
+        data.yAxis.raw = ((localData[3] << 8) | localData[2]);
+        data.zAxis.raw = ((localData[5] << 8) | localData[4]);
+        
+        //only 2G range right now
+        data.xAxis.scaled = (data.xAxis.raw/16384.0F);
+        data.yAxis.scaled = (data.yAxis.raw/16384.0F);
+        data.zAxis.scaled = (data.zAxis.raw/16384.0F);
+    }
+    
+    return rtnVal;
+}
--- a/bmi160.h	Thu Dec 15 23:46:42 2016 +0000
+++ b/bmi160.h	Tue Dec 20 00:10:04 2016 +0000
@@ -64,6 +64,29 @@
         ACC      ///<g sensor
     };
     
+    ///Sensor Axis
+    enum SensorAxis
+    {
+        X_AXIS = 0,
+        Y_AXIS,
+        Z_AXIS   
+    };
+    
+    ///Structure for axis data
+    struct AxisData
+    {
+        int16_t raw;  ///<Axis raw data
+        float scaled; ///<Axis scaled data 
+    };
+    
+    ///Structure for holding sensor data
+    struct SensorData
+    {
+        AxisData xAxis; ///<Sensor X axis data
+        AxisData yAxis; ///<Sensor Y axis data
+        AxisData zAxis; ///<Sensor Z axis data
+    };
+    
     ///BMI160 registers
     enum Registers
     {
@@ -177,6 +200,7 @@
                          ///<softreset, NVM programming, etc.
     };
     
+    
     ///ERR_REG Bit Mask bit0
     static const uint8_t FATAL_ERR = 0x01;
     ///ERR_REG Bit Mask bits4:1
@@ -201,6 +225,60 @@
         PFD_USED_LPM         ///<Pre-filtered data are used in low power mode
     };
     
+    
+    ///ACC_CONF Bit Mask bits3:0
+    static const uint8_t ACC_ODR = 0x0F;
+    ///ACC_CONF Bit Mask bits6:4 
+    static const uint8_t ACC_BWP = 0x70;
+    ///ACC_CONF Bit Mask bit7
+    static const uint8_t ACC_US = 0x80;
+    
+    ///ACC_CONF bits3:0 codes
+    enum AccOutPutDataRate
+    {
+        ACC_ODR_1 = 1,  ///< 25/32Hz
+        ACC_ODR_2,      ///< 25/16Hz
+        ACC_ODR_3,      ///< 25/8Hz
+        ACC_ODR_4,      ///< 25/4Hz
+        ACC_ODR_5,      ///< 25/2Hz
+        ACC_ODR_6,      ///< 25Hz
+        ACC_ODR_7,      ///< 50Hz
+        ACC_ODR_8,      ///< 100Hz
+        ACC_ODR_9,      ///< 200Hz
+        ACC_ODR_10,     ///< 400Hz
+        ACC_ODR_11,     ///< 800Hz
+        ACC_ODR_12      ///< 1600Hz
+    };
+    
+    ///ACC_CONF bits6:4 codes
+    enum AccBandWidthParam
+    {
+        ACC_BWP_0 = 0, ///< Average 1 cycle
+        ACC_BWP_1,     ///< Average 2 cycles
+        ACC_BWP_2,     ///< Average 4 cycles, use this setting when acc_us = 0
+        ACC_BWP_3,     ///< Average 8 cycles
+        ACC_BWP_4,     ///< Average 16 cycles
+        ACC_BWP_5,     ///< Average 32 cycles
+        ACC_BWP_6,     ///< Average 64 cycles
+        ACC_BWP_7      ///< Average 128 cycles
+    };
+    
+    ///ACC_CONF bit7
+    enum AccUnderSampling
+    {
+        ACC_US_OFF = 0,
+        ACC_US_ON
+    };
+    
+    ///Accelerometer range values
+    enum AccRange
+    {
+        SENS_2G = 0,  ///<Accelerometer range +-2G
+        SENS_4G,      ///<Accelerometer range +-4G
+        SENS_8G,      ///<Accelerometer range +-8G
+        SENS_16G,     ///<Accelerometer range +-16G
+    };
+    
     ///BMI160 Power Modes
     enum PowerModes
     {
@@ -215,8 +293,8 @@
     {
         START_FOC = 0x03,        ///<Starts Fast Offset Calibrartion 
         ACC_SET_PMU_MODE = 0x10, ///<Sets acc power mode
-        GYR_SET_PMU_MODE = 0x14,        ///<Sets gyro power mode
-        MAG_SET_PMU_MODE = 0x18,        ///<Sets mag power mode
+        GYR_SET_PMU_MODE = 0x14, ///<Sets gyro power mode
+        MAG_SET_PMU_MODE = 0x18, ///<Sets mag power mode
         PROG_NVM = 0xA0,         ///<Writes NVM backed registers into NVM
         FIFO_FLUSH = 0xB0,       ///<Clears FIFO
         INT_RESET,               ///<Clears interrupt engine, INT_STATUS, and 
@@ -324,16 +402,53 @@
     int32_t getTemperature(float *temp);
     
     
-    ///@brief fx documentation template.\n
+    ///@brief Read data registers and sensortime.\n
+    ///
+    ///On Entry:
+    ///@param[in] data - buffer at least 23 bytes long
+    ///
+    ///On Exit:
+    ///@param[out] data - holds raw sensor data on success
+    ///
+    ///@returns 0 on success, non 0 on failure
+    int32_t getSensorDataAndTime(uint8_t *data);
+    
+    
+    ///@brief Get accelerometer axis as float.\n
     ///
     ///On Entry:
-    ///@param[in] none 
+    ///@param[in] axis - Sensor axis
+    ///@param[in] data - AxisData structure
+    ///
+    ///On Exit:
+    ///@param[out] data - Structure holds raw and scaled axis data
+    ///
+    ///@returns 0 on success, non 0 on failure
+    int32_t getAccAxis(SensorAxis axis, AxisData &data);
+    
+    
+    ///@brief Get accelerometer xyz axis as float.\n
+    ///
+    ///On Entry:
+    ///@param[in] data - SensorData structure
     ///
     ///On Exit:
-    ///@param[out] none
+    ///@param[out] data - Structure holds raw and scaled data for all three axis
     ///
-    ///@returns none
+    ///@returns 0 on success, non 0 on failure
+    int32_t getAccXYZ(SensorData &data);
+
+    
+protected:
 
+    struct AccConfig
+    {
+        AccRange range;
+        AccUnderSampling us;
+        AccBandWidthParam bwp;
+        AccOutPutDataRate odr;
+    };
+    
 };
 
 
@@ -410,3 +525,14 @@
 };
 
 #endif /* BMI160_H */
+
+
+///@brief fx documentation template.\n
+///
+///On Entry:
+///@param[in] none 
+///
+///On Exit:
+///@param[out] none
+///
+///@returns none