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.
Dependents: DiscoLogger DISCO_L476VG_GlassLCD DISCO_L476VG_MicrophoneRecorder DISCO_L476VG_UART ... more
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 Tue Jul 12 2022 18:37:21 by
1.7.2