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:
- 0:ad9dfc0179dc
diff -r 000000000000 -r ad9dfc0179dc Components/lsm303c/lsm303c.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Components/lsm303c/lsm303c.c Mon Nov 02 19:38:36 2015 +0000
@@ -0,0 +1,445 @@
+/**
+ ******************************************************************************
+ * @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****/
+