h3 imported to make Bob work

Dependents:   mDot_Bob

Revision:
0:a9de25fd7c41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/H3LIS331DL.h	Fri Oct 23 18:26:28 2015 +0000
@@ -0,0 +1,349 @@
+/*
+ * H3LIS331DL.h
+ * A library for 3-Axis Digital Accelerometer(±400g)
+ *
+ * Copyright (c) 2014 seeed technology inc.
+ * Website    : www.seeed.cc
+ * Author     : lawliet zou
+ * Create Time: April 2014
+ * Change Log :
+ *
+ * The MIT License (MIT)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "mbed.h"
+
+#ifndef H3LIS331DL_H
+#define H3LIS331DL_H
+
+#define MEMS_SET                        0x01
+#define MEMS_RESET                      0x00
+
+#define H3LIS331DL_MEMS_I2C_ADDRESS     0x18//0x32
+
+//Register and define
+#define H3LIS331DL_WHO_AM_I             0x0F   // device identification register
+
+// CONTROL REGISTER 1
+#define H3LIS331DL_CTRL_REG1            0x20
+#define H3LIS331DL_PM                   BIT(5) //PowerMode selection: 000 - power down / 001 - normal mode / other - low power
+#define H3LIS331DL_DR                   BIT(3) //output data rate: 00 - 50hz / 01 - 100hz / 10 - 400hz / 11 - 1000hz
+#define H3LIS331DL_ZEN                  BIT(2) //Z-axis enable: 0 - disable / 1 - enable
+#define H3LIS331DL_YEN                  BIT(1) //Y-axis enable: 0 - disable / 1 - enable
+#define H3LIS331DL_XEN                  BIT(0) //Y-axis enable: 0 - disable / 1 - enable
+
+//CONTROL REGISTER 2
+#define H3LIS331DL_CTRL_REG2            0x21
+#define H3LIS331DL_BOOT                 BIT(7) //reboot memory content, default is 0
+#define H3LIS331DL_HPM                  BIT(5) //High-pass-filter mode selection, default is 00
+#define H3LIS331DL_FDS                  BIT(4) //Filter data selection, default is 0
+#define H3LIS331DL_HPEN2                BIT(3) //High-pass filter enabled for interrupt 2 source, default is 0
+#define H3LIS331DL_HPEN1                BIT(2) //High-pass filter enabled for interrupt 1 source, default is 0
+#define H3LIS331DL_HPCF                 BIT(0) //High-pass filter cutoff frequency configuration, default is 00
+
+//CONTROL REGISTER 3
+#define H3LIS331DL_CTRL_REG3            0x22
+#define H3LIS331DL_IHL                  BIT(7) //Interrupt active high,low. default is 0
+#define H3LIS331DL_PP_OD                BIT(6) //Push-pull/open drain selection on interrupt pad. default is 0
+#define H3LIS331DL_LIR2                 BIT(5) //Latch interrupt request on INT2_SRC register, with INT2_SRC register cleared by read INT2_SRC itself. default is 0
+#define H3LIS331DL_I2_CFG               BIT(3) //Data signal on INT2 pad control bits, default is 00
+#define H3LIS331DL_LIR1                 BIT(2) //Latch interrupt request on the INT1_SRC register, with the INT1_SRC register cleared by reading the INT1_SRC register.
+#define H3LIS331DL_I1_CFG               BIT(0) //Data signal on INT1 pad control bits, default is 00
+
+//CONTROL REGISTER 4
+#define H3LIS331DL_CTRL_REG4            0x23
+#define H3LIS331DL_BDU                  BIT(7) //Block data update, default is 0
+#define H3LIS331DL_BLE                  BIT(6) //Big/little endian data selection, default is 0
+#define H3LIS331DL_FS                   BIT(4) //Full scale selection, default is 00(00:100g;01:200g;11:400g)
+#define H3LIS331DL_ST_SIGN              BIT(3) //
+#define H3LIS331DL_ST                   BIT(1) //
+#define H3LIS331DL_SIM                  BIT(0) // SPI serial interface mode selection, default is 0
+
+//CONTROL REGISTER 5
+#define H3LIS331DL_CTRL_REG5            0x24
+#define H3LIS331DL_TURN_ON              BIT(0) // Turn-on mode selection selection for sleep to wake function. default is 00
+
+#define H3LIS331DL_HP_FILTER_RESET      0x25   //
+
+//REFERENCE/DATA_CAPTURE
+#define H3LIS331DL_REFERENCE_REG        0x26   //
+#define H3LIS331DL_REF                  BIT(0) //
+
+//STATUS_REG_AXIES
+#define H3LIS331DL_STATUS_REG           0x27   //
+
+//OUTPUT REGISTER
+#define H3LIS331DL_OUT_X_L              0x28   //x-axis acceleration data
+#define H3LIS331DL_OUT_X_H              0x29
+#define H3LIS331DL_OUT_Y_L              0x2A   //y-axis acceleration data
+#define H3LIS331DL_OUT_Y_H              0x2B
+#define H3LIS331DL_OUT_Z_L              0x2C   //z-axis acceleration data
+#define H3LIS331DL_OUT_Z_H              0x2D
+
+
+//INTERRUPT 1 CONFIGURATION
+#define H3LIS331DL_INT1_CFG             0x30
+
+//INTERRUPT 2 CONFIGURATION
+#define H3LIS331DL_INT2_CFG             0x34
+#define H3LIS331DL_ANDOR                BIT(7)
+#define H3LIS331DL_INT_6D               BIT(6)
+
+//INT REGISTERS
+#define H3LIS331DL_INT1_THS             0x32
+#define H3LIS331DL_INT1_DURATION        0x33
+#define H3LIS331DL_INT2_THS             0x36
+#define H3LIS331DL_INT2_DURATION        0x37
+
+//INTERRUPT 1 SOURCE REGISTER
+#define H3LIS331DL_INT1_SRC             0x31
+#define H3LIS331DL_INT2_SRC             0x35
+
+//INT_CFG  bit mask
+#define H3LIS331DL_INT_AND              0x80
+#define H3LIS331DL_INT_OR               0x00
+#define H3LIS331DL_INT_ZHIE_ENABLE      0x20
+#define H3LIS331DL_INT_ZHIE_DISABLE     0x00
+#define H3LIS331DL_INT_ZLIE_ENABLE      0x10
+#define H3LIS331DL_INT_ZLIE_DISABLE     0x00
+#define H3LIS331DL_INT_YHIE_ENABLE      0x08
+#define H3LIS331DL_INT_YHIE_DISABLE     0x00
+#define H3LIS331DL_INT_YLIE_ENABLE      0x04
+#define H3LIS331DL_INT_YLIE_DISABLE     0x00
+#define H3LIS331DL_INT_XHIE_ENABLE      0x02
+#define H3LIS331DL_INT_XHIE_DISABLE     0x00
+#define H3LIS331DL_INT_XLIE_ENABLE      0x01
+#define H3LIS331DL_INT_XLIE_DISABLE     0x00
+
+//INT_SRC  bit mask
+#define H3LIS331DL_INT_SRC_IA           0x40
+#define H3LIS331DL_INT_SRC_ZH           0x20
+#define H3LIS331DL_INT_SRC_ZL           0x10
+#define H3LIS331DL_INT_SRC_YH           0x08
+#define H3LIS331DL_INT_SRC_YL           0x04
+#define H3LIS331DL_INT_SRC_XH           0x02
+#define H3LIS331DL_INT_SRC_XL           0x01
+
+//STATUS REGISTER bit mask
+#define H3LIS331DL_STATUS_REG_ZYXOR     0x80    // 1:new data set has over written the previous one
+                                                // 0:no overrun has occurred (default)
+#define H3LIS331DL_STATUS_REG_ZOR       0x40    // 0:no overrun has occurred (default)
+                                                // 1:new Z-axis data has over written the previous one
+#define H3LIS331DL_STATUS_REG_YOR       0x20    // 0:no overrun has occurred (default)
+                                                // 1:new Y-axis data has over written the previous one
+#define H3LIS331DL_STATUS_REG_XOR       0x10    // 0:no overrun has occurred (default)
+                                                // 1:new X-axis data has over written the previous one
+#define H3LIS331DL_STATUS_REG_ZYXDA     0x08    // 0:a new set of data is not yet avvious one
+                                                // 1:a new set of data is available
+#define H3LIS331DL_STATUS_REG_ZDA       0x04    // 0:a new data for the Z-Axis is not availvious one
+                                                // 1:a new data for the Z-Axis is available
+#define H3LIS331DL_STATUS_REG_YDA       0x02    // 0:a new data for the Y-Axis is not available
+                                                // 1:a new data for the Y-Axis is available
+#define H3LIS331DL_STATUS_REG_XDA       0x01    // 0:a new data for the X-Axis is not available
+                                                // 1:a new data for the X-Axis is available
+#define H3LIS331DL_DATAREADY_BIT        H3LIS331DL_STATUS_REG_ZYXDA
+
+#define ValBit(VAR,Place)         (VAR & (1<<Place))
+#define BIT(x) ( (x) )
+
+typedef uint8_t H3LIS331DL_Axis_t;
+typedef uint8_t H3LIS331DL_IntConf_t;
+
+//define structure
+typedef enum {
+    MEMS_SUCCESS  = 0x01,
+    MEMS_ERROR  = 0x00
+} status_t;
+
+typedef enum {
+    MEMS_ENABLE   = 0x01,
+    MEMS_DISABLE    = 0x00
+} State_t;
+
+typedef struct {
+    int16_t AXIS_X;
+    int16_t AXIS_Y;
+    int16_t AXIS_Z;
+} AxesRaw_t;
+
+typedef enum {
+    H3LIS331DL_ODR_50Hz    = 0x00,
+    H3LIS331DL_ODR_100Hz   = 0x01,
+    H3LIS331DL_ODR_400Hz   = 0x02,
+    H3LIS331DL_ODR_1000Hz  = 0x03
+} H3LIS331DL_ODR_t;
+
+typedef enum {
+    H3LIS331DL_CONTINUOUS_MODE = 0x00,
+    H3LIS331DL_SINGLE_MODE     = 0x01,
+    H3LIS331DL_SLEEP_MODE      = 0x02
+} H3LIS331DL_Mode_M_t;
+
+typedef enum {
+    H3LIS331DL_POWER_DOWN   = 0x00,
+    H3LIS331DL_NORMAL       = 0x01,
+    H3LIS331DL_LOW_POWER_05 = 0x02,
+    H3LIS331DL_LOW_POWER_1  = 0x03,
+    H3LIS331DL_LOW_POWER_2  = 0x04,
+    H3LIS331DL_LOW_POWER_5  = 0x05,
+    H3LIS331DL_LOW_POWER_10 = 0x06,
+} H3LIS331DL_Mode_t;
+
+typedef enum {
+    H3LIS331DL_HPM_NORMAL_MODE_RES = 0x00,
+    H3LIS331DL_HPM_REF_SIGNAL      = 0x01,
+    H3LIS331DL_HPM_NORMAL_MODE     = 0x02,
+} H3LIS331DL_HPFMode_t;
+
+typedef enum {
+    H3LIS331DL_HPFCF_0 = 0x00,
+    H3LIS331DL_HPFCF_1 = 0x01,
+    H3LIS331DL_HPFCF_2 = 0x02,
+    H3LIS331DL_HPFCF_3 = 0x03,
+} H3LIS331DL_HPFCutOffFreq_t;
+
+typedef enum {
+    H3LIS331DL_INT_SOURCE      = 0x00,
+    H3LIS331DL_INT_1OR2_SOURCE = 0x01,
+    H3LIS331DL_DATA_READY      = 0x02,
+    H3LIS331DL_BOOT_RUNNING    = 0x03
+} H3LIS331DL_INT_Conf_t;
+
+typedef enum {
+    H3LIS331DL_SLEEP_TO_WAKE_DIS    = 0x00,
+    H3LIS331DL_SLEEP_TO_WAKE_ENA    = 0x03,
+} H3LIS331DL_Sleep_To_Wake_Conf_t;
+
+typedef enum {
+    H3LIS331DL_FULLSCALE_2    = 0x00,
+    H3LIS331DL_FULLSCALE_4    = 0x01,
+    H3LIS331DL_FULLSCALE_8    = 0x03,
+} H3LIS331DL_Fullscale_t;
+
+typedef enum {
+    H3LIS331DL_BLE_LSB        = 0x00,
+    H3LIS331DL_BLE_MSB        = 0x01
+} H3LIS331DL_Endianess_t;
+
+typedef enum {
+    H3LIS331DL_SPI_4_WIRE = 0x00,
+    H3LIS331DL_SPI_3_WIRE = 0x01
+} H3LIS331DL_SPIMode_t;
+
+typedef enum {
+    H3LIS331DL_X_ENABLE     = 0x01,
+    H3LIS331DL_X_DISABLE    = 0x00,
+    H3LIS331DL_Y_ENABLE     = 0x02,
+    H3LIS331DL_Y_DISABLE    = 0x00,
+    H3LIS331DL_Z_ENABLE     = 0x04,
+    H3LIS331DL_Z_DISABLE    = 0x00
+} H3LIS331DL_AXISenable_t;
+
+typedef enum {
+    H3LIS331DL_UP_SX  = 0x44,
+    H3LIS331DL_UP_DX  = 0x42,
+    H3LIS331DL_DW_SX  = 0x41,
+    H3LIS331DL_DW_DX  = 0x48,
+    H3LIS331DL_TOP    = 0x60,
+    H3LIS331DL_BOTTOM = 0x50
+} H3LIS331DL_POSITION_6D_t;
+
+typedef enum {
+    H3LIS331DL_INT_MODE_OR            = 0x00,
+    H3LIS331DL_INT_MODE_6D_MOVEMENT   = 0x01,
+    H3LIS331DL_INT_MODE_AND           = 0x02,
+    H3LIS331DL_INT_MODE_6D_POSITION   = 0x03
+} H3LIS331DL_IntMode_t;
+
+
+class H3LIS331DL
+{
+public:
+    H3LIS331DL(PinName sda, PinName scl){
+        i2c = new mbed::I2C(sda, scl);
+        i2c->frequency(100000);
+        _adjVal[0] = _adjVal[1] = _adjVal[2] = 0;
+    };
+    void init(H3LIS331DL_ODR_t  odr = H3LIS331DL_ODR_100Hz,
+            H3LIS331DL_Mode_t mode = H3LIS331DL_NORMAL,H3LIS331DL_Fullscale_t fullScale = H3LIS331DL_FULLSCALE_2);
+    void importPara(int16_t val_x, int16_t val_y, int16_t val_z);
+    void readXYZ(int16_t* x, int16_t* y, int16_t* z);
+    void getAcceleration(float* xyz);
+    //Sensor Configuration Functions
+    status_t getWHO_AM_I(uint8_t * val);
+    status_t setODR(H3LIS331DL_ODR_t dr);
+    status_t setMode(H3LIS331DL_Mode_t pm);
+    status_t setAxis(H3LIS331DL_Axis_t axis);
+    status_t setFullScale(H3LIS331DL_Fullscale_t fs);
+    status_t setBDU(State_t bdu);
+    status_t setBLE(H3LIS331DL_Endianess_t ble);
+    status_t setSelfTest(State_t st);
+    status_t setSelfTestSign(State_t st_sign);
+    status_t turnONEnable(H3LIS331DL_Sleep_To_Wake_Conf_t stw);
+    status_t setBOOT(State_t boot);
+    status_t setFDS(State_t fds);
+    status_t setSPI34Wire(H3LIS331DL_SPIMode_t sim);
+
+    //Filtering Functions
+    status_t setHPFMode(H3LIS331DL_HPFMode_t hpm);
+    status_t setHPFCutOFF(H3LIS331DL_HPFCutOffFreq_t hpf);
+    status_t setFilterDataSel(State_t state);
+    status_t setReference(int8_t ref);
+
+    //Interrupt Functions
+    status_t setIntHighLow(State_t hil);
+    status_t setIntPPOD(State_t pp_od);
+    status_t setInt1DataSign(H3LIS331DL_INT_Conf_t i_cfg);
+    status_t setInt2DataSign(H3LIS331DL_INT_Conf_t i_cfg);
+    status_t setInt1HPEnable(State_t stat);
+    status_t setInt2HPEnable(State_t stat);
+    status_t int1LatchEnable(State_t latch);
+    status_t int2LatchEnable(State_t latch);
+    status_t resetInt1Latch(void);
+    status_t resetInt2Latch(void);
+    status_t setInt1Configuration(H3LIS331DL_IntConf_t ic);
+    status_t setInt2Configuration(H3LIS331DL_IntConf_t ic);
+    status_t setInt1Threshold(uint8_t ths);
+    status_t setInt2Threshold(uint8_t ths);
+    status_t setInt1Duration(uint8_t id);
+    status_t setInt2Duration(uint8_t id);
+    status_t setInt1Mode(H3LIS331DL_IntMode_t int_mode);
+    status_t setInt2Mode(H3LIS331DL_IntMode_t int_mode);
+    status_t getInt1Src(uint8_t* val);
+    status_t getInt2Src(uint8_t* val);
+    status_t getInt1SrcBit(uint8_t statusBIT, uint8_t* val);
+    status_t getInt2SrcBit(uint8_t statusBIT, uint8_t* val);
+
+    //Other Reading Functions
+    status_t getStatusReg(uint8_t* val);
+    status_t getStatusBit(uint8_t statusBIT, uint8_t* val);
+    status_t getAccAxesRaw(AxesRaw_t* buff);
+    status_t get6DPositionInt1(uint8_t* val);
+    status_t get6DPositionInt2(uint8_t* val);
+
+private:
+    I2C * i2c;
+    uint8_t readReg(uint8_t deviceAddr, uint8_t Reg, uint8_t* Data);
+    uint8_t writeReg(uint8_t deviceAddress, uint8_t WriteAddr, uint8_t Data);
+    int16_t _adjVal[3];
+};
+
+#endif /*__H3LIS331DL_H */