Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
l3gd20.c
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>© 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****/
Generated on Wed Aug 17 2022 15:47:40 by
1.7.2