MCUXpresso_MIMXRT1052xxxxB/components/mma8451q/fsl_mma.c

172 lines
4.2 KiB
C

/*
* Copyright (c) 2013-2015, Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "fsl_mma.h"
/******************************************************************************
* Code
******************************************************************************/
status_t MMA_Init(mma_handle_t *handle, mma_config_t *config)
{
assert(handle);
assert(config);
uint8_t val = 0;
uint32_t i = 0;
/* Initialize the callback function. */
handle->I2C_SendFunc = config->I2C_SendFunc;
handle->I2C_ReceiveFunc = config->I2C_ReceiveFunc;
/* Set Slave Address. */
handle->slaveAddress = config->slaveAddress;
if (MMA_ReadReg(handle, kMMA8451_WHO_AM_I, &val) != kStatus_Success)
{
return kStatus_Fail;
}
if (val != kMMA8451_WHO_AM_I_Device_ID)
{
return kStatus_Fail;
}
/* Reset sensor */
if (MMA_ReadReg(handle, kMMA8451_CTRL_REG2, &val) != kStatus_Success)
{
return kStatus_Fail;
}
val |= (uint8_t)0x40;
if (MMA_WriteReg(handle, kMMA8451_CTRL_REG2, val) != kStatus_Success)
{
return kStatus_Fail;
}
/* Delay to ensure reliable sensor reset */
for (i = 0; i < SystemCoreClock / 1000U; i++)
{
__NOP();
}
/* Put the mma8451 into standby mode */
if (MMA_ReadReg(handle, kMMA8451_CTRL_REG1, &val) != kStatus_Success)
{
return kStatus_Fail;
}
val &= (uint8_t)(~(0x01));
if (MMA_WriteReg(handle, kMMA8451_CTRL_REG1, val) != kStatus_Success)
{
return kStatus_Fail;
}
/* Set the range, -4g to 4g */
if (MMA_ReadReg(handle, kMMA8451_XYZ_DATA_CFG, &val) != kStatus_Success)
{
return kStatus_Fail;
}
val &= (uint8_t)(~0x03);
val |= 0x01;
if (MMA_WriteReg(handle, kMMA8451_XYZ_DATA_CFG, val) != kStatus_Success)
{
return kStatus_Fail;
}
/* Set the F_MODE, disable FIFO */
if (MMA_ReadReg(handle, kMMA8451_F_SETUP, &val) != kStatus_Success)
{
return kStatus_Fail;
}
val &= 0x3F;
if (MMA_WriteReg(handle, kMMA8451_F_SETUP, val) != kStatus_Success)
{
return kStatus_Fail;
}
/* Put the mma8451 into active mode */
if (MMA_ReadReg(handle, kMMA8451_CTRL_REG1, &val) != kStatus_Success)
{
return kStatus_Fail;
}
val |= 0x01;
val &= (uint8_t)(~0x02); /* set F_READ to 0 */
if (MMA_WriteReg(handle, kMMA8451_CTRL_REG1, val) != kStatus_Success)
{
return kStatus_Fail;
}
return kStatus_Success;
}
status_t MMA_ReadSensorData(mma_handle_t *handle, mma_data_t *accel)
{
uint8_t val = 0U;
uint8_t ucStatus = 0;
do
{
if (MMA_ReadReg(handle, kMMA8451_STATUS, &ucStatus) != kStatus_Success)
{
return kStatus_Fail;
}
} while (!(ucStatus & 0x08));
if (MMA_ReadReg(handle, kMMA8451_OUT_X_MSB, &val) != kStatus_Success)
{
return kStatus_Fail;
}
accel->accelXMSB = val;
if (MMA_ReadReg(handle, kMMA8451_OUT_X_LSB, &val) != kStatus_Success)
{
return kStatus_Fail;
}
accel->accelXLSB = val;
if (MMA_ReadReg(handle, kMMA8451_OUT_Y_MSB, &val) != kStatus_Success)
{
return kStatus_Fail;
}
accel->accelYMSB = val;
if (MMA_ReadReg(handle, kMMA8451_OUT_Y_LSB, &val) != kStatus_Success)
{
return kStatus_Fail;
}
accel->accelYLSB = val;
if (MMA_ReadReg(handle, kMMA8451_OUT_Z_MSB, &val) != kStatus_Success)
{
return kStatus_Fail;
}
accel->accelZMSB = val;
if (MMA_ReadReg(handle, kMMA8451_OUT_Z_LSB, &val) != kStatus_Success)
{
return kStatus_Fail;
}
accel->accelZLSB = val;
return kStatus_Success;
}
status_t MMA_ReadReg(mma_handle_t *handle, uint8_t reg, uint8_t *val)
{
assert(handle);
assert(val);
if (!handle->I2C_ReceiveFunc)
{
return kStatus_Fail;
}
return handle->I2C_ReceiveFunc(handle->slaveAddress, reg, 1, val, 1);
}
status_t MMA_WriteReg(mma_handle_t *handle, uint8_t reg, uint8_t val)
{
assert(handle);
if (!handle->I2C_SendFunc)
{
return kStatus_Fail;
}
return handle->I2C_SendFunc(handle->slaveAddress, reg, 1, val);
}