/** * @brief Read X, Y & Z Acceleration values * @param pData: Data out pointer * @retval None */ void LSM303DLHC_AccReadXYZ(int16_t* pData) { int16_t pnRawData[3]; uint8_t ctrlx[2]={0,0}; int8_t buffer[6]; uint8_t i = 0; uint8_t sensitivity = LSM303DLHC_ACC_SENSITIVITY_2G; /* Read the acceleration control register content */ ctrlx[0] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG4_A); ctrlx[1] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG5_A); /* Read output register X, Y & Z acceleration */ buffer[0] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_X_L_A); buffer[1] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_X_H_A); buffer[2] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_Y_L_A); buffer[3] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_Y_H_A); buffer[4] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_Z_L_A); buffer[5] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_Z_H_A); /* Check in the control register4 the data alignment*/ if(!(ctrlx[0] & LSM303DLHC_BLE_MSB)) { for(i=0; i<3; i++) { pnRawData[i]=((int16_t)((uint16_t)buffer[2*i+1] << 8) + buffer[2*i]); } } else /* Big Endian Mode */ { for(i=0; i<3; i++) { pnRawData[i]=((int16_t)((uint16_t)buffer[2*i] << 8) + buffer[2*i+1]); } } /* Normal mode */ /* Switch the sensitivity value set in the CRTL4 */ switch(ctrlx[0] & LSM303DLHC_FULLSCALE_16G) { case LSM303DLHC_FULLSCALE_2G: sensitivity = LSM303DLHC_ACC_SENSITIVITY_2G; break; case LSM303DLHC_FULLSCALE_4G: sensitivity = LSM303DLHC_ACC_SENSITIVITY_4G; break; case LSM303DLHC_FULLSCALE_8G: sensitivity = LSM303DLHC_ACC_SENSITIVITY_8G; break; case LSM303DLHC_FULLSCALE_16G: sensitivity = LSM303DLHC_ACC_SENSITIVITY_16G; break; } /* Obtain the mg value for the three axis */ for(i=0; i<3; i++) { pData[i]=(pnRawData[i] * sensitivity); } }
/** * @brief Read X, Y & Z Acceleration values * @param pData: Data out pointer * @retval None */ void LSM303DLHC_AccReadXYZ(float* pData) { int16_t pnRawData[3] = {0}; uint8_t ctrlx[2] = {0,0}; int8_t buffer[6] = {0}; uint8_t i = 0; uint8_t sensitivity = LSM303DLHC_ACC_SENSITIVITY_2G; /* Read the acceleration control register content */ ctrlx[0] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG4_A); ctrlx[1] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG5_A); /* Read output register X, Y & Z acceleration */ buffer[0] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_X_L_A); buffer[1] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_X_H_A); buffer[2] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_Y_L_A); buffer[3] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_Y_H_A); buffer[4] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_Z_L_A); buffer[5] = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_Z_H_A); /* Check in the control register4 the data alignment*/ if(!(ctrlx[0] & LSM303DLHC_BLE_MSB)) { for(i=0; i<3; i++) { pnRawData[i]=(int16_t)((((uint16_t)buffer[2*i+1] << 8) + buffer[2*i]) >> 4); } } else /* Big Endian Mode */ { for(i=0; i<3; i++)
/** * @brief Click interrupt enable * @param ITClick: the selected interrupt to enable * @retval None */ void LSM303DLHC_AccClickITEnable(uint8_t ITClick) { uint8_t tmpval = 0x00; /* Read CLICK_CFR register */ tmpval = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_CLICK_CFG_A); /* Enable the selected interrupt */ tmpval |= ITClick; /* Write value to MEMS CLICK CFG register */ COMPASSACCELERO_IO_Write(ACC_I2C_ADDRESS, LSM303DLHC_CLICK_CFG_A, tmpval); /* Configure Click Threshold on Z axis */ tmpval = 0x0A; COMPASSACCELERO_IO_Write(ACC_I2C_ADDRESS, LSM303DLHC_CLICK_THS_A, tmpval); /* Configure Time Limit */ tmpval = 0x05; COMPASSACCELERO_IO_Write(ACC_I2C_ADDRESS, LSM303DLHC_TIME_LIMIT_A, tmpval); /* Configure Latency */ COMPASSACCELERO_IO_Write(ACC_I2C_ADDRESS, LSM303DLHC_TIME_LATENCY_A, tmpval); /* Configure Click Window */ tmpval = 0x32; COMPASSACCELERO_IO_Write(ACC_I2C_ADDRESS, LSM303DLHC_TIME_WINDOW_A, tmpval); }
/** * @brief Get status for Mag LSM303DLHC data * @param None * @retval Data status in a LSM303DLHC Data register */ uint8_t LSM303DLHC_MagGetDataStatus(void) { uint8_t tmpreg; /* Read Mag STATUS register */ COMPASSACCELERO_IO_Read(MAG_I2C_ADDRESS, LSM303DLHC_SR_REG_M, 1, &tmpreg); return tmpreg; }
/** * @brief Read LSM303DLHC ID. * @param None * @retval ID */ uint8_t LSM303DLHC_AccReadID(void) { uint8_t ctrl = 0x00; /* Low level init */ COMPASSACCELERO_IO_Init(); /* Read value at Who am I register address */ ctrl = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_WHO_AM_I_ADDR); return ctrl; }
/** * @brief Click interrupt disable * @param ITClick: the selected click interrupt to disable * @retval None */ void LSM303DLHC_AccClickITDisable(uint8_t ITClick) { uint8_t tmpval = 0x00; /* Read CLICK_CFR register */ tmpval = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_CLICK_CFG_A); /* Disable the selected interrupt */ tmpval &= ~ITClick; /* Write value to MEMS CLICK_CFR register */ COMPASSACCELERO_IO_Write(ACC_I2C_ADDRESS, LSM303DLHC_CLICK_CFG_A, tmpval); }
/** * @brief INT2 interrupt config * @param ITCombination: Or or And combination * ITAxes: axes to be enabled * @retval None */ void LSM303DLHC_AccINT2InterruptDisable(uint8_t ITCombination, uint8_t ITAxes) { uint8_t tmpval = 0x00; /* Read INT2_CFR register */ tmpval = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_INT2_CFG_A); /* Disable the selected interrupt */ tmpval &= ~(ITAxes | ITCombination); /* Write value to MEMS INT2_CFR register */ COMPASSACCELERO_IO_Write(ACC_I2C_ADDRESS, LSM303DLHC_INT2_CFG_A, tmpval); }
/** * @brief Disable LSM303DLHC Interrupt2 * @param LSM303DLHC_IT: specifies the LSM303DLHC interrupt source to be disabled. * This parameter can be any combination of the following values: * @arg LSM303DLHC_IT2_CLICK * @arg LSM303DLHC_IT2_INT1 * @arg LSM303DLHC_IT2_INT2 * @arg LSM303DLHC_IT2_BOOT * @arg LSM303DLHC_IT2_ACT * @arg LSM303DLHC_IT2_HLACTIVE * @retval None */ void LSM303DLHC_AccIT2Disable(uint8_t LSM303DLHC_IT) { uint8_t tmpval = 0x00; /* Read CTRL_REG3 register */ tmpval = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG6_A); /* Disable IT2 */ tmpval &= ~LSM303DLHC_IT; /* Write value to MEMS CTRL_REG3 register */ COMPASSACCELERO_IO_Write(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG6_A, tmpval); }
/** * @brief Set High Pass Filter Modality * @param FilterStruct: contains data for filter config * @retval None */ void LSM303DLHC_AccFilterConfig(uint8_t FilterStruct) { uint8_t tmpreg; /* Read CTRL_REG2 register */ tmpreg = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG2_A); tmpreg &= 0x0C; tmpreg |= FilterStruct; /* Write value to ACC MEMS CTRL_REG2 register */ COMPASSACCELERO_IO_Write(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG2_A, tmpreg); }
/** * @brief Reboot memory content of LSM303DLHC * @param None * @retval None */ void LSM303DLHC_AccRebootCmd(void) { uint8_t tmpreg; /* Read CTRL_REG5 register */ tmpreg = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG5_A); /* Enable or Disable the reboot memory */ tmpreg |= LSM303DLHC_BOOT_REBOOTMEMORY; /* Write value to ACC MEMS CTRL_REG5 register */ COMPASSACCELERO_IO_Write(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG5_A, tmpreg); }
/** * @brief Enable or Disable High Pass Filter on CLick * @param HighPassFilterState: new state of the High Pass Filter feature. * This parameter can be: * @arg: LSM303DLHC_HPF_CLICK_DISABLE * @arg: LSM303DLHC_HPF_CLICK_ENABLE * @retval None */ void LSM303DLHC_AccFilterClickCmd(uint8_t HighPassFilterClickState) { uint8_t tmpreg = 0x00; /* Read CTRL_REG2 register */ tmpreg = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG2_A); tmpreg &= ~(LSM303DLHC_HPF_CLICK_ENABLE); tmpreg |= HighPassFilterClickState; /* Write value to ACC MEMS CTRL_REG2 regsister */ COMPASSACCELERO_IO_Write(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG2_A, tmpreg); }
/** * @brief Enable or Disable High Pass Filter * @param HighPassFilterState: new state of the High Pass Filter feature. * This parameter can be: * @arg: LSM303DLHC_HIGHPASSFILTER_DISABLE * @arg: LSM303DLHC_HIGHPASSFILTER_ENABLE * @retval None */ void LSM303DLHC_AccFilterCmd(uint8_t HighPassFilterState) { uint8_t tmpreg; /* Read CTRL_REG2 register */ tmpreg = COMPASSACCELERO_IO_Read(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG2_A); tmpreg &= 0xF7; tmpreg |= HighPassFilterState; /* Write value to ACC MEMS CTRL_REG2 register */ COMPASSACCELERO_IO_Write(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG2_A, tmpreg); }