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.
Dependencies: CMSIS_STM32L4xx CMSIS_DSP_401 STM32L4xx_HAL_Driver
Diff: Components/lsm303c/lsm303c.c
- Revision:
- 4:a1219ef3537f
- Parent:
- 2:a9f205b30d61
diff -r a9f205b30d61 -r a1219ef3537f Components/lsm303c/lsm303c.c --- a/Components/lsm303c/lsm303c.c Thu Nov 12 20:53:23 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,445 +0,0 @@ -/** - ****************************************************************************** - * @file lsm303c.c - * @author MCD Application Team - * @version V1.0.0 - * @date 24-June-2015 - * @brief This file provides a set of functions needed to manage the LSM303C - * MEMS accelerometer. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ -/* Includes ------------------------------------------------------------------*/ -#include "lsm303c.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup LSM303C - * @{ - */ - -/** @defgroup LSM303C_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup LSM303C_Private_Defines - * @{ - */ - -/** - * @} - */ - -/** @defgroup LSM303C_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup LSM303C_Private_Functions - * @{ - */ - -/* ACCELEROMETER functions */ -void LSM303C_AccInit(uint16_t InitStruct); -void LSM303C_AccDeInit(void); -uint8_t LSM303C_AccReadID(void); -void LSM303C_AccLowPower(void); -void LSM303C_AccFilterConfig(uint8_t FilterStruct); -void LSM303C_AccFilterCmd(uint8_t HighPassFilterState); -void LSM303C_AccReadXYZ(int16_t* pData); -void LSM303C_AccFilterClickCmd(uint8_t HighPassFilterClickState); -void LSM303C_AccIT1Enable(uint8_t LSM303C_IT); -void LSM303C_AccIT1Disable(uint8_t LSM303C_IT); -void LSM303C_AccIT2Enable(uint8_t LSM303C_IT); -void LSM303C_AccIT2Disable(uint8_t LSM303C_IT); -void LSM303C_AccClickITEnable(uint8_t ITClick); -void LSM303C_AccClickITDisable(uint8_t ITClick); -void LSM303C_AccZClickITConfig(void); - -/* MAGNETOMETER functions */ -void LSM303C_MagInit(MAGNETO_InitTypeDef LSM303C_InitStruct); -void LSM303C_MagDeInit(void); -uint8_t LSM303C_MagReadID(void); -void LSM303C_MagLowPower(void); -void LSM303C_MagReadXYZ(int16_t* pData); -uint8_t LSM303C_MagGetDataStatus(void); - - -/* COMPASS / ACCELERO IO functions */ -extern void ACCELERO_IO_Init(void); -extern void ACCELERO_IO_ITConfig(void); -extern void ACCELERO_IO_Write(uint8_t RegisterAddr, uint8_t Value); -extern uint8_t ACCELERO_IO_Read(uint8_t RegisterAddr); - -/* COMPASS IO function */ -extern void MAGNETO_IO_Init(void); -extern void MAGNETO_IO_ITConfig(void); -extern void MAGNETO_IO_Write(uint8_t RegisterAddr, uint8_t Value); -extern uint8_t MAGNETO_IO_Read(uint8_t RegisterAddr); - -/** - * @} - */ - - -/** @defgroup LSM303C_Private_Variables - * @{ - */ -ACCELERO_DrvTypeDef Lsm303cDrv_accelero = -{ - LSM303C_AccInit, - LSM303C_AccDeInit, - LSM303C_AccReadID, - 0, - LSM303C_AccLowPower, - 0, - 0, - 0, - 0, - 0, - LSM303C_AccFilterConfig, - 0, - LSM303C_AccReadXYZ -}; - -MAGNETO_DrvTypeDef Lsm303cDrv_magneto = -{ - LSM303C_MagInit, - LSM303C_MagDeInit, - LSM303C_MagReadID, - 0, - LSM303C_MagLowPower, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - LSM303C_MagReadXYZ - -}; - -/** - * @} - */ - - -/** - * @brief Set LSM303C Accelerometer Initialization. - * @param InitStruct: Init parameters - * @retval None - */ -void LSM303C_AccInit(uint16_t InitStruct) -{ - uint8_t ctrl = 0x00; - - /* Low level init */ - ACCELERO_IO_Init(); - - /* Write value to ACC MEMS CTRL_REG1 register */ - ctrl = (uint8_t) InitStruct; - ACCELERO_IO_Write(LSM303C_CTRL_REG1_A, ctrl); - - /* Write value to ACC MEMS CTRL_REG4 register */ - ctrl = ((uint8_t) (InitStruct >> 8)); - ACCELERO_IO_Write(LSM303C_CTRL_REG4_A, ctrl); -} - -/** - * @brief LSM303C Accelerometer De-initialization. - * @param None - * @retval None - */ -void LSM303C_AccDeInit(void) -{ -} - -/** - * @brief Read LSM303C ID. - * @param None - * @retval ID - */ -uint8_t LSM303C_AccReadID(void) -{ - uint8_t ctrl = 0x00; - - /* Low level init */ - ACCELERO_IO_Init(); - - /* Enabled SPI/I2C read communication */ - ACCELERO_IO_Write(LSM303C_CTRL_REG4_A, 0x5); - - /* Read value at Who am I register address */ - ctrl = ACCELERO_IO_Read(LSM303C_WHO_AM_I_ADDR); - - return ctrl; -} - -/** - * @brief Put Accelerometer in power down mode. - * @param None - * @retval None - */ -void LSM303C_AccLowPower(void) -{ - uint8_t ctrl = 0x00; - - /* Read control register 1 value */ - ctrl = ACCELERO_IO_Read(LSM303C_CTRL_REG1_A); - - /* Clear ODR bits */ - ctrl &= ~(LSM303C_ACC_ODR_BITPOSITION); - - /* Set Power down */ - ctrl |= LSM303C_ACC_ODR_OFF; - - /* write back control register */ - ACCELERO_IO_Write(LSM303C_CTRL_REG1_A, ctrl); -} - -/** - * @brief Set High Pass Filter Modality - * @param FilterStruct: contains data for filter config - * @retval None - */ -void LSM303C_AccFilterConfig(uint8_t FilterStruct) -{ - uint8_t tmpreg; - -// /* Read CTRL_REG2 register */ -// tmpreg = ACCELERO_IO_Read(LSM303C_CTRL_REG2_A); -// -// tmpreg &= 0x0C; - tmpreg = FilterStruct; - - /* Write value to ACC MEMS CTRL_REG2 register */ - ACCELERO_IO_Write(LSM303C_CTRL_REG2_A, tmpreg); -} - -/** - * @brief Read X, Y & Z Acceleration values - * @param pData: Data out pointer - * @retval None - */ -void LSM303C_AccReadXYZ(int16_t* pData) -{ - int16_t pnRawData[3]; - uint8_t ctrlx[2]={0,0}; - uint8_t buffer[6]; - uint8_t i = 0; - uint8_t sensitivity = LSM303C_ACC_SENSITIVITY_2G; - - /* Read the acceleration control register content */ - ctrlx[0] = ACCELERO_IO_Read(LSM303C_CTRL_REG4_A); - ctrlx[1] = ACCELERO_IO_Read(LSM303C_CTRL_REG5_A); - - /* Read output register X, Y & Z acceleration */ - buffer[0] = ACCELERO_IO_Read(LSM303C_OUT_X_L_A); - buffer[1] = ACCELERO_IO_Read(LSM303C_OUT_X_H_A); - buffer[2] = ACCELERO_IO_Read(LSM303C_OUT_Y_L_A); - buffer[3] = ACCELERO_IO_Read(LSM303C_OUT_Y_H_A); - buffer[4] = ACCELERO_IO_Read(LSM303C_OUT_Z_L_A); - buffer[5] = ACCELERO_IO_Read(LSM303C_OUT_Z_H_A); - - for(i=0; i<3; i++) - { - pnRawData[i]=((int16_t)((uint16_t)buffer[2*i+1] << 8) + buffer[2*i]); - } - - /* Normal mode */ - /* Switch the sensitivity value set in the CRTL4 */ - switch(ctrlx[0] & LSM303C_ACC_FULLSCALE_8G) - { - case LSM303C_ACC_FULLSCALE_2G: - sensitivity = LSM303C_ACC_SENSITIVITY_2G; - break; - case LSM303C_ACC_FULLSCALE_4G: - sensitivity = LSM303C_ACC_SENSITIVITY_4G; - break; - case LSM303C_ACC_FULLSCALE_8G: - sensitivity = LSM303C_ACC_SENSITIVITY_8G; - break; - } - - /* Obtain the mg value for the three axis */ - for(i=0; i<3; i++) - { - pData[i]=(pnRawData[i] * sensitivity); - } -} - -/*********************************************************************************************** - Magnetometer driver -***********************************************************************************************/ - -/** - * @brief Set LSM303C Magnetometer Initialization. - * @param LSM303C_InitStruct: pointer to a LSM303C_MagInitTypeDef structure - * that contains the configuration setting for the LSM303C. - * @retval None - */ -void LSM303C_MagInit(MAGNETO_InitTypeDef LSM303C_InitStruct) -{ - MAGNETO_IO_Write(LSM303C_CTRL_REG1_M, LSM303C_InitStruct.Register1); - MAGNETO_IO_Write(LSM303C_CTRL_REG2_M, LSM303C_InitStruct.Register2); - MAGNETO_IO_Write(LSM303C_CTRL_REG3_M, LSM303C_InitStruct.Register3); - MAGNETO_IO_Write(LSM303C_CTRL_REG4_M, LSM303C_InitStruct.Register4); - MAGNETO_IO_Write(LSM303C_CTRL_REG5_M, LSM303C_InitStruct.Register5); -} - -/** - * @brief LSM303C Magnetometer De-initialization. - * @param None - * @retval None - */ -void LSM303C_MagDeInit(void) -{ -} - -/** - * @brief Read LSM303C ID. - * @param None - * @retval ID - */ -uint8_t LSM303C_MagReadID(void) -{ - /* Low level init */ - MAGNETO_IO_Init(); - - /* Enabled the SPI/I2C read operation */ - MAGNETO_IO_Write(LSM303C_CTRL_REG3_M, 0x84); - - /* Read value at Who am I register address */ - return MAGNETO_IO_Read(LSM303C_WHO_AM_I_ADDR); -} - -/** - * @brief Put Magnetometer in power down mode. - * @param None - * @retval None - */ -void LSM303C_MagLowPower(void) -{ - uint8_t ctrl = 0x00; - - /* Read control register 1 value */ - ctrl = MAGNETO_IO_Read(LSM303C_CTRL_REG3_M); - - /* Clear ODR bits */ - ctrl &= ~(LSM303C_MAG_SELECTION_MODE); - - /* Set Power down */ - ctrl |= LSM303C_MAG_POWERDOWN2_MODE; - - /* write back control register */ - MAGNETO_IO_Write(LSM303C_CTRL_REG3_M, ctrl); -} - -/** - * @brief Get status for Mag LSM303C data - * @param None - * @retval Data status in a LSM303C Data register - */ -uint8_t LSM303C_MagGetDataStatus(void) -{ - /* Read Mag STATUS register */ - return MAGNETO_IO_Read(LSM303C_STATUS_REG_M); -} - -/** - * @brief Read X, Y & Z Magnetometer values - * @param pData: Data out pointer - * @retval None - */ -void LSM303C_MagReadXYZ(int16_t* pData) -{ - uint8_t ctrlx; - uint8_t buffer[6]; - uint8_t i=0; - - /* Read the magnetometer control register content */ - ctrlx = MAGNETO_IO_Read(LSM303C_CTRL_REG4_M); - - /* Read output register X, Y & Z magnetometer */ - buffer[0] = MAGNETO_IO_Read(LSM303C_OUT_X_L_M); - buffer[1] = MAGNETO_IO_Read(LSM303C_OUT_X_H_M); - buffer[2] = MAGNETO_IO_Read(LSM303C_OUT_Y_L_M); - buffer[3] = MAGNETO_IO_Read(LSM303C_OUT_Y_H_M); - buffer[4] = MAGNETO_IO_Read(LSM303C_OUT_Z_L_M); - buffer[5] = MAGNETO_IO_Read(LSM303C_OUT_Z_H_M); - - /* Check in the control register4 the data alignment*/ - if((ctrlx & LSM303C_MAG_BLE_MSB)) - { - for(i=0; i<3; i++) - { - pData[i]=((int16_t)((uint16_t)buffer[2*i] << 8) + buffer[2*i+1]); - } - } - else - { - for(i=0; i<3; i++) - { - pData[i]=((int16_t)((uint16_t)buffer[2*i+1] << 8) + buffer[2*i]); - } - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ -