From 293f9d708b5463fd84a5b724c00ce30b63e8e0b4 Mon Sep 17 00:00:00 2001 From: Rocco Marco Guglielmi Date: Wed, 27 Jul 2016 20:55:04 +0000 Subject: UpdatedEX: LIS302DL driver updated to v1.0.0 git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9724 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/ex/ST/lis302dl.h | 196 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 154 insertions(+), 42 deletions(-) (limited to 'os/ex/ST/lis302dl.h') diff --git a/os/ex/ST/lis302dl.h b/os/ex/ST/lis302dl.h index e4c175029..67815ba97 100644 --- a/os/ex/ST/lis302dl.h +++ b/os/ex/ST/lis302dl.h @@ -35,10 +35,130 @@ /*===========================================================================*/ /** - * @brief LIS302DL number of axes. + * @name Version identification + * @{ + */ +/** + * @brief LIS302DL driver version string. + */ +#define EX_LIS302DL_VERSION "1.0.0" + +/** + * @brief LIS302DL driver version major number. + */ +#define EX_LIS302DL_MAJOR 1 + +/** + * @brief LIS302DL driver version minor number. */ -#define LIS302DL_NUMBER_OF_AXES ((size_t) 3U) +#define EX_LIS302DL_MINOR 0 +/** + * @brief LIS302DL driver version patch number. + */ +#define EX_LIS302DL_PATCH 0 +/** @} */ + +/** + * @brief LIS302DL characteristics. + * + * @{ + */ +#define LIS302DL_NUMBER_OF_AXES 3U + +#define LIS302DL_2G 2.0f +#define LIS302DL_8G 8.0f + +#define LIS302DL_SENS_2G 18.0f +#define LIS302DL_SENS_8G 72.0f +/** @} */ + +/** + * @name LIS302DL communication interfaces related bit masks + * @{ + */ +#define LIS302DL_DI_MASK 0xFF /**< Data In mask */ +#define LIS302DL_DI(n) (1 << n) /**< Data In bit n */ +#define LIS302DL_AD_MASK 0x3F /**< Address Data mask */ +#define LIS302DL_AD(n) (1 << n) /**< Address Data bit n */ +#define LIS302DL_MS (1 << 6) /**< Multiple read write */ +#define LIS302DL_RW (1 << 7) /**< Read Write selector */ +/** @} */ + +/** + * @name LIS302DL register addresses + * @{ + */ +#define LIS302DL_AD_WHO_AM_I 0x0F +#define LIS302DL_AD_CTRL_REG1 0x20 +#define LIS302DL_AD_CTRL_REG2 0x21 +#define LIS302DL_AD_CTRL_REG3 0x22 +#define LIS302DL_AD_HP_FILER_RESET 0x23 +#define LIS302DL_AD_STATUS_REG 0x27 +#define LIS302DL_AD_OUT_X 0x29 +#define LIS302DL_AD_OUT_Y 0x2B +#define LIS302DL_AD_OUT_Z 0x2D +#define LIS302DL_AD_FF_WU_CFG_1 0x30 +#define LIS302DL_AD_FF_WU_SRC_1 0x31 +#define LIS302DL_AD_FF_WU_THS_1 0x32 +#define LIS302DL_AD_FF_WU_DURATION_1 0x33 +#define LIS302DL_AD_FF_WU_CFG_2 0x34 +#define LIS302DL_AD_FF_WU_SRC_2 0x35 +#define LIS302DL_AD_FF_WU_THS_2 0x36 +#define LIS302DL_AD_FF_WU_DURATION_2 0x37 +#define LIS302DL_AD_CLICK_CFG 0x38 +#define LIS302DL_AD_CLICK_SRC 0x39 +#define LIS302DL_AD_CLICK_THSY_X 0x3B +#define LIS302DL_AD_CLICK_THSZ 0x3C +#define LIS302DL_AD_CLICK_TIME_LIMIT 0x3D +#define LIS302DL_AD_CLICK_LATENCY 0x3E +#define LIS302DL_AD_CLICK_WINDOW 0x3F +/** @} */ + +/** + * @name LIS302DL_CTRL_REG1 register bits definitions + * @{ + */ +#define LIS302DL_CTRL_REG1_MASK 0xFF /**< LIS302DL_CTRL_REG1 mask */ +#define LIS302DL_CTRL_REG1_FS_MASK 0x20 /**< Full scale field mask */ +#define LIS302DL_CTRL_REG1_XEN (1 << 0) /**< X axis enable */ +#define LIS302DL_CTRL_REG1_YEN (1 << 1) /**< Y axis enable */ +#define LIS302DL_CTRL_REG1_ZEN (1 << 2) /**< Z axis enable */ +#define LIS302DL_CTRL_REG1_STM (1 << 3) /**< Self test P-M */ +#define LIS302DL_CTRL_REG1_STP (1 << 4) /**< Self test P-M */ +#define LIS302DL_CTRL_REG1_FS (1 << 5) /**< Full scale */ +#define LIS302DL_CTRL_REG1_PD (1 << 6) /**< Power-down mode enable */ +#define LIS302DL_CTRL_REG1_DR (1 << 7) /**< Output data rate */ +/** @} */ + +/** + * @name LIS302DL_CTRL_REG2 register bits definitions + * @{ + */ +#define LIS302DL_CTRL_REG2_MASK 0xDF /**< LIS302DL_CTRL_REG2 mask */ +#define LIS302DL_CTRL_REG2_HPCF1 (1 << 0) /**< HP filter cutoff bit 0 */ +#define LIS302DL_CTRL_REG2_HPCF2 (1 << 1) /**< HP filter cutoff bit 1 */ +#define LIS302DL_CTRL_REG2_HPFFWU1 (1 << 2) /**< HP filter cutoff bit 2 */ +#define LIS302DL_CTRL_REG2_HPFFWU2 (1 << 3) /**< HP filter cutoff bit 3 */ +#define LIS302DL_CTRL_REG2_FDS (1 << 4) /**< HP filter mode bit 0 */ +#define LIS302DL_CTRL_REG2_BOOT (1 << 6) /**< HP filter mode bit 1 */ +#define LIS302DL_CTRL_REG2_SIM (1 << 7) /**< HP filter mode bit 1 */ +/** @} */ + +/** + * @name LIS302DL_CTRL_REG3 register bits definitions + * @{ + */ +#define LIS302DL_CTRL_REG3_MASK 0xFF /**< LIS302DL_CTRL_REG3 mask */ +#define LIS302DL_CTRL_REG3_I1CFG0 (1 << 0) /**< Interrupt 1 config bit 0 */ +#define LIS302DL_CTRL_REG3_I1CFG1 (1 << 1) /**< Interrupt 1 config bit 1 */ +#define LIS302DL_CTRL_REG3_I1CFG2 (1 << 2) /**< Interrupt 1 config bit 2 */ +#define LIS302DL_CTRL_REG3_I2CFG0 (1 << 3) /**< Interrupt 2 config bit 0 */ +#define LIS302DL_CTRL_REG3_I2CFG1 (1 << 4) /**< Interrupt 2 config bit 1 */ +#define LIS302DL_CTRL_REG3_I2CFG2 (1 << 5) /**< Interrupt 2 config bit 2 */ +#define LIS302DL_CTRL_REG3_PP_OD (1 << 6) /**< Push-pull open-drain */ +#define LIS302DL_CTRL_REG3_IHL (1 << 7) /**< Int active high low */ +/** @} */ /*===========================================================================*/ /* Driver pre-compile time settings. */ /*===========================================================================*/ @@ -65,6 +185,15 @@ #define LIS302DL_USE_I2C FALSE #endif +/** + * @brief LIS302DL advanced configurations switch. + * @details If set to @p TRUE more configurations are available. + * @note The default is @p FALSE. + */ +#if !defined(LIS302DL_USE_ADVANCED) || defined(__DOXYGEN__) +#define LIS302DL_USE_ADVANCED FALSE +#endif + /** * @brief LIS302DL shared SPI switch. * @details If set to @p TRUE the device acquires SPI bus ownership @@ -108,8 +237,8 @@ * @brief LIS302DL full scale. */ typedef enum { - LIS302DL_FS_2G = 0x00, /**< Full scale ±2g. */ - LIS302DL_FS_8G = 0x20 /**< Full scale ±8g. */ + LIS302DL_FS_2G = 0x00, /**< Full scale ±2g. */ + LIS302DL_FS_8G = 0x20 /**< Full scale ±8g. */ }lis302dl_fs_t; /** @@ -131,29 +260,6 @@ typedef enum { LIS302DL_HP_3 = 0x13 /**< HP cutoff 0.25Hz or 1Hz */ }lis302dl_hp_t; -/** - * @brief LIS302DL axes enabling. - */ -typedef enum { - LIS302DL_AE_DISABLED = 0x00, /**< All axes disabled. */ - LIS302DL_AE_X = 0x01, /**< Only X-axis enabled. */ - LIS302DL_AE_Y = 0x02, /**< Only Y-axis enabled. */ - LIS302DL_AE_XY = 0x03, /**< X and Y axes enabled. */ - LIS302DL_AE_Z = 0x04, /**< Only Z-axis enabled. */ - LIS302DL_AE_XZ = 0x05, /**< X and Z axes enabled. */ - LIS302DL_AE_YZ = 0x06, /**< Y and Z axes enabled. */ - LIS302DL_AE_XYZ = 0x07 /**< All axes enabled. */ -}lis302dl_ae_t; - -/** - * @brief LIS302DL accelerometer subsystem unit. - */ -typedef enum { - LIS302DL_ACC_UNIT_G = 0x00, /**< Cooked data in g. */ - LIS302DL_ACC_UNIT_MG = 0x01, /**< Cooked data in mg. */ - LIS302DL_ACC_UNIT_SI = 0x02, /**< Cooked data in m/s^2. */ -} lis302dl_acc_unit_t; - /** * @brief Driver state machine possible states. */ @@ -188,6 +294,14 @@ typedef struct { */ const I2CConfig *i2ccfg; #endif /* LIS302DL_USE_I2C */ + /** + * @brief LIS302DL initial sensitivity. + */ + float sensitivity[LIS302DL_NUMBER_OF_AXES]; + /** + * @brief LIS302DL initial bias. + */ + float bias[LIS302DL_NUMBER_OF_AXES]; /** * @brief LIS302DL full scale value. */ @@ -196,18 +310,12 @@ typedef struct { * @brief LIS302DL output data rate selection. */ lis302dl_odr_t outputdatarate; +#if LIS302DL_USE_ADVANCED || defined(__DOXYGEN__) /** * @brief LIS302DL high pass filtering */ lis302dl_hp_t highpass; - /** - * @brief LIS302DL axes enabling. - */ - lis302dl_ae_t axesenabling; - /** - * @brief LIS302DL unit for cooked data. - */ - lis302dl_acc_unit_t unit; +#endif } LIS302DLConfig; /** @@ -219,7 +327,9 @@ typedef struct LIS302DLDriver LIS302DLDriver; * @brief @p LIS302DL specific methods. */ #define _lis302dl_methods \ - _base_accelerometer_methods + _base_accelerometer_methods \ + /* Change full scale value of LIS302DL .*/ \ + msg_t (*set_full_scale)(void *instance, lis302dl_fs_t fs); /** @@ -243,7 +353,9 @@ struct LIS302DLVMT { /* Current sensitivity.*/ \ float sensitivity[LIS302DL_NUMBER_OF_AXES]; \ /* Bias data.*/ \ - int32_t bias[LIS302DL_NUMBER_OF_AXES]; + int32_t bias[LIS302DL_NUMBER_OF_AXES]; \ + /* Current full scale value.*/ \ + float fullscale; /** * @extends BaseAccelerometer. @@ -268,19 +380,19 @@ struct LIS302DLDriver { /*===========================================================================*/ /** - * @brief Get current MEMS temperature. - * @detail This information is very useful especially for high accuracy IMU. + * @brief Change accelerometer fullscale value. * * @param[in] ip pointer to a @p BaseAccelerometer class. - * @param[out] temp the MEMS temperature as single precision floating. + * @param[in] fs the new full scale value. * * @return The operation status. * @retval MSG_OK if the function succeeded. * @retval MSG_RESET if one or more errors occurred. * @api */ -#define accelerometerGetTemp(ip, tpp) \ - (ip)->vmt_lis302dl->get_temperature(ip, tpp) +#define accelerometerSetFullScale(ip, fs) \ + (ip)->vmt_lis302dl->set_full_scale(ip, fs) + /*===========================================================================*/ /* External declarations. */ -- cgit v1.2.3