Contains the BSP driver for the B-L475E-IOT01 board.

Dependents:   mbed-os-example-ble-Thermometer DISCO_L475VG_IOT01-Telegram-BOT DISCO_L475VG_IOT01-sche_cheveux DISCO_L475VG_IOT01-QSPI_FLASH_FILE_SYSTEM ... more

https://os.mbed.com/platforms/ST-Discovery-L475E-IOT01A/

Committer:
bcostm
Date:
Fri Apr 14 13:09:54 2017 +0200
Revision:
4:137bb367ba50
Child:
7:bfe8272ced90
Add remaining Components files

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bcostm 4:137bb367ba50 1 /**
bcostm 4:137bb367ba50 2 ******************************************************************************
bcostm 4:137bb367ba50 3 * @file lsm6dsl.c
bcostm 4:137bb367ba50 4 * @author MCD Application Team
bcostm 4:137bb367ba50 5 * @version V1.0.0
bcostm 4:137bb367ba50 6 * @date 14-February-2017
bcostm 4:137bb367ba50 7 * @brief This file provides a set of functions needed to manage the LSM6DSL
bcostm 4:137bb367ba50 8 * accelero and gyro devices
bcostm 4:137bb367ba50 9 ******************************************************************************
bcostm 4:137bb367ba50 10 * @attention
bcostm 4:137bb367ba50 11 *
bcostm 4:137bb367ba50 12 * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
bcostm 4:137bb367ba50 13 *
bcostm 4:137bb367ba50 14 * Redistribution and use in source and binary forms, with or without modification,
bcostm 4:137bb367ba50 15 * are permitted provided that the following conditions are met:
bcostm 4:137bb367ba50 16 * 1. Redistributions of source code must retain the above copyright notice,
bcostm 4:137bb367ba50 17 * this list of conditions and the following disclaimer.
bcostm 4:137bb367ba50 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
bcostm 4:137bb367ba50 19 * this list of conditions and the following disclaimer in the documentation
bcostm 4:137bb367ba50 20 * and/or other materials provided with the distribution.
bcostm 4:137bb367ba50 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
bcostm 4:137bb367ba50 22 * may be used to endorse or promote products derived from this software
bcostm 4:137bb367ba50 23 * without specific prior written permission.
bcostm 4:137bb367ba50 24 *
bcostm 4:137bb367ba50 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
bcostm 4:137bb367ba50 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
bcostm 4:137bb367ba50 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
bcostm 4:137bb367ba50 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
bcostm 4:137bb367ba50 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
bcostm 4:137bb367ba50 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
bcostm 4:137bb367ba50 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
bcostm 4:137bb367ba50 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
bcostm 4:137bb367ba50 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
bcostm 4:137bb367ba50 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
bcostm 4:137bb367ba50 35 *
bcostm 4:137bb367ba50 36 ******************************************************************************
bcostm 4:137bb367ba50 37 */
bcostm 4:137bb367ba50 38
bcostm 4:137bb367ba50 39 /* Includes ------------------------------------------------------------------*/
bcostm 4:137bb367ba50 40 #include "lsm6dsl.h"
bcostm 4:137bb367ba50 41
bcostm 4:137bb367ba50 42 /** @addtogroup BSP
bcostm 4:137bb367ba50 43 * @{
bcostm 4:137bb367ba50 44 */
bcostm 4:137bb367ba50 45
bcostm 4:137bb367ba50 46 /** @addtogroup Component
bcostm 4:137bb367ba50 47 * @{
bcostm 4:137bb367ba50 48 */
bcostm 4:137bb367ba50 49
bcostm 4:137bb367ba50 50 /** @defgroup LSM6DSL LSM6DSL
bcostm 4:137bb367ba50 51 * @{
bcostm 4:137bb367ba50 52 */
bcostm 4:137bb367ba50 53
bcostm 4:137bb367ba50 54 /** @defgroup LSM6DSL_Private_Variables LSM6DSL Private Variables
bcostm 4:137bb367ba50 55 * @{
bcostm 4:137bb367ba50 56 */
bcostm 4:137bb367ba50 57 ACCELERO_DrvTypeDef Lsm6dslAccDrv =
bcostm 4:137bb367ba50 58 {
bcostm 4:137bb367ba50 59 LSM6DSL_AccInit,
bcostm 4:137bb367ba50 60 LSM6DSL_AccDeInit,
bcostm 4:137bb367ba50 61 LSM6DSL_AccReadID,
bcostm 4:137bb367ba50 62 0,
bcostm 4:137bb367ba50 63 LSM6DSL_AccLowPower,
bcostm 4:137bb367ba50 64 0,
bcostm 4:137bb367ba50 65 0,
bcostm 4:137bb367ba50 66 0,
bcostm 4:137bb367ba50 67 0,
bcostm 4:137bb367ba50 68 0,
bcostm 4:137bb367ba50 69 0,
bcostm 4:137bb367ba50 70 0,
bcostm 4:137bb367ba50 71 LSM6DSL_AccReadXYZ
bcostm 4:137bb367ba50 72 };
bcostm 4:137bb367ba50 73
bcostm 4:137bb367ba50 74 GYRO_DrvTypeDef Lsm6dslGyroDrv =
bcostm 4:137bb367ba50 75 {
bcostm 4:137bb367ba50 76 LSM6DSL_GyroInit,
bcostm 4:137bb367ba50 77 LSM6DSL_GyroDeInit,
bcostm 4:137bb367ba50 78 LSM6DSL_GyroReadID,
bcostm 4:137bb367ba50 79 0,
bcostm 4:137bb367ba50 80 LSM6DSL_GyroLowPower,
bcostm 4:137bb367ba50 81 0,
bcostm 4:137bb367ba50 82 0,
bcostm 4:137bb367ba50 83 0,
bcostm 4:137bb367ba50 84 0,
bcostm 4:137bb367ba50 85 0,
bcostm 4:137bb367ba50 86 0,
bcostm 4:137bb367ba50 87 0,
bcostm 4:137bb367ba50 88 LSM6DSL_GyroReadXYZAngRate
bcostm 4:137bb367ba50 89 };
bcostm 4:137bb367ba50 90 /**
bcostm 4:137bb367ba50 91 * @}
bcostm 4:137bb367ba50 92 */
bcostm 4:137bb367ba50 93
bcostm 4:137bb367ba50 94 /** @defgroup LSM6DSL_ACC_Private_Functions LSM6DSL ACC Private Functions
bcostm 4:137bb367ba50 95 * @{
bcostm 4:137bb367ba50 96 */
bcostm 4:137bb367ba50 97 /**
bcostm 4:137bb367ba50 98 * @brief Set LSM6DSL Accelerometer Initialization.
bcostm 4:137bb367ba50 99 * @param InitStruct: Init parameters
bcostm 4:137bb367ba50 100 */
bcostm 4:137bb367ba50 101 void LSM6DSL_AccInit(uint16_t InitStruct)
bcostm 4:137bb367ba50 102 {
bcostm 4:137bb367ba50 103 uint8_t ctrl = 0x00;
bcostm 4:137bb367ba50 104 uint8_t tmp;
bcostm 4:137bb367ba50 105
bcostm 4:137bb367ba50 106 /* Read CTRL1_XL */
bcostm 4:137bb367ba50 107 tmp = SENSOR_IO_Read(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL1_XL);
bcostm 4:137bb367ba50 108
bcostm 4:137bb367ba50 109 /* Write value to ACC MEMS CTRL1_XL register: FS and Data Rate */
bcostm 4:137bb367ba50 110 ctrl = (uint8_t) InitStruct;
bcostm 4:137bb367ba50 111 tmp &= ~(0xFC);
bcostm 4:137bb367ba50 112 tmp |= ctrl;
bcostm 4:137bb367ba50 113 SENSOR_IO_Write(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL1_XL, tmp);
bcostm 4:137bb367ba50 114
bcostm 4:137bb367ba50 115 /* Read CTRL3_C */
bcostm 4:137bb367ba50 116 tmp = SENSOR_IO_Read(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL3_C);
bcostm 4:137bb367ba50 117
bcostm 4:137bb367ba50 118 /* Write value to ACC MEMS CTRL3_C register: BDU and Auto-increment */
bcostm 4:137bb367ba50 119 ctrl = ((uint8_t) (InitStruct >> 8));
bcostm 4:137bb367ba50 120 tmp &= ~(0x44);
bcostm 4:137bb367ba50 121 tmp |= ctrl;
bcostm 4:137bb367ba50 122 SENSOR_IO_Write(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL3_C, tmp);
bcostm 4:137bb367ba50 123 }
bcostm 4:137bb367ba50 124
bcostm 4:137bb367ba50 125 /**
bcostm 4:137bb367ba50 126 * @brief LSM6DSL Accelerometer De-initialization.
bcostm 4:137bb367ba50 127 */
bcostm 4:137bb367ba50 128 void LSM6DSL_AccDeInit(void)
bcostm 4:137bb367ba50 129 {
bcostm 4:137bb367ba50 130 uint8_t ctrl = 0x00;
bcostm 4:137bb367ba50 131
bcostm 4:137bb367ba50 132 /* Read control register 1 value */
bcostm 4:137bb367ba50 133 ctrl = SENSOR_IO_Read(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL1_XL);
bcostm 4:137bb367ba50 134
bcostm 4:137bb367ba50 135 /* Clear ODR bits */
bcostm 4:137bb367ba50 136 ctrl &= ~(LSM6DSL_ODR_BITPOSITION);
bcostm 4:137bb367ba50 137
bcostm 4:137bb367ba50 138 /* Set Power down */
bcostm 4:137bb367ba50 139 ctrl |= LSM6DSL_ODR_POWER_DOWN;
bcostm 4:137bb367ba50 140
bcostm 4:137bb367ba50 141 /* write back control register */
bcostm 4:137bb367ba50 142 SENSOR_IO_Write(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL1_XL, ctrl);
bcostm 4:137bb367ba50 143 }
bcostm 4:137bb367ba50 144
bcostm 4:137bb367ba50 145 /**
bcostm 4:137bb367ba50 146 * @brief Read LSM6DSL ID.
bcostm 4:137bb367ba50 147 * @retval ID
bcostm 4:137bb367ba50 148 */
bcostm 4:137bb367ba50 149 uint8_t LSM6DSL_AccReadID(void)
bcostm 4:137bb367ba50 150 {
bcostm 4:137bb367ba50 151 /* IO interface initialization */
bcostm 4:137bb367ba50 152 SENSOR_IO_Init();
bcostm 4:137bb367ba50 153 /* Read value at Who am I register address */
bcostm 4:137bb367ba50 154 return (SENSOR_IO_Read(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_WHO_AM_I_REG));
bcostm 4:137bb367ba50 155 }
bcostm 4:137bb367ba50 156
bcostm 4:137bb367ba50 157 /**
bcostm 4:137bb367ba50 158 * @brief Set/Unset Accelerometer in low power mode.
bcostm 4:137bb367ba50 159 * @param status 0 means disable Low Power Mode, otherwise Low Power Mode is enabled
bcostm 4:137bb367ba50 160 */
bcostm 4:137bb367ba50 161 void LSM6DSL_AccLowPower(uint16_t status)
bcostm 4:137bb367ba50 162 {
bcostm 4:137bb367ba50 163 uint8_t ctrl = 0x00;
bcostm 4:137bb367ba50 164
bcostm 4:137bb367ba50 165 /* Read CTRL6_C value */
bcostm 4:137bb367ba50 166 ctrl = SENSOR_IO_Read(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL6_C);
bcostm 4:137bb367ba50 167
bcostm 4:137bb367ba50 168 /* Clear Low Power Mode bit */
bcostm 4:137bb367ba50 169 ctrl &= ~(0x10);
bcostm 4:137bb367ba50 170
bcostm 4:137bb367ba50 171 /* Set Low Power Mode */
bcostm 4:137bb367ba50 172 if(status)
bcostm 4:137bb367ba50 173 {
bcostm 4:137bb367ba50 174 ctrl |= LSM6DSL_ACC_GYRO_LP_XL_ENABLED;
bcostm 4:137bb367ba50 175 }else
bcostm 4:137bb367ba50 176 {
bcostm 4:137bb367ba50 177 ctrl |= LSM6DSL_ACC_GYRO_LP_XL_DISABLED;
bcostm 4:137bb367ba50 178 }
bcostm 4:137bb367ba50 179
bcostm 4:137bb367ba50 180 /* write back control register */
bcostm 4:137bb367ba50 181 SENSOR_IO_Write(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL6_C, ctrl);
bcostm 4:137bb367ba50 182 }
bcostm 4:137bb367ba50 183
bcostm 4:137bb367ba50 184 /**
bcostm 4:137bb367ba50 185 * @brief Read X, Y & Z Acceleration values
bcostm 4:137bb367ba50 186 * @param pData: Data out pointer
bcostm 4:137bb367ba50 187 */
bcostm 4:137bb367ba50 188 void LSM6DSL_AccReadXYZ(int16_t* pData)
bcostm 4:137bb367ba50 189 {
bcostm 4:137bb367ba50 190 int16_t pnRawData[3];
bcostm 4:137bb367ba50 191 uint8_t ctrlx= 0;
bcostm 4:137bb367ba50 192 uint8_t buffer[6];
bcostm 4:137bb367ba50 193 uint8_t i = 0;
bcostm 4:137bb367ba50 194 float sensitivity = 0;
bcostm 4:137bb367ba50 195
bcostm 4:137bb367ba50 196 /* Read the acceleration control register content */
bcostm 4:137bb367ba50 197 ctrlx = SENSOR_IO_Read(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL1_XL);
bcostm 4:137bb367ba50 198
bcostm 4:137bb367ba50 199 /* Read output register X, Y & Z acceleration */
bcostm 4:137bb367ba50 200 SENSOR_IO_ReadMultiple(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_OUTX_L_XL, buffer, 6);
bcostm 4:137bb367ba50 201
bcostm 4:137bb367ba50 202 for(i=0; i<3; i++)
bcostm 4:137bb367ba50 203 {
bcostm 4:137bb367ba50 204 pnRawData[i]=((((uint16_t)buffer[2*i+1]) << 8) + (uint16_t)buffer[2*i]);
bcostm 4:137bb367ba50 205 }
bcostm 4:137bb367ba50 206
bcostm 4:137bb367ba50 207 /* Normal mode */
bcostm 4:137bb367ba50 208 /* Switch the sensitivity value set in the CRTL1_XL */
bcostm 4:137bb367ba50 209 switch(ctrlx & 0x0C)
bcostm 4:137bb367ba50 210 {
bcostm 4:137bb367ba50 211 case LSM6DSL_ACC_FULLSCALE_2G:
bcostm 4:137bb367ba50 212 sensitivity = LSM6DSL_ACC_SENSITIVITY_2G;
bcostm 4:137bb367ba50 213 break;
bcostm 4:137bb367ba50 214 case LSM6DSL_ACC_FULLSCALE_4G:
bcostm 4:137bb367ba50 215 sensitivity = LSM6DSL_ACC_SENSITIVITY_4G;
bcostm 4:137bb367ba50 216 break;
bcostm 4:137bb367ba50 217 case LSM6DSL_ACC_FULLSCALE_8G:
bcostm 4:137bb367ba50 218 sensitivity = LSM6DSL_ACC_SENSITIVITY_8G;
bcostm 4:137bb367ba50 219 break;
bcostm 4:137bb367ba50 220 case LSM6DSL_ACC_FULLSCALE_16G:
bcostm 4:137bb367ba50 221 sensitivity = LSM6DSL_ACC_SENSITIVITY_16G;
bcostm 4:137bb367ba50 222 break;
bcostm 4:137bb367ba50 223 }
bcostm 4:137bb367ba50 224
bcostm 4:137bb367ba50 225 /* Obtain the mg value for the three axis */
bcostm 4:137bb367ba50 226 for(i=0; i<3; i++)
bcostm 4:137bb367ba50 227 {
bcostm 4:137bb367ba50 228 pData[i]=( int16_t )(pnRawData[i] * sensitivity);
bcostm 4:137bb367ba50 229 }
bcostm 4:137bb367ba50 230 }
bcostm 4:137bb367ba50 231
bcostm 4:137bb367ba50 232 /**
bcostm 4:137bb367ba50 233 * @}
bcostm 4:137bb367ba50 234 */
bcostm 4:137bb367ba50 235
bcostm 4:137bb367ba50 236 /** @defgroup LSM6DSL_GYRO_Private_Functions LSM6DSL GYRO Private Functions
bcostm 4:137bb367ba50 237 * @{
bcostm 4:137bb367ba50 238 */
bcostm 4:137bb367ba50 239
bcostm 4:137bb367ba50 240 /**
bcostm 4:137bb367ba50 241 * @brief Set LSM6DSL Gyroscope Initialization.
bcostm 4:137bb367ba50 242 * @param InitStruct: pointer to a LSM6DSL_InitTypeDef structure
bcostm 4:137bb367ba50 243 * that contains the configuration setting for the LSM6DSL.
bcostm 4:137bb367ba50 244 */
bcostm 4:137bb367ba50 245 void LSM6DSL_GyroInit(uint16_t InitStruct)
bcostm 4:137bb367ba50 246 {
bcostm 4:137bb367ba50 247 uint8_t ctrl = 0x00;
bcostm 4:137bb367ba50 248 uint8_t tmp;
bcostm 4:137bb367ba50 249
bcostm 4:137bb367ba50 250 /* Read CTRL2_G */
bcostm 4:137bb367ba50 251 tmp = SENSOR_IO_Read(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL2_G);
bcostm 4:137bb367ba50 252
bcostm 4:137bb367ba50 253 /* Write value to GYRO MEMS CTRL2_G register: FS and Data Rate */
bcostm 4:137bb367ba50 254 ctrl = (uint8_t) InitStruct;
bcostm 4:137bb367ba50 255 tmp &= ~(0xFC);
bcostm 4:137bb367ba50 256 tmp |= ctrl;
bcostm 4:137bb367ba50 257 SENSOR_IO_Write(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL2_G, tmp);
bcostm 4:137bb367ba50 258
bcostm 4:137bb367ba50 259 /* Read CTRL3_C */
bcostm 4:137bb367ba50 260 tmp = SENSOR_IO_Read(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL3_C);
bcostm 4:137bb367ba50 261
bcostm 4:137bb367ba50 262 /* Write value to GYRO MEMS CTRL3_C register: BDU and Auto-increment */
bcostm 4:137bb367ba50 263 ctrl = ((uint8_t) (InitStruct >> 8));
bcostm 4:137bb367ba50 264 tmp &= ~(0x44);
bcostm 4:137bb367ba50 265 tmp |= ctrl;
bcostm 4:137bb367ba50 266 SENSOR_IO_Write(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL3_C, tmp);
bcostm 4:137bb367ba50 267 }
bcostm 4:137bb367ba50 268
bcostm 4:137bb367ba50 269
bcostm 4:137bb367ba50 270 /**
bcostm 4:137bb367ba50 271 * @brief LSM6DSL Gyroscope De-initialization
bcostm 4:137bb367ba50 272 */
bcostm 4:137bb367ba50 273 void LSM6DSL_GyroDeInit(void)
bcostm 4:137bb367ba50 274 {
bcostm 4:137bb367ba50 275 uint8_t ctrl = 0x00;
bcostm 4:137bb367ba50 276
bcostm 4:137bb367ba50 277 /* Read control register 1 value */
bcostm 4:137bb367ba50 278 ctrl = SENSOR_IO_Read(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL2_G);
bcostm 4:137bb367ba50 279
bcostm 4:137bb367ba50 280 /* Clear ODR bits */
bcostm 4:137bb367ba50 281 ctrl &= ~(LSM6DSL_ODR_BITPOSITION);
bcostm 4:137bb367ba50 282
bcostm 4:137bb367ba50 283 /* Set Power down */
bcostm 4:137bb367ba50 284 ctrl |= LSM6DSL_ODR_POWER_DOWN;
bcostm 4:137bb367ba50 285
bcostm 4:137bb367ba50 286 /* write back control register */
bcostm 4:137bb367ba50 287 SENSOR_IO_Write(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL2_G, ctrl);
bcostm 4:137bb367ba50 288 }
bcostm 4:137bb367ba50 289
bcostm 4:137bb367ba50 290 /**
bcostm 4:137bb367ba50 291 * @brief Read ID address of LSM6DSL
bcostm 4:137bb367ba50 292 * @retval ID
bcostm 4:137bb367ba50 293 */
bcostm 4:137bb367ba50 294 uint8_t LSM6DSL_GyroReadID(void)
bcostm 4:137bb367ba50 295 {
bcostm 4:137bb367ba50 296 /* IO interface initialization */
bcostm 4:137bb367ba50 297 SENSOR_IO_Init();
bcostm 4:137bb367ba50 298 /* Read value at Who am I register address */
bcostm 4:137bb367ba50 299 return SENSOR_IO_Read(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_WHO_AM_I_REG);
bcostm 4:137bb367ba50 300 }
bcostm 4:137bb367ba50 301
bcostm 4:137bb367ba50 302 /**
bcostm 4:137bb367ba50 303 * @brief Set/Unset LSM6DSL Gyroscope in low power mode
bcostm 4:137bb367ba50 304 * @param status 0 means disable Low Power Mode, otherwise Low Power Mode is enabled
bcostm 4:137bb367ba50 305 */
bcostm 4:137bb367ba50 306 void LSM6DSL_GyroLowPower(uint16_t status)
bcostm 4:137bb367ba50 307 {
bcostm 4:137bb367ba50 308 uint8_t ctrl = 0x00;
bcostm 4:137bb367ba50 309
bcostm 4:137bb367ba50 310 /* Read CTRL7_G value */
bcostm 4:137bb367ba50 311 ctrl = SENSOR_IO_Read(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL7_G);
bcostm 4:137bb367ba50 312
bcostm 4:137bb367ba50 313 /* Clear Low Power Mode bit */
bcostm 4:137bb367ba50 314 ctrl &= ~(0x80);
bcostm 4:137bb367ba50 315
bcostm 4:137bb367ba50 316 /* Set Low Power Mode */
bcostm 4:137bb367ba50 317 if(status)
bcostm 4:137bb367ba50 318 {
bcostm 4:137bb367ba50 319 ctrl |= LSM6DSL_ACC_GYRO_LP_G_ENABLED;
bcostm 4:137bb367ba50 320 }else
bcostm 4:137bb367ba50 321 {
bcostm 4:137bb367ba50 322 ctrl |= LSM6DSL_ACC_GYRO_LP_G_DISABLED;
bcostm 4:137bb367ba50 323 }
bcostm 4:137bb367ba50 324
bcostm 4:137bb367ba50 325 /* write back control register */
bcostm 4:137bb367ba50 326 SENSOR_IO_Write(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL7_G, ctrl);
bcostm 4:137bb367ba50 327 }
bcostm 4:137bb367ba50 328
bcostm 4:137bb367ba50 329 /**
bcostm 4:137bb367ba50 330 * @brief Calculate the LSM6DSL angular data.
bcostm 4:137bb367ba50 331 * @param pfData: Data out pointer
bcostm 4:137bb367ba50 332 */
bcostm 4:137bb367ba50 333 void LSM6DSL_GyroReadXYZAngRate(float *pfData)
bcostm 4:137bb367ba50 334 {
bcostm 4:137bb367ba50 335 int16_t pnRawData[3];
bcostm 4:137bb367ba50 336 uint8_t ctrlg= 0;
bcostm 4:137bb367ba50 337 uint8_t buffer[6];
bcostm 4:137bb367ba50 338 uint8_t i = 0;
bcostm 4:137bb367ba50 339 float sensitivity = 0;
bcostm 4:137bb367ba50 340
bcostm 4:137bb367ba50 341 /* Read the gyro control register content */
bcostm 4:137bb367ba50 342 ctrlg = SENSOR_IO_Read(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL2_G);
bcostm 4:137bb367ba50 343
bcostm 4:137bb367ba50 344 /* Read output register X, Y & Z acceleration */
bcostm 4:137bb367ba50 345 SENSOR_IO_ReadMultiple(LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_OUTX_L_G, buffer, 6);
bcostm 4:137bb367ba50 346
bcostm 4:137bb367ba50 347 for(i=0; i<3; i++)
bcostm 4:137bb367ba50 348 {
bcostm 4:137bb367ba50 349 pnRawData[i]=((((uint16_t)buffer[2*i+1]) << 8) + (uint16_t)buffer[2*i]);
bcostm 4:137bb367ba50 350 }
bcostm 4:137bb367ba50 351
bcostm 4:137bb367ba50 352 /* Normal mode */
bcostm 4:137bb367ba50 353 /* Switch the sensitivity value set in the CRTL2_G */
bcostm 4:137bb367ba50 354 switch(ctrlg & 0x0C)
bcostm 4:137bb367ba50 355 {
bcostm 4:137bb367ba50 356 case LSM6DSL_GYRO_FS_245:
bcostm 4:137bb367ba50 357 sensitivity = LSM6DSL_GYRO_SENSITIVITY_245DPS;
bcostm 4:137bb367ba50 358 break;
bcostm 4:137bb367ba50 359 case LSM6DSL_GYRO_FS_500:
bcostm 4:137bb367ba50 360 sensitivity = LSM6DSL_GYRO_SENSITIVITY_500DPS;
bcostm 4:137bb367ba50 361 break;
bcostm 4:137bb367ba50 362 case LSM6DSL_GYRO_FS_1000:
bcostm 4:137bb367ba50 363 sensitivity = LSM6DSL_GYRO_SENSITIVITY_1000DPS;
bcostm 4:137bb367ba50 364 break;
bcostm 4:137bb367ba50 365 case LSM6DSL_GYRO_FS_2000:
bcostm 4:137bb367ba50 366 sensitivity = LSM6DSL_GYRO_SENSITIVITY_2000DPS;
bcostm 4:137bb367ba50 367 break;
bcostm 4:137bb367ba50 368 }
bcostm 4:137bb367ba50 369
bcostm 4:137bb367ba50 370 /* Obtain the mg value for the three axis */
bcostm 4:137bb367ba50 371 for(i=0; i<3; i++)
bcostm 4:137bb367ba50 372 {
bcostm 4:137bb367ba50 373 pfData[i]=( float )(pnRawData[i] * sensitivity);
bcostm 4:137bb367ba50 374 }
bcostm 4:137bb367ba50 375 }
bcostm 4:137bb367ba50 376
bcostm 4:137bb367ba50 377 /**
bcostm 4:137bb367ba50 378 * @}
bcostm 4:137bb367ba50 379 */
bcostm 4:137bb367ba50 380
bcostm 4:137bb367ba50 381 /**
bcostm 4:137bb367ba50 382 * @}
bcostm 4:137bb367ba50 383 */
bcostm 4:137bb367ba50 384
bcostm 4:137bb367ba50 385 /**
bcostm 4:137bb367ba50 386 * @}
bcostm 4:137bb367ba50 387 */
bcostm 4:137bb367ba50 388
bcostm 4:137bb367ba50 389 /**
bcostm 4:137bb367ba50 390 * @}
bcostm 4:137bb367ba50 391 */
bcostm 4:137bb367ba50 392
bcostm 4:137bb367ba50 393 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
bcostm 4:137bb367ba50 394