E&R S3 prime / BSP_DISCO_L476VG
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers l3gd20.c Source File

l3gd20.c

Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    l3gd20.c
00004   * @author  MCD Application Team
00005   * @brief   This file provides a set of functions needed to manage the L3GD20,
00006   *          ST MEMS motion sensor, 3-axis digital output gyroscope.  
00007   ******************************************************************************
00008   * @attention
00009   *
00010   * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
00011   * All rights reserved.</center></h2>
00012   *
00013   * This software component is licensed by ST under BSD 3-Clause license,
00014   * the "License"; You may not use this file except in compliance with the
00015   * License. You may obtain a copy of the License at:
00016   *                        opensource.org/licenses/BSD-3-Clause
00017   *
00018   ******************************************************************************
00019   */
00020 /* Includes ------------------------------------------------------------------*/
00021 #include "l3gd20.h"
00022 
00023 /** @addtogroup BSP
00024   * @{
00025   */ 
00026 
00027 /** @addtogroup Components
00028   * @{
00029   */ 
00030 
00031 /** @addtogroup L3GD20
00032   * @{
00033   */
00034 
00035 /** @defgroup L3GD20_Private_TypesDefinitions
00036   * @{
00037   */
00038   
00039 /**
00040   * @}
00041   */
00042 
00043 /** @defgroup L3GD20_Private_Defines
00044   * @{
00045   */
00046 
00047 /**
00048   * @}
00049   */
00050 
00051 /** @defgroup L3GD20_Private_Macros
00052   * @{
00053   */
00054 
00055 /**
00056   * @}
00057   */ 
00058   
00059 /** @defgroup L3GD20_Private_Variables
00060   * @{
00061   */ 
00062 GYRO_DrvTypeDef L3gd20Drv =
00063 {
00064   L3GD20_Init,
00065   L3GD20_DeInit,
00066   L3GD20_ReadID,
00067   L3GD20_RebootCmd,
00068   L3GD20_LowPower,
00069   L3GD20_INT1InterruptConfig,
00070   L3GD20_EnableIT,
00071   L3GD20_DisableIT,
00072   0,
00073   0,
00074   L3GD20_FilterConfig,
00075   L3GD20_FilterCmd,
00076   L3GD20_ReadXYZAngRate
00077 };
00078 
00079 /**
00080   * @}
00081   */
00082 
00083 /** @defgroup L3GD20_Private_FunctionPrototypes
00084   * @{
00085   */
00086 
00087 /**
00088   * @}
00089   */
00090 
00091 /** @defgroup L3GD20_Private_Functions
00092   * @{
00093   */
00094 
00095 /**
00096   * @brief  Set L3GD20 Initialization.
00097   * @param  L3GD20_InitStruct: pointer to a L3GD20_InitTypeDef structure 
00098   *         that contains the configuration setting for the L3GD20.
00099   * @retval None
00100   */
00101 void L3GD20_Init(uint16_t InitStruct)
00102 {  
00103   uint8_t ctrl = 0x00;
00104   
00105   /* Configure the low level interface */
00106   GYRO_IO_Init();
00107   
00108   /* Write value to MEMS CTRL_REG1 register */
00109   ctrl = (uint8_t) InitStruct;
00110   GYRO_IO_Write(&ctrl, L3GD20_CTRL_REG1_ADDR, 1);
00111   
00112   /* Write value to MEMS CTRL_REG4 register */  
00113   ctrl = (uint8_t) (InitStruct >> 8);
00114   GYRO_IO_Write(&ctrl, L3GD20_CTRL_REG4_ADDR, 1);
00115 }
00116 
00117 
00118 
00119 /**
00120   * @brief L3GD20 De-initialization
00121   * @param  None
00122   * @retval None
00123   */
00124 void L3GD20_DeInit(void)
00125 {
00126 }
00127 
00128 /**
00129   * @brief  Read ID address of L3GD20
00130   * @param  None
00131   * @retval ID name
00132   */
00133 uint8_t L3GD20_ReadID(void)
00134 {
00135   uint8_t tmp;
00136   
00137   /* Configure the low level interface */
00138   GYRO_IO_Init();
00139   
00140   /* Read WHO I AM register */
00141   GYRO_IO_Read(&tmp, L3GD20_WHO_AM_I_ADDR, 1);
00142   
00143   /* Return the ID */
00144   return (uint8_t)tmp;
00145 }
00146 
00147 /**
00148   * @brief  Reboot memory content of L3GD20
00149   * @param  None
00150   * @retval None
00151   */
00152 void L3GD20_RebootCmd(void)
00153 {
00154   uint8_t tmpreg;
00155   
00156   /* Read CTRL_REG5 register */
00157   GYRO_IO_Read(&tmpreg, L3GD20_CTRL_REG5_ADDR, 1);
00158   
00159   /* Enable or Disable the reboot memory */
00160   tmpreg |= L3GD20_BOOT_REBOOTMEMORY;
00161   
00162   /* Write value to MEMS CTRL_REG5 register */
00163   GYRO_IO_Write(&tmpreg, L3GD20_CTRL_REG5_ADDR, 1);
00164 }
00165 
00166 /**
00167   * @brief Set L3GD20 in low-power mode
00168   * @param 
00169   * @retval  None
00170   */
00171 void L3GD20_LowPower(uint16_t InitStruct)
00172 {  
00173   uint8_t ctrl = 0x00;
00174 
00175   /* Write value to MEMS CTRL_REG1 register */
00176   ctrl = (uint8_t) InitStruct;
00177   GYRO_IO_Write(&ctrl, L3GD20_CTRL_REG1_ADDR, 1);
00178 }
00179 
00180 /**
00181   * @brief  Set L3GD20 Interrupt INT1 configuration
00182   * @param  Int1Config: the configuration setting for the L3GD20 Interrupt.
00183   * @retval None
00184   */
00185 void L3GD20_INT1InterruptConfig(uint16_t Int1Config)
00186 {
00187   uint8_t ctrl_cfr = 0x00, ctrl3 = 0x00;
00188   
00189   /* Read INT1_CFG register */
00190   GYRO_IO_Read(&ctrl_cfr, L3GD20_INT1_CFG_ADDR, 1);
00191   
00192   /* Read CTRL_REG3 register */
00193   GYRO_IO_Read(&ctrl3, L3GD20_CTRL_REG3_ADDR, 1);
00194   
00195   ctrl_cfr &= 0x80;
00196   ctrl_cfr |= ((uint8_t) Int1Config >> 8);
00197   
00198   ctrl3 &= 0xDF;
00199   ctrl3 |= ((uint8_t) Int1Config);   
00200   
00201   /* Write value to MEMS INT1_CFG register */
00202   GYRO_IO_Write(&ctrl_cfr, L3GD20_INT1_CFG_ADDR, 1);
00203   
00204   /* Write value to MEMS CTRL_REG3 register */
00205   GYRO_IO_Write(&ctrl3, L3GD20_CTRL_REG3_ADDR, 1);
00206 }
00207 
00208 /**
00209   * @brief  Enable INT1 or INT2 interrupt
00210   * @param  IntSel: choice of INT1 or INT2 
00211   *      This parameter can be: 
00212   *        @arg L3GD20_INT1
00213   *        @arg L3GD20_INT2   
00214   * @retval None
00215   */
00216 void L3GD20_EnableIT(uint8_t IntSel)
00217 {  
00218   uint8_t tmpreg;
00219   
00220   /* Read CTRL_REG3 register */
00221   GYRO_IO_Read(&tmpreg, L3GD20_CTRL_REG3_ADDR, 1);
00222   
00223   if(IntSel == L3GD20_INT1)
00224   {
00225     tmpreg &= 0x7F; 
00226     tmpreg |= L3GD20_INT1INTERRUPT_ENABLE;
00227   }
00228   else if(IntSel == L3GD20_INT2)
00229   {
00230     tmpreg &= 0xF7;
00231     tmpreg |= L3GD20_INT2INTERRUPT_ENABLE;
00232   }
00233   
00234   /* Write value to MEMS CTRL_REG3 register */
00235   GYRO_IO_Write(&tmpreg, L3GD20_CTRL_REG3_ADDR, 1);
00236 }
00237 
00238 /**
00239   * @brief  Disable  INT1 or INT2 interrupt
00240   * @param  IntSel: choice of INT1 or INT2 
00241   *      This parameter can be: 
00242   *        @arg L3GD20_INT1
00243   *        @arg L3GD20_INT2   
00244   * @retval None
00245   */
00246 void L3GD20_DisableIT(uint8_t IntSel)
00247 {  
00248   uint8_t tmpreg;
00249   
00250   /* Read CTRL_REG3 register */
00251   GYRO_IO_Read(&tmpreg, L3GD20_CTRL_REG3_ADDR, 1);
00252   
00253   if(IntSel == L3GD20_INT1)
00254   {
00255     tmpreg &= 0x7F; 
00256     tmpreg |= L3GD20_INT1INTERRUPT_DISABLE;
00257   }
00258   else if(IntSel == L3GD20_INT2)
00259   {
00260     tmpreg &= 0xF7;
00261     tmpreg |= L3GD20_INT2INTERRUPT_DISABLE;
00262   }
00263   
00264   /* Write value to MEMS CTRL_REG3 register */
00265   GYRO_IO_Write(&tmpreg, L3GD20_CTRL_REG3_ADDR, 1);
00266 }
00267 
00268 /**
00269   * @brief  Set High Pass Filter Modality
00270   * @param  FilterStruct: contains the configuration setting for the L3GD20.        
00271   * @retval None
00272   */
00273 void L3GD20_FilterConfig(uint8_t FilterStruct) 
00274 {
00275   uint8_t tmpreg;
00276   
00277   /* Read CTRL_REG2 register */
00278   GYRO_IO_Read(&tmpreg, L3GD20_CTRL_REG2_ADDR, 1);
00279   
00280   tmpreg &= 0xC0;
00281   
00282   /* Configure MEMS: mode and cutoff frequency */
00283   tmpreg |= FilterStruct;
00284   
00285   /* Write value to MEMS CTRL_REG2 register */
00286   GYRO_IO_Write(&tmpreg, L3GD20_CTRL_REG2_ADDR, 1);
00287 }
00288 
00289 /**
00290   * @brief  Enable or Disable High Pass Filter
00291   * @param  HighPassFilterState: new state of the High Pass Filter feature.
00292   *      This parameter can be: 
00293   *         @arg: L3GD20_HIGHPASSFILTER_DISABLE 
00294   *         @arg: L3GD20_HIGHPASSFILTER_ENABLE          
00295   * @retval None
00296   */
00297 void L3GD20_FilterCmd(uint8_t HighPassFilterState)
00298 {
00299   uint8_t tmpreg;
00300   
00301   /* Read CTRL_REG5 register */
00302   GYRO_IO_Read(&tmpreg, L3GD20_CTRL_REG5_ADDR, 1);
00303   
00304   tmpreg &= 0xEF;
00305   
00306   tmpreg |= HighPassFilterState;
00307   
00308   /* Write value to MEMS CTRL_REG5 register */
00309   GYRO_IO_Write(&tmpreg, L3GD20_CTRL_REG5_ADDR, 1);
00310 }
00311 
00312 /**
00313   * @brief  Get status for L3GD20 data
00314   * @param  None         
00315   * @retval Data status in a L3GD20 Data
00316   */
00317 uint8_t L3GD20_GetDataStatus(void)
00318 {
00319   uint8_t tmpreg;
00320   
00321   /* Read STATUS_REG register */
00322   GYRO_IO_Read(&tmpreg, L3GD20_STATUS_REG_ADDR, 1);
00323   
00324   return tmpreg;
00325 }
00326 
00327 /**
00328 * @brief  Calculate the L3GD20 angular data.
00329 * @param  pfData: Data out pointer
00330 * @retval None
00331 */
00332 void L3GD20_ReadXYZAngRate(float *pfData)
00333 {
00334   uint8_t tmpbuffer[6] ={0};
00335   int16_t RawData[3] = {0};
00336   uint8_t tmpreg = 0;
00337   float sensitivity = 0;
00338   int i =0;
00339   
00340   GYRO_IO_Read(&tmpreg,L3GD20_CTRL_REG4_ADDR,1);
00341   
00342   GYRO_IO_Read(tmpbuffer,L3GD20_OUT_X_L_ADDR,6);
00343   
00344   /* check in the control register 4 the data alignment (Big Endian or Little Endian)*/
00345   if(!(tmpreg & L3GD20_BLE_MSB))
00346   {
00347     for(i=0; i<3; i++)
00348     {
00349       RawData[i]=(int16_t)(((uint16_t)tmpbuffer[2*i+1] << 8) + tmpbuffer[2*i]);
00350     }
00351   }
00352   else
00353   {
00354     for(i=0; i<3; i++)
00355     {
00356       RawData[i]=(int16_t)(((uint16_t)tmpbuffer[2*i] << 8) + tmpbuffer[2*i+1]);
00357     }
00358   }
00359   
00360   /* Switch the sensitivity value set in the CRTL4 */
00361   switch(tmpreg & L3GD20_FULLSCALE_SELECTION)
00362   {
00363   case L3GD20_FULLSCALE_250:
00364     sensitivity=L3GD20_SENSITIVITY_250DPS;
00365     break;
00366     
00367   case L3GD20_FULLSCALE_500:
00368     sensitivity=L3GD20_SENSITIVITY_500DPS;
00369     break;
00370     
00371   case L3GD20_FULLSCALE_2000:
00372     sensitivity=L3GD20_SENSITIVITY_2000DPS;
00373     break;
00374   }
00375   /* Divide by sensitivity */
00376   for(i=0; i<3; i++)
00377   {
00378     pfData[i]=(float)(RawData[i] * sensitivity);
00379   }
00380 }
00381 
00382 /**
00383   * @}
00384   */ 
00385 
00386 /**
00387   * @}
00388   */ 
00389 
00390 /**
00391   * @}
00392   */ 
00393 
00394 /**
00395   * @}
00396   */ 
00397 
00398 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/