172 lines
4.2 KiB
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);
|
|
}
|