mirror of
https://github.com/oopuuu/zTC1.git
synced 2025-12-16 23:18:24 +08:00
2556 lines
74 KiB
C
2556 lines
74 KiB
C
/*
|
|
****************************************************************************
|
|
* Copyright (C) 2011 - 2015 Bosch Sensortec GmbH
|
|
*
|
|
* bmm050.c
|
|
* Date: 2015/05/21
|
|
* Revision: 2.0.4 $
|
|
*
|
|
* Usage: Sensor Driver for BMM050 and BMM150 sensor
|
|
*
|
|
****************************************************************************
|
|
* License:
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* 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.
|
|
*
|
|
* Neither the name of the copyright holder nor the names of the
|
|
* 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 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
|
|
*
|
|
* The information provided is believed to be accurate and reliable.
|
|
* The copyright holder assumes no responsibility
|
|
* for the consequences of use
|
|
* of such information nor for any infringement of patents or
|
|
* other rights of third parties which may result from its use.
|
|
* No license is granted by implication or otherwise under any patent or
|
|
* patent rights of the copyright holder.
|
|
**************************************************************************/
|
|
/****************************************************************************/
|
|
#include "bmm050.h"
|
|
|
|
static struct bmm050 *p_bmm050;
|
|
/*!
|
|
* @brief This function is used for initialize
|
|
* bus read and bus write functions
|
|
* assign the chip id and device address
|
|
* chip id is read in the register 0x40 bit from 0 to 7
|
|
*
|
|
* @note While changing the parameter of the bmm050
|
|
* consider the following point:
|
|
* @note Changing the reference value of the parameter
|
|
* will changes the local copy or local reference
|
|
* make sure your changes will not
|
|
* affect the reference value of the parameter
|
|
* (Better case don't change the reference value of the parameter)
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_init(struct bmm050 *bmm050)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
/*Array holding the mag chip id
|
|
v_data_u8[0] - chip id
|
|
*/
|
|
u8 v_data_u8[BMM050_INIT_DATA_SIZE] = {
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE};
|
|
|
|
p_bmm050 = bmm050;
|
|
|
|
/* set device from suspend into sleep mode */
|
|
com_rslt = bmm050_set_power_mode(BMM050_ON);
|
|
|
|
/* wait two millisecond for bmc to settle */
|
|
p_bmm050->delay_msec(BMM050_DELAY_SETTLING_TIME);
|
|
|
|
/*Read CHIP_ID and REv. info */
|
|
com_rslt += p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_CHIP_ID, v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
p_bmm050->company_id = v_data_u8[BMM050_CHIP_ID_DATA];
|
|
|
|
/* Function to initialise trim values */
|
|
com_rslt += bmm050_init_trim_registers();
|
|
/* set the preset mode as regular*/
|
|
com_rslt += bmm050_set_presetmode(BMM050_PRESETMODE_REGULAR);
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to get the preset modes
|
|
*
|
|
* @note The preset mode setting is
|
|
* depend on Data Rate, XY and Z repetitions
|
|
*
|
|
*
|
|
*
|
|
* @param v_presetmode_u8: The value of selected preset mode
|
|
* value | preset_mode
|
|
* ----------|-----------------
|
|
* 1 | BMM050_PRESETMODE_LOWPOWER
|
|
* 2 | BMM050_PRESETMODE_REGULAR
|
|
* 3 | BMM050_PRESETMODE_HIGHACCURACY
|
|
* 4 | BMM050_PRESETMODE_ENHANCED
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_get_presetmode(
|
|
u8 *v_presetmode_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_rate_u8 = BMM050_INIT_VALUE;
|
|
u8 rep_xy = BMM050_INIT_VALUE;
|
|
u8 rep_z = BMM050_INIT_VALUE;
|
|
/* Get the current data rate */
|
|
com_rslt = bmm050_get_data_rate(&v_data_rate_u8);
|
|
/* Get the preset number of XY Repetitions */
|
|
com_rslt += bmm050_get_rep_XY(&rep_xy);
|
|
/* Get the preset number of Z Repetitions */
|
|
com_rslt += bmm050_get_rep_Z(&rep_z);
|
|
if ((v_data_rate_u8 == BMM050_LOWPOWER_DR) && (
|
|
rep_xy == BMM050_LOWPOWER_REPXY) && (
|
|
rep_z == BMM050_LOWPOWER_REPZ)) {
|
|
*v_presetmode_u8 = BMM050_PRESETMODE_LOWPOWER;
|
|
} else {
|
|
if ((v_data_rate_u8 == BMM050_REGULAR_DR) && (
|
|
rep_xy == BMM050_REGULAR_REPXY) && (
|
|
rep_z == BMM050_REGULAR_REPZ)) {
|
|
*v_presetmode_u8 = BMM050_PRESETMODE_REGULAR;
|
|
} else {
|
|
if ((v_data_rate_u8 == BMM050_HIGHACCURACY_DR) && (
|
|
rep_xy == BMM050_HIGHACCURACY_REPXY) && (
|
|
rep_z == BMM050_HIGHACCURACY_REPZ)) {
|
|
*v_presetmode_u8 =
|
|
BMM050_PRESETMODE_HIGHACCURACY;
|
|
} else {
|
|
if ((v_data_rate_u8 == BMM050_ENHANCED_DR) && (
|
|
rep_xy == BMM050_ENHANCED_REPXY) && (
|
|
rep_z == BMM050_ENHANCED_REPZ)) {
|
|
*v_presetmode_u8 =
|
|
BMM050_PRESETMODE_ENHANCED;
|
|
} else {
|
|
*v_presetmode_u8 =
|
|
E_BMM050_UNDEFINED_MODE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to set the preset modes
|
|
*
|
|
* @note The preset mode setting is
|
|
* depend on Data Rate, XY and Z repetitions
|
|
*
|
|
*
|
|
*
|
|
* @param v_presetmode_u8: The value of selected preset mode
|
|
* value | preset_mode
|
|
* ----------|-----------------
|
|
* 1 | BMM050_PRESETMODE_LOWPOWER
|
|
* 2 | BMM050_PRESETMODE_REGULAR
|
|
* 3 | BMM050_PRESETMODE_HIGHACCURACY
|
|
* 4 | BMM050_PRESETMODE_ENHANCED
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_set_presetmode(u8 v_presetmode_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
|
|
switch (v_presetmode_u8) {
|
|
case BMM050_PRESETMODE_LOWPOWER:
|
|
/* Set the data rate for Low Power mode */
|
|
com_rslt = bmm050_set_data_rate(BMM050_LOWPOWER_DR);
|
|
/* Set the XY-repetitions number for Low Power mode */
|
|
com_rslt += bmm050_set_rep_XY(BMM050_LOWPOWER_REPXY);
|
|
/* Set the Z-repetitions number for Low Power mode */
|
|
com_rslt += bmm050_set_rep_Z(BMM050_LOWPOWER_REPZ);
|
|
break;
|
|
case BMM050_PRESETMODE_REGULAR:
|
|
/* Set the data rate for Regular mode */
|
|
com_rslt = bmm050_set_data_rate(BMM050_REGULAR_DR);
|
|
/* Set the XY-repetitions number for Regular mode */
|
|
com_rslt += bmm050_set_rep_XY(BMM050_REGULAR_REPXY);
|
|
/* Set the Z-repetitions number for Regular mode */
|
|
com_rslt += bmm050_set_rep_Z(BMM050_REGULAR_REPZ);
|
|
break;
|
|
case BMM050_PRESETMODE_HIGHACCURACY:
|
|
/* Set the data rate for High Accuracy mode */
|
|
com_rslt = bmm050_set_data_rate(BMM050_HIGHACCURACY_DR);
|
|
/* Set the XY-repetitions number for High Accuracy mode */
|
|
com_rslt += bmm050_set_rep_XY(BMM050_HIGHACCURACY_REPXY);
|
|
/* Set the Z-repetitions number for High Accuracy mode */
|
|
com_rslt += bmm050_set_rep_Z(BMM050_HIGHACCURACY_REPZ);
|
|
break;
|
|
case BMM050_PRESETMODE_ENHANCED:
|
|
/* Set the data rate for Enhanced Accuracy mode */
|
|
com_rslt = bmm050_set_data_rate(BMM050_ENHANCED_DR);
|
|
/* Set the XY-repetitions number for High Enhanced mode */
|
|
com_rslt += bmm050_set_rep_XY(BMM050_ENHANCED_REPXY);
|
|
/* Set the Z-repetitions number for High Enhanced mode */
|
|
com_rslt += bmm050_set_rep_Z(BMM050_ENHANCED_REPZ);
|
|
break;
|
|
default:
|
|
com_rslt = E_BMM050_OUT_OF_RANGE;
|
|
break;
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to set the functional state
|
|
* in the register 0x4C and 0x4B
|
|
* @note 0x4C bit 1 and 2
|
|
* @note 0x4B bit 0
|
|
*
|
|
*
|
|
* @param v_functional_state_u8: The value of functional mode
|
|
* value | functional state
|
|
* -----------|-------------------
|
|
* 0x00 | BMM050_NORMAL_MODE
|
|
* 0x01 | BMM050_SUSPEND_MODE
|
|
* 0x02 | BMM050_FORCED_MODE
|
|
* 0x03 | BMM050_SLEEP_MODE
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_set_functional_state(
|
|
u8 v_functional_state_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* select the functional state*/
|
|
switch (v_functional_state_u8) {
|
|
/* write the functional state*/
|
|
case BMM050_NORMAL_MODE:
|
|
com_rslt = bmm050_get_power_mode(&v_data_u8);
|
|
if (v_data_u8 == BMM050_OFF) {
|
|
com_rslt += bmm050_set_power_mode(BMM050_ON);
|
|
p_bmm050->delay_msec(
|
|
BMM050_DELAY_SUSPEND_SLEEP);
|
|
}
|
|
com_rslt += p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_OPERATION_MODE__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
v_data_u8 = BMM050_SET_BITSLICE(
|
|
v_data_u8,
|
|
BMM050_CONTROL_OPERATION_MODE,
|
|
BMM050_NORMAL_MODE);
|
|
com_rslt += p_bmm050->BMM050_BUS_WRITE_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_OPERATION_MODE__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
break;
|
|
case BMM050_SUSPEND_MODE:
|
|
com_rslt = bmm050_set_power_mode(BMM050_OFF);
|
|
break;
|
|
case BMM050_FORCED_MODE:
|
|
com_rslt = bmm050_get_power_mode(&v_data_u8);
|
|
if (v_data_u8 == BMM050_OFF) {
|
|
com_rslt += bmm050_set_power_mode(BMM050_ON);
|
|
p_bmm050->delay_msec(
|
|
BMM050_DELAY_SUSPEND_SLEEP);
|
|
}
|
|
com_rslt += p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_OPERATION_MODE__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
v_data_u8 = BMM050_SET_BITSLICE(
|
|
v_data_u8,
|
|
BMM050_CONTROL_OPERATION_MODE, BMM050_ON);
|
|
com_rslt += p_bmm050->BMM050_BUS_WRITE_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_OPERATION_MODE__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
break;
|
|
case BMM050_SLEEP_MODE:
|
|
com_rslt = bmm050_get_power_mode(&v_data_u8);
|
|
if (v_data_u8 == BMM050_OFF) {
|
|
com_rslt += bmm050_set_power_mode(BMM050_ON);
|
|
p_bmm050->delay_msec(
|
|
BMM050_DELAY_SUSPEND_SLEEP);
|
|
}
|
|
com_rslt += p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_OPERATION_MODE__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
v_data_u8 = BMM050_SET_BITSLICE(
|
|
v_data_u8,
|
|
BMM050_CONTROL_OPERATION_MODE,
|
|
BMM050_SLEEP_MODE);
|
|
com_rslt += p_bmm050->BMM050_BUS_WRITE_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_OPERATION_MODE__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
break;
|
|
default:
|
|
com_rslt = E_BMM050_OUT_OF_RANGE;
|
|
break;
|
|
}
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to get the functional state
|
|
* in the register 0x4C bit 1 and 2
|
|
*
|
|
*
|
|
*
|
|
*
|
|
* @param v_functional_state_u8: The value of functional mode
|
|
* value | functional state
|
|
* -----------|--------------------
|
|
* 0x00 | Normal
|
|
* 0x03 | Sleep
|
|
* @note If user set the functional state as Force mode(0x01) and read the
|
|
* register it returns the value as 0x03 that is sleep mode.
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_get_functional_state(
|
|
u8 *v_functional_state_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* read the functional state*/
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_OPERATION_MODE__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
*v_functional_state_u8 = BMM050_GET_BITSLICE(
|
|
v_data_u8, BMM050_CONTROL_OPERATION_MODE);
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API reads compensated Magnetometer
|
|
* data of X,Y,Z values
|
|
* from location 0x42 to 0x49
|
|
*
|
|
*
|
|
*
|
|
*
|
|
* @param mag_data : The data of mag compensated XYZ data
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_read_mag_data_XYZ(
|
|
struct bmm050_mag_data_s16_t *mag_data)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
/* Array holding the mag XYZ and R data
|
|
v_data_u8[0] - X LSB
|
|
v_data_u8[1] - X MSB
|
|
v_data_u8[2] - Y LSB
|
|
v_data_u8[3] - Y MSB
|
|
v_data_u8[4] - Z LSB
|
|
v_data_u8[5] - Z MSB
|
|
v_data_u8[6] - R LSB
|
|
v_data_u8[7] - R MSB
|
|
*/
|
|
u8 v_data_u8[BMM050_DATA_FRAME_SIZE] = {
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE};
|
|
/* structure used to store the mag raw xyz and r data */
|
|
struct {
|
|
s16 raw_data_x;
|
|
s16 raw_data_y;
|
|
s16 raw_data_z;
|
|
u16 raw_data_r;
|
|
} raw_data_xyz_t;
|
|
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* read the mag xyz and r data*/
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_DATA_X_LSB, v_data_u8, BMM050_ALL_DATA_FRAME_LENGTH);
|
|
|
|
if (!com_rslt) {
|
|
/* Reading data for X axis */
|
|
v_data_u8[BMM050_XLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_XLSB_DATA],
|
|
BMM050_DATA_X_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_x = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_XMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_XLSB_DATA]);
|
|
|
|
/* Reading data for Y axis */
|
|
v_data_u8[BMM050_YLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_YLSB_DATA],
|
|
BMM050_DATA_Y_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_y = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_YMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_YLSB_DATA]);
|
|
|
|
/* Reading data for Z axis */
|
|
v_data_u8[BMM050_ZLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_ZLSB_DATA],
|
|
BMM050_DATA_Z_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_z = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_ZMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_07_BITS)
|
|
| v_data_u8[BMM050_ZLSB_DATA]);
|
|
|
|
|
|
/* read the data ready status*/
|
|
mag_data->data_ready = BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_RDYSTAT);
|
|
|
|
|
|
|
|
/* Reading data for Resistance*/
|
|
v_data_u8[BMM050_RLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_R_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_r = (u16)((((u32)
|
|
v_data_u8[BMM050_RMSB_DATA]) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_06_BITS)
|
|
| v_data_u8[BMM050_RLSB_DATA]);
|
|
|
|
|
|
|
|
/* Compensation for X axis */
|
|
mag_data->datax = bmm050_compensate_X(
|
|
raw_data_xyz_t.raw_data_x,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Compensation for Y axis */
|
|
mag_data->datay = bmm050_compensate_Y(
|
|
raw_data_xyz_t.raw_data_y,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Compensation for Z axis */
|
|
mag_data->dataz = bmm050_compensate_Z(
|
|
raw_data_xyz_t.raw_data_z,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Output raw resistance value */
|
|
mag_data->resistance = raw_data_xyz_t.raw_data_r;
|
|
}
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API reads remapped compensated Magnetometer
|
|
* data of X,Y,Z values
|
|
* @note In this function X and Y axis is remapped
|
|
* @note X is read from the address 0x44 & 0x45
|
|
* @note Y is read from the address 0x42 & 0x43
|
|
* @note this API is only applicable for BMX055 sensor
|
|
*
|
|
*
|
|
*
|
|
* @param mag_data : The data of remapped compensated mag xyz data
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_read_bmx055_remapped_mag_data_XYZ(
|
|
struct bmm050_remapped_mag_s16_data_t *mag_data)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
|
|
/* Array holding the mag XYZ and R data
|
|
v_data_u8[0] - X LSB
|
|
v_data_u8[1] - X MSB
|
|
v_data_u8[2] - Y LSB
|
|
v_data_u8[3] - Y MSB
|
|
v_data_u8[4] - Z LSB
|
|
v_data_u8[5] - Z MSB
|
|
v_data_u8[6] - R LSB
|
|
v_data_u8[7] - R MSB
|
|
*/
|
|
u8 v_data_u8[BMM050_DATA_FRAME_SIZE] = {
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE};
|
|
/* structure used to store the mag raw xyz and r data */
|
|
struct {
|
|
s16 raw_data_x;
|
|
s16 raw_data_y;
|
|
s16 raw_data_z;
|
|
u16 raw_data_r;
|
|
} raw_data_xyz_t;
|
|
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_REMAPPED_BMX055_DATA_Y_LSB,
|
|
v_data_u8, BMM050_ALL_DATA_FRAME_LENGTH);
|
|
|
|
if (!com_rslt) {
|
|
/* Reading data for Y axis */
|
|
v_data_u8[BMM050_REMAPPED_YLSB_DATA] =
|
|
BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_REMAPPED_YLSB_DATA],
|
|
BMM050_REMAPPED_BMX055_DATA_Y_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_y = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_REMAPPED_YMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_REMAPPED_YLSB_DATA]);
|
|
|
|
|
|
/* Reading data for X axis */
|
|
v_data_u8[BMM050_REMAPPED_XLSB_DATA] =
|
|
BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_REMAPPED_XLSB_DATA],
|
|
BMM050_REMAPPED_BMX055_DATA_X_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_x = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_REMAPPED_YMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_REMAPPED_XLSB_DATA]);
|
|
raw_data_xyz_t.raw_data_x = -raw_data_xyz_t.raw_data_x;
|
|
|
|
/* Reading data for Z axis */
|
|
v_data_u8[BMM050_ZLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_ZLSB_DATA],
|
|
BMM050_DATA_Z_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_z = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_ZMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_07_BITS)
|
|
| v_data_u8[BMM050_ZLSB_DATA]);
|
|
|
|
|
|
|
|
/* read the data ready status*/
|
|
mag_data->data_ready = BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_RDYSTAT);
|
|
|
|
/* Reading data for Resistance*/
|
|
v_data_u8[BMM050_RLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_R_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_r = (u16)((((u32)
|
|
v_data_u8[BMM050_RMSB_DATA]) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_06_BITS)
|
|
| v_data_u8[BMM050_RLSB_DATA]);
|
|
|
|
|
|
|
|
/* Compensation for X axis */
|
|
mag_data->datax = bmm050_compensate_X(
|
|
raw_data_xyz_t.raw_data_x,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Compensation for Y axis */
|
|
mag_data->datay = bmm050_compensate_Y(
|
|
raw_data_xyz_t.raw_data_y,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Compensation for Z axis */
|
|
mag_data->dataz = bmm050_compensate_Z(
|
|
raw_data_xyz_t.raw_data_z,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Output raw resistance value */
|
|
mag_data->resistance = raw_data_xyz_t.raw_data_r;
|
|
}
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API reads compensated magnetometer
|
|
* data of X,Y,Z values
|
|
* @note The output value of compensated X, Y, Z as s32
|
|
*
|
|
*
|
|
* @param mag_data : The data of compensated XYZ data
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_read_mag_data_XYZ_s32(
|
|
struct bmm050_mag_s32_data_t *mag_data)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
|
|
/* Array holding the mag XYZ and R data
|
|
v_data_u8[0] - X LSB
|
|
v_data_u8[1] - X MSB
|
|
v_data_u8[2] - Y LSB
|
|
v_data_u8[3] - Y MSB
|
|
v_data_u8[4] - Z LSB
|
|
v_data_u8[5] - Z MSB
|
|
v_data_u8[6] - R LSB
|
|
v_data_u8[7] - R MSB
|
|
*/
|
|
u8 v_data_u8[BMM050_DATA_FRAME_SIZE] = {
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE};
|
|
/* structure used to store the mag raw xyz and r data */
|
|
struct {
|
|
s16 raw_data_x;
|
|
s16 raw_data_y;
|
|
s16 raw_data_z;
|
|
u16 raw_data_r;
|
|
} raw_data_xyz_t;
|
|
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_DATA_X_LSB, v_data_u8, BMM050_ALL_DATA_FRAME_LENGTH);
|
|
|
|
if (!com_rslt) {
|
|
/* Reading data for X axis */
|
|
v_data_u8[BMM050_XLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_XLSB_DATA],
|
|
BMM050_DATA_X_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_x = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_XMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_XLSB_DATA]);
|
|
|
|
/* Reading data for Y axis */
|
|
v_data_u8[BMM050_YLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_YLSB_DATA],
|
|
BMM050_DATA_Y_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_y = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_YMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_YLSB_DATA]);
|
|
|
|
/* Reading data for Z axis */
|
|
v_data_u8[BMM050_ZLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_ZLSB_DATA],
|
|
BMM050_DATA_Z_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_z = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_ZMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_07_BITS)
|
|
| v_data_u8[BMM050_ZLSB_DATA]);
|
|
|
|
|
|
/* read the data ready status*/
|
|
mag_data->data_ready = BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_RDYSTAT);
|
|
|
|
/* Reading data for Resistance*/
|
|
v_data_u8[BMM050_RLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_R_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_r = (u16)((((u32)
|
|
v_data_u8[BMM050_RMSB_DATA]) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_06_BITS)
|
|
| v_data_u8[BMM050_RLSB_DATA]);
|
|
|
|
|
|
/* Compensation for X axis */
|
|
mag_data->datax = bmm050_compensate_X_s32(
|
|
raw_data_xyz_t.raw_data_x,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Compensation for Y axis */
|
|
mag_data->datay = bmm050_compensate_Y_s32(
|
|
raw_data_xyz_t.raw_data_y,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Compensation for Z axis */
|
|
mag_data->dataz = bmm050_compensate_Z_s32(
|
|
raw_data_xyz_t.raw_data_z,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Output raw resistance value */
|
|
mag_data->resistance = raw_data_xyz_t.raw_data_r;
|
|
}
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API reads remapped compensated magnetometer
|
|
* data of X,Y,Z values
|
|
* @note The output value of compensated X, Y, Z as s32
|
|
* @note In this function X and Y axis is remapped
|
|
* @note X is read from the address 0x44 & 0x45
|
|
* @note Y is read from the address 0x42 & 0x43
|
|
* @note this API is only applicable for BMX055 sensor
|
|
*
|
|
*
|
|
* @param mag_data : The data of remapped compensated XYZ data
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_read_bmx055_remapped_mag_data_XYZ_s32(
|
|
struct bmm050_remapped_mag_s32_data_t *mag_data)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
/* Array holding the mag XYZ and R data
|
|
v_data_u8[0] - X LSB
|
|
v_data_u8[1] - X MSB
|
|
v_data_u8[2] - Y LSB
|
|
v_data_u8[3] - Y MSB
|
|
v_data_u8[4] - Z LSB
|
|
v_data_u8[5] - Z MSB
|
|
v_data_u8[6] - R LSB
|
|
v_data_u8[7] - R MSB
|
|
*/
|
|
u8 v_data_u8[BMM050_DATA_FRAME_SIZE] = {
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE};
|
|
/* structure used to store the mag raw xyz and r data */
|
|
struct {
|
|
s16 raw_data_x;
|
|
s16 raw_data_y;
|
|
s16 raw_data_z;
|
|
u16 raw_data_r;
|
|
} raw_data_xyz_t;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_REMAPPED_BMX055_DATA_Y_LSB,
|
|
v_data_u8, BMM050_ALL_DATA_FRAME_LENGTH);
|
|
|
|
if (!com_rslt) {
|
|
/* Reading data for Y axis */
|
|
v_data_u8[BMM050_REMAPPED_YLSB_DATA] =
|
|
BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_REMAPPED_YLSB_DATA],
|
|
BMM050_REMAPPED_BMX055_DATA_Y_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_y = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_REMAPPED_YMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_REMAPPED_YLSB_DATA]);
|
|
|
|
|
|
/* Reading data for X axis */
|
|
v_data_u8[BMM050_REMAPPED_XLSB_DATA] =
|
|
BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_REMAPPED_XLSB_DATA],
|
|
BMM050_REMAPPED_BMX055_DATA_X_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_x = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_REMAPPED_XMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_REMAPPED_XLSB_DATA]);
|
|
raw_data_xyz_t.raw_data_x = -raw_data_xyz_t.raw_data_x;
|
|
|
|
/* Reading data for Z axis */
|
|
v_data_u8[BMM050_ZLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_ZLSB_DATA],
|
|
BMM050_DATA_Z_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_z = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_ZMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_07_BITS)
|
|
| v_data_u8[BMM050_ZLSB_DATA]);
|
|
|
|
|
|
/* read the data ready status*/
|
|
mag_data->data_ready = BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_RDYSTAT);
|
|
|
|
|
|
/* Reading data for Resistance*/
|
|
v_data_u8[BMM050_RLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_R_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_r = (u16)((((u32)
|
|
v_data_u8[BMM050_RMSB_DATA]) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_06_BITS)
|
|
| v_data_u8[BMM050_RLSB_DATA]);
|
|
|
|
|
|
|
|
|
|
/* Compensation for X axis */
|
|
mag_data->datax = bmm050_compensate_X_s32(
|
|
raw_data_xyz_t.raw_data_x,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Compensation for Y axis */
|
|
mag_data->datay = bmm050_compensate_Y_s32(
|
|
raw_data_xyz_t.raw_data_y,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Compensation for Z axis */
|
|
mag_data->dataz = bmm050_compensate_Z_s32(
|
|
raw_data_xyz_t.raw_data_z,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Output raw resistance value */
|
|
mag_data->resistance = raw_data_xyz_t.raw_data_r;
|
|
}
|
|
}
|
|
return com_rslt;
|
|
}
|
|
#ifdef ENABLE_FLOAT
|
|
/*!
|
|
* @brief This API reads compensated Magnetometer
|
|
* data of X,Y,Z values
|
|
* @note The output value of compensated X, Y, Z as float
|
|
*
|
|
*
|
|
*
|
|
* @param mag_data : The value of compensated XYZ float data
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_read_mag_data_XYZ_float(
|
|
struct bmm050_mag_data_float_t *mag_data)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
|
|
/* Array holding the mag XYZ and R data
|
|
v_data_u8[0] - X LSB
|
|
v_data_u8[1] - X MSB
|
|
v_data_u8[2] - Y LSB
|
|
v_data_u8[3] - Y MSB
|
|
v_data_u8[4] - Z LSB
|
|
v_data_u8[5] - Z MSB
|
|
v_data_u8[6] - R LSB
|
|
v_data_u8[7] - R MSB
|
|
*/
|
|
u8 v_data_u8[BMM050_DATA_FRAME_SIZE] = {
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE};
|
|
/* structure used to store the mag raw xyz and r data */
|
|
struct {
|
|
s16 raw_data_x;
|
|
s16 raw_data_y;
|
|
s16 raw_data_z;
|
|
s16 raw_data_r;
|
|
} raw_data_xyz_t;
|
|
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_DATA_X_LSB, v_data_u8, BMM050_ALL_DATA_FRAME_LENGTH);
|
|
|
|
if (!com_rslt) {
|
|
/* Reading data for X axis */
|
|
v_data_u8[BMM050_XLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_XLSB_DATA],
|
|
BMM050_DATA_X_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_x = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_XMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_XLSB_DATA]);
|
|
|
|
/* Reading data for Y axis */
|
|
v_data_u8[BMM050_YLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_YLSB_DATA],
|
|
BMM050_DATA_Y_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_y = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_YMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_YLSB_DATA]);
|
|
|
|
/* Reading data for Z axis */
|
|
v_data_u8[BMM050_ZLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_ZLSB_DATA],
|
|
BMM050_DATA_Z_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_z = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_ZMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_07_BITS)
|
|
| v_data_u8[BMM050_ZLSB_DATA]);
|
|
|
|
|
|
|
|
|
|
/* read the data ready status*/
|
|
mag_data->data_ready = BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_RDYSTAT);
|
|
|
|
/* Reading data for Resistance*/
|
|
v_data_u8[BMM050_RLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_R_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_r = (u16)((((u32)
|
|
v_data_u8[BMM050_RMSB_DATA]) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_06_BITS)
|
|
| v_data_u8[BMM050_RLSB_DATA]);
|
|
|
|
|
|
/* Compensation for X axis */
|
|
mag_data->datax = bmm050_compensate_X_float(
|
|
raw_data_xyz_t.raw_data_x,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Compensation for Y axis */
|
|
mag_data->datay = bmm050_compensate_Y_float(
|
|
raw_data_xyz_t.raw_data_y,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Compensation for Z axis */
|
|
mag_data->dataz = bmm050_compensate_Z_float(
|
|
raw_data_xyz_t.raw_data_z,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Output raw resistance value */
|
|
mag_data->resistance = raw_data_xyz_t.raw_data_r;
|
|
}
|
|
}
|
|
return com_rslt;
|
|
}
|
|
#endif
|
|
#ifdef ENABLE_FLOAT
|
|
/*!
|
|
* @brief This API reads remapped compensated Magnetometer
|
|
* data of X,Y,Z values
|
|
* @note The output value of compensated X, Y, Z as float
|
|
*
|
|
* @note In this function X and Y axis is remapped
|
|
* @note X is read from the address 0x44 & 0x45
|
|
* @note Y is read from the address 0x42 & 0x43
|
|
* @note this API is only applicable for BMX055 sensor
|
|
*
|
|
* @param mag_data : The value of remapped compensated XYZ float data
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_read_bmx055_remapped_mag_data_XYZ_float(
|
|
struct bmm050_remapped_mag_data_float_t *mag_data)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
/* Array holding the mag XYZ and R data
|
|
v_data_u8[0] - X LSB
|
|
v_data_u8[1] - X MSB
|
|
v_data_u8[2] - Y LSB
|
|
v_data_u8[3] - Y MSB
|
|
v_data_u8[4] - Z LSB
|
|
v_data_u8[5] - Z MSB
|
|
v_data_u8[6] - R LSB
|
|
v_data_u8[7] - R MSB
|
|
*/
|
|
u8 v_data_u8[BMM050_DATA_FRAME_SIZE] = {
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE};
|
|
/* structure used to store the mag raw xyz and r data */
|
|
struct {
|
|
s16 raw_data_x;
|
|
s16 raw_data_y;
|
|
s16 raw_data_z;
|
|
u16 raw_data_r;
|
|
} raw_data_xyz_t;
|
|
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_REMAPPED_BMX055_DATA_Y_LSB, v_data_u8,
|
|
BMM050_ALL_DATA_FRAME_LENGTH);
|
|
|
|
if (!com_rslt) {
|
|
/* Reading data for Y axis */
|
|
v_data_u8[BMM050_REMAPPED_YLSB_DATA] =
|
|
BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_REMAPPED_YLSB_DATA],
|
|
BMM050_REMAPPED_BMX055_DATA_Y_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_y = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_REMAPPED_YMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_REMAPPED_YLSB_DATA]);
|
|
|
|
/* Reading data for X axis */
|
|
v_data_u8[BMM050_REMAPPED_XLSB_DATA] =
|
|
BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_REMAPPED_XLSB_DATA],
|
|
BMM050_REMAPPED_BMX055_DATA_X_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_x = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_REMAPPED_XMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_REMAPPED_XLSB_DATA]);
|
|
raw_data_xyz_t.raw_data_x = -raw_data_xyz_t.raw_data_x;
|
|
|
|
/* Reading data for Z axis */
|
|
v_data_u8[BMM050_ZLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_ZLSB_DATA],
|
|
BMM050_DATA_Z_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_z = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_ZMSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_07_BITS)
|
|
| v_data_u8[BMM050_ZLSB_DATA]);
|
|
|
|
|
|
|
|
/* read the data ready status*/
|
|
mag_data->data_ready = BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_RDYSTAT);
|
|
|
|
|
|
/* Reading data for Resistance*/
|
|
v_data_u8[BMM050_RLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_R_LSB_BIT);
|
|
raw_data_xyz_t.raw_data_r = (u16)((((u32)
|
|
v_data_u8[BMM050_RMSB_DATA]) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_06_BITS)
|
|
| v_data_u8[BMM050_RLSB_DATA]);
|
|
|
|
|
|
/* Compensation for X axis */
|
|
mag_data->datax = bmm050_compensate_X_float(
|
|
raw_data_xyz_t.raw_data_x,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Compensation for Y axis */
|
|
mag_data->datay = bmm050_compensate_Y_float(
|
|
raw_data_xyz_t.raw_data_y,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Compensation for Z axis */
|
|
mag_data->dataz = bmm050_compensate_Z_float(
|
|
raw_data_xyz_t.raw_data_z,
|
|
raw_data_xyz_t.raw_data_r);
|
|
|
|
/* Output raw resistance value */
|
|
mag_data->resistance = raw_data_xyz_t.raw_data_r;
|
|
}
|
|
}
|
|
return com_rslt;
|
|
}
|
|
#endif
|
|
/*!
|
|
* @brief
|
|
* This API reads the data from
|
|
* the given register
|
|
*
|
|
*
|
|
* @param v_addr_u8 -> Address of the register
|
|
* @param v_data_u8 -> The data from the register
|
|
* @param v_len_u8 -> no of bytes to read
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_read_register(u8 v_addr_u8,
|
|
u8 *v_data_u8, u8 v_len_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
v_addr_u8, v_data_u8, v_len_u8);
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief
|
|
* This API write the data to
|
|
* the given register
|
|
*
|
|
*
|
|
* @param v_addr_u8 -> Address of the register
|
|
* @param v_data_u8 -> The data from the register
|
|
* @param v_len_u8 -> no of bytes to read
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_write_register(u8 v_addr_u8,
|
|
u8 *v_data_u8, u8 v_len_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
com_rslt = p_bmm050->BMM050_BUS_WRITE_FUNC(p_bmm050->dev_addr,
|
|
v_addr_u8, v_data_u8, v_len_u8);
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to set the self test of the sensor
|
|
* in the register 0x4C bit 0
|
|
*
|
|
*
|
|
*
|
|
* @param v_selftest_u8 : The value of selftest
|
|
* @note write 0x01 to start self test
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_set_selftest(u8 v_selftest_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr, BMM050_CONTROL_SELFTEST__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
v_data_u8 = BMM050_SET_BITSLICE(
|
|
v_data_u8, BMM050_CONTROL_SELFTEST, v_selftest_u8);
|
|
com_rslt += p_bmm050->BMM050_BUS_WRITE_FUNC(
|
|
p_bmm050->dev_addr, BMM050_CONTROL_SELFTEST__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to read the selftest of the sensor
|
|
*
|
|
*
|
|
*
|
|
*
|
|
* @param v_selftest_xyz: The self test value of XYZ
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_get_selftest_XYZ(
|
|
u8 *v_selftest_xyz)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8[BMM050_SELFTEST_DATA_SIZE] = {
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE, BMM050_INIT_VALUE};
|
|
u8 v_result_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* read self test*/
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr, BMM050_DATA_X_LSB_TESTX__REG,
|
|
v_data_u8, BMM050_SELFTEST_DATA_LENGTH);
|
|
|
|
if (!com_rslt) {
|
|
v_result_u8 =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_ZLSB_DATA],
|
|
BMM050_DATA_Z_LSB_TESTZ);
|
|
|
|
v_result_u8 = (v_result_u8
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_01_BIT);
|
|
v_result_u8 = (v_result_u8 | BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_YLSB_DATA], BMM050_DATA_Y_LSB_TESTY));
|
|
|
|
v_result_u8 = (v_result_u8
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_01_BIT);
|
|
v_result_u8 = (v_result_u8 | BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_XLSB_DATA], BMM050_DATA_X_LSB_TESTX));
|
|
|
|
*v_selftest_xyz = v_result_u8;
|
|
}
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to set the spi3
|
|
* in the register 0x4B bit 2
|
|
*
|
|
*
|
|
*
|
|
* @param v_value_u8 : the value of spi3
|
|
* value | Description
|
|
* --------|------------
|
|
* 0 | Disable
|
|
* 1 | Enable
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_set_spi3(u8 v_value_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* write spi3 */
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_POWER_CONTROL_SPI3_ENABLE__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
v_data_u8 = BMM050_SET_BITSLICE(v_data_u8,
|
|
BMM050_POWER_CONTROL_SPI3_ENABLE, v_value_u8);
|
|
com_rslt += p_bmm050->BMM050_BUS_WRITE_FUNC(p_bmm050->dev_addr,
|
|
BMM050_POWER_CONTROL_SPI3_ENABLE__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to set the data rate of the sensor
|
|
* in the register 0x4C bit 3 to 5
|
|
*
|
|
*
|
|
*
|
|
* @param v_data_rate_u8 : The value of data rate
|
|
* value | Description
|
|
* -----------|-----------------------
|
|
* 0x00 | BMM050_DATA_RATE_10HZ
|
|
* 0x01 | BMM050_DATA_RATE_02HZ
|
|
* 0x02 | BMM050_DATA_RATE_06HZ
|
|
* 0x03 | BMM050_DATA_RATE_08HZ
|
|
* 0x04 | BMM050_DATA_RATE_15HZ
|
|
* 0x05 | BMM050_DATA_RATE_20HZ
|
|
* 0x06 | BMM050_DATA_RATE_25HZ
|
|
* 0x07 | BMM050_DATA_RATE_30HZ
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_set_data_rate(u8 v_data_rate_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* set the data rate */
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_DATA_RATE__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
v_data_u8 = BMM050_SET_BITSLICE(v_data_u8,
|
|
BMM050_CONTROL_DATA_RATE, v_data_rate_u8);
|
|
com_rslt += p_bmm050->BMM050_BUS_WRITE_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_DATA_RATE__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to get the data rate of the sensor
|
|
* in the register 0x4C bit 3 to 5
|
|
*
|
|
*
|
|
*
|
|
* @param v_data_rate_u8 : The value of data rate
|
|
* value | Description
|
|
* -----------|-----------------------
|
|
* 0x00 | BMM050_DATA_RATE_10HZ
|
|
* 0x01 | BMM050_DATA_RATE_02HZ
|
|
* 0x02 | BMM050_DATA_RATE_06HZ
|
|
* 0x03 | BMM050_DATA_RATE_08HZ
|
|
* 0x04 | BMM050_DATA_RATE_15HZ
|
|
* 0x05 | BMM050_DATA_RATE_20HZ
|
|
* 0x06 | BMM050_DATA_RATE_25HZ
|
|
* 0x07 | BMM050_DATA_RATE_30HZ
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_get_data_rate(u8 *v_data_rate_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_DATA_RATE__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
*v_data_rate_u8 = BMM050_GET_BITSLICE(v_data_u8,
|
|
BMM050_CONTROL_DATA_RATE);
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to perform the
|
|
* advanced self test
|
|
*
|
|
*
|
|
*
|
|
* @param v_diff_z_s16 : The output of advance self test
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_perform_advanced_selftest(
|
|
s16 *v_diff_z_s16)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
s16 result_positive = BMM050_INIT_VALUE;
|
|
s16 result_negative = BMM050_INIT_VALUE;
|
|
struct bmm050_mag_data_s16_t mag_data = {BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE};
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* set sleep mode to prepare for forced measurement.
|
|
* If sensor is off, this will turn it on
|
|
* and respect needed delays. */
|
|
com_rslt = bmm050_set_functional_state(BMM050_SLEEP_MODE);
|
|
|
|
/* set normal accuracy mode */
|
|
com_rslt += bmm050_set_rep_Z(BMM050_LOWPOWER_REPZ);
|
|
/* 14 repetitions Z in normal accuracy mode */
|
|
|
|
/* disable X, Y channel */
|
|
com_rslt += bmm050_set_control_measurement_x(
|
|
BMM050_CHANNEL_DISABLE);
|
|
com_rslt += bmm050_set_control_measurement_y(
|
|
BMM050_CHANNEL_DISABLE);
|
|
|
|
/* enable positive current and force a
|
|
* measurement with positive field */
|
|
com_rslt += bmm050_set_advanced_selftest(
|
|
BMM050_ADVANCED_SELFTEST_POSITIVE);
|
|
com_rslt += bmm050_set_functional_state(BMM050_FORCED_MODE);
|
|
/* wait for measurement to complete */
|
|
p_bmm050->delay_msec(BMM050_SELFTEST_DELAY);
|
|
|
|
/* read result from positive field measurement */
|
|
com_rslt += bmm050_read_mag_data_XYZ(&mag_data);
|
|
result_positive = mag_data.dataz;
|
|
|
|
/* enable negative current and force a
|
|
* measurement with negative field */
|
|
com_rslt += bmm050_set_advanced_selftest(
|
|
BMM050_ADVANCED_SELFTEST_NEGATIVE);
|
|
com_rslt += bmm050_set_functional_state(BMM050_FORCED_MODE);
|
|
p_bmm050->delay_msec(BMM050_SELFTEST_DELAY);
|
|
/* wait for measurement to complete */
|
|
|
|
/* read result from negative field measurement */
|
|
com_rslt += bmm050_read_mag_data_XYZ(&mag_data);
|
|
result_negative = mag_data.dataz;
|
|
|
|
/* turn off self test current */
|
|
com_rslt += bmm050_set_advanced_selftest(
|
|
BMM050_ADVANCED_SELFTEST_OFF);
|
|
|
|
/* enable X, Y channel */
|
|
com_rslt += bmm050_set_control_measurement_x(
|
|
BMM050_CHANNEL_ENABLE);
|
|
com_rslt += bmm050_set_control_measurement_y(
|
|
BMM050_CHANNEL_ENABLE);
|
|
|
|
/* write out difference in positive and negative field.
|
|
* This should be ~ 200 mT = 3200 LSB */
|
|
*v_diff_z_s16 = (result_positive - result_negative);
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to get the trim values
|
|
*
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_init_trim_registers(void)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8[BMM050_TRIM_DATA_SIZE] = {
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE};
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_DIG_X1, (u8 *)&p_bmm050->dig_x1,
|
|
BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
com_rslt += p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_DIG_Y1, (u8 *)&p_bmm050->dig_y1,
|
|
BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
com_rslt += p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_DIG_X2, (u8 *)&p_bmm050->dig_x2,
|
|
BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
com_rslt += p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_DIG_Y2, (u8 *)&p_bmm050->dig_y2,
|
|
BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
com_rslt += p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_DIG_XY1, (u8 *)&p_bmm050->dig_xy1,
|
|
BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
com_rslt += p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_DIG_XY2, (u8 *)&p_bmm050->dig_xy2,
|
|
BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
|
|
/* shorts can not be recast into (u8*)
|
|
* due to possible mix up between trim data
|
|
* arrangement and memory arrangement */
|
|
|
|
com_rslt += p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_DIG_Z1_LSB, v_data_u8, BMM050_TRIM_DATA_LENGTH);
|
|
p_bmm050->dig_z1 = (u16)((((u32)((u8)
|
|
v_data_u8[BMM050_TRIM_DIG_Z1_MSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_08_BITS)
|
|
| v_data_u8[BMM050_TRIM_DIG_Z1_LSB_DATA]);
|
|
|
|
com_rslt += p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_DIG_Z2_LSB, v_data_u8, BMM050_TRIM_DATA_LENGTH);
|
|
p_bmm050->dig_z2 = (s16)((((s32)(
|
|
(s8)v_data_u8[BMM050_TRIM_DIG_Z2_MSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_08_BITS)
|
|
| v_data_u8[BMM050_TRIM_DIG_Z2_LSB_DATA]);
|
|
|
|
com_rslt += p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_DIG_Z3_LSB, v_data_u8, BMM050_TRIM_DATA_LENGTH);
|
|
p_bmm050->dig_z3 = (s16)((((s32)(
|
|
(s8)v_data_u8[BMM050_TRIM_DIG_Z3_MSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_08_BITS)
|
|
| v_data_u8[BMM050_TRIM_DIG_Z3_LSB_DATA]);
|
|
|
|
com_rslt += p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_DIG_Z4_LSB, v_data_u8, BMM050_TRIM_DATA_LENGTH);
|
|
p_bmm050->dig_z4 = (s16)((((s32)(
|
|
(s8)v_data_u8[BMM050_TRIM_DIG_Z4_MSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_08_BITS)
|
|
| v_data_u8[BMM050_TRIM_DIG_Z4_LSB_DATA]);
|
|
|
|
com_rslt += p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_DIG_XYZ1_LSB, v_data_u8, BMM050_TRIM_DATA_LENGTH);
|
|
v_data_u8[BMM050_TRIM_DIG_XYZ1_MSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_TRIM_DIG_XYZ1_MSB_DATA],
|
|
BMM050_DIG_XYZ1_MSB);
|
|
p_bmm050->dig_xyz1 = (u16)((((u32)
|
|
((u8)v_data_u8[BMM050_TRIM_DIG_XYZ1_MSB_DATA])) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_08_BITS)
|
|
| v_data_u8[BMM050_TRIM_DIG_XYZ1_LSB_DATA]);
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to set the advanced self test
|
|
* in the register 0x4C bit 6 and 7
|
|
*
|
|
*
|
|
*
|
|
* @param v_advanced_selftest_u8 : The output value of advanced self test
|
|
* value | Status
|
|
* -------------|-------------------
|
|
* 0 | BMM050_ADVANCED_SELFTEST_OFF
|
|
* 2 | BMM050_ADVANCED_SELFTEST_NEGATIVE
|
|
* 3 | BMM050_ADVANCED_SELFTEST_POSITIVE
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_set_advanced_selftest(
|
|
u8 v_advanced_selftest_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
switch (v_advanced_selftest_u8) {
|
|
/* perform advanced self test*/
|
|
case BMM050_ADVANCED_SELFTEST_OFF:
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_ADVANCED_SELFTEST__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
if (!com_rslt) {
|
|
v_data_u8 = BMM050_SET_BITSLICE(
|
|
v_data_u8,
|
|
BMM050_CONTROL_ADVANCED_SELFTEST,
|
|
BMM050_ADVANCED_SELFTEST_OFF);
|
|
|
|
com_rslt += p_bmm050->BMM050_BUS_WRITE_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_ADVANCED_SELFTEST__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
}
|
|
break;
|
|
case BMM050_ADVANCED_SELFTEST_POSITIVE:
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_ADVANCED_SELFTEST__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
if (!com_rslt) {
|
|
v_data_u8 = BMM050_SET_BITSLICE(
|
|
v_data_u8,
|
|
BMM050_CONTROL_ADVANCED_SELFTEST,
|
|
BMM050_ADVANCED_SELFTEST_POSITIVE);
|
|
|
|
com_rslt += p_bmm050->BMM050_BUS_WRITE_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_ADVANCED_SELFTEST__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
}
|
|
break;
|
|
case BMM050_ADVANCED_SELFTEST_NEGATIVE:
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_ADVANCED_SELFTEST__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
if (!com_rslt) {
|
|
v_data_u8 = BMM050_SET_BITSLICE(
|
|
v_data_u8,
|
|
BMM050_CONTROL_ADVANCED_SELFTEST,
|
|
BMM050_ADVANCED_SELFTEST_NEGATIVE);
|
|
com_rslt += p_bmm050->BMM050_BUS_WRITE_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_CONTROL_ADVANCED_SELFTEST__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to get the advanced self test
|
|
* in the register 0x4C bit 6 and 7
|
|
*
|
|
*
|
|
*
|
|
* @param v_advanced_selftest_u8 : The output value of advanced self test
|
|
* value | Status
|
|
* -------------|-------------------
|
|
* 0 | BMM050_ADVANCED_SELFTEST_OFF
|
|
* 2 | BMM050_ADVANCED_SELFTEST_NEGATIVE
|
|
* 3 | BMM050_ADVANCED_SELFTEST_POSITIVE
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_get_advanced_selftest(
|
|
u8 *v_advanced_selftest_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* read advanced self test */
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_CONTROL_ADVANCED_SELFTEST__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
if (!com_rslt) {
|
|
*v_advanced_selftest_u8 = BMM050_GET_BITSLICE(v_data_u8,
|
|
BMM050_CONTROL_ADVANCED_SELFTEST);
|
|
}
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to get the power control bit
|
|
* in the register 0x4B bit 0
|
|
*
|
|
*
|
|
*
|
|
* @param v_power_mode_u8 : The value of power control bit enable
|
|
* value | status
|
|
* -----------|------------
|
|
* 0 | Disable the power control bit
|
|
* 1 | Enable the power control bit
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_get_power_mode(u8 *v_power_mode_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* read power control bit */
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_POWER_CONTROL_POWER_CONTROL_BIT__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
if (!com_rslt) {
|
|
*v_power_mode_u8 = BMM050_GET_BITSLICE(v_data_u8,
|
|
BMM050_POWER_CONTROL_POWER_CONTROL_BIT);
|
|
}
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to set the power control bit
|
|
* in the register 0x4B bit 0
|
|
*
|
|
*
|
|
*
|
|
* @param v_power_mode_u8 : The value of power control bit enable
|
|
* value | status
|
|
* -----------|------------
|
|
* 0 | Disable the power control bit
|
|
* 1 | Enable the power control bit
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_set_power_mode(u8 v_power_mode_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* write power control bit*/
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_POWER_CONTROL_POWER_CONTROL_BIT__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
v_data_u8 = BMM050_SET_BITSLICE(v_data_u8,
|
|
BMM050_POWER_CONTROL_POWER_CONTROL_BIT, v_power_mode_u8);
|
|
com_rslt += p_bmm050->BMM050_BUS_WRITE_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_POWER_CONTROL_POWER_CONTROL_BIT__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to get the x and y
|
|
* repetition in the register 0x51 bit 0 to 7
|
|
*
|
|
*
|
|
*
|
|
* @param v_rep_xy_u8 : The value of x and y repetitions
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_get_rep_XY(
|
|
u8 *v_rep_xy_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* read XY repetitions*/
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_REP_XY,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
*v_rep_xy_u8 = v_data_u8;
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to set the x and y
|
|
* repetition in the register 0x51 bit 0 to 7
|
|
*
|
|
*
|
|
*
|
|
* @param v_rep_xy_u8 : The value of x and y repetitions
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_set_rep_XY(
|
|
u8 v_rep_xy_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* write XY repetitions*/
|
|
v_data_u8 = v_rep_xy_u8;
|
|
com_rslt = p_bmm050->BMM050_BUS_WRITE_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_REP_XY,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to get the z repetition in the
|
|
* register 0x52 bit 0 to 7
|
|
*
|
|
*
|
|
*
|
|
* @param v_rep_z_u8 : The value of z repetitions
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_get_rep_Z(
|
|
u8 *v_rep_z_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* read Z repetitions*/
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_REP_Z,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
*v_rep_z_u8 = v_data_u8;
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to set the z repetition in the
|
|
* register 0x52 bit 0 to 7
|
|
*
|
|
*
|
|
*
|
|
* @param v_rep_z_u8 : The value of z repetitions
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_set_rep_Z(
|
|
u8 v_rep_z_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* write Z repetitions*/
|
|
v_data_u8 = v_rep_z_u8;
|
|
com_rslt = p_bmm050->BMM050_BUS_WRITE_FUNC(p_bmm050->dev_addr,
|
|
BMM050_REP_Z, &v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to get the compensated X data
|
|
* the out put of X as s16
|
|
*
|
|
*
|
|
*
|
|
* @param mag_data_x : The value of raw X data
|
|
* @param data_r : The value of R data
|
|
*
|
|
* @return results of compensated X data value output as s16
|
|
*
|
|
*/
|
|
s16 bmm050_compensate_X(s16 mag_data_x, u16 data_r)
|
|
{
|
|
s16 inter_retval = BMM050_INIT_VALUE;
|
|
/* no overflow */
|
|
if (mag_data_x != BMM050_FLIP_OVERFLOW_ADCVAL) {
|
|
if ((data_r != BMM050_INIT_VALUE)
|
|
&& (p_bmm050->dig_xyz1 != BMM050_INIT_VALUE)) {
|
|
inter_retval = ((s16)(((u16)
|
|
((((s32)p_bmm050->dig_xyz1)
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_14_BITS)/
|
|
(data_r != BMM050_INIT_VALUE ?
|
|
data_r : p_bmm050->dig_xyz1))) -
|
|
((u16)0x4000)));
|
|
} else {
|
|
inter_retval = BMM050_OVERFLOW_OUTPUT;
|
|
return inter_retval;
|
|
}
|
|
inter_retval = ((s16)((((s32)mag_data_x) *
|
|
((((((((s32)p_bmm050->dig_xy2) *
|
|
((((s32)inter_retval) *
|
|
((s32)inter_retval)) >>
|
|
BMM050_SHIFT_BIT_POSITION_BY_07_BITS)) +
|
|
(((s32)inter_retval) *
|
|
((s32)(((s16)p_bmm050->dig_xy1)
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_07_BITS))))
|
|
>> BMM050_SHIFT_BIT_POSITION_BY_09_BITS) +
|
|
((s32)0x100000)) *
|
|
((s32)(((s16)p_bmm050->dig_x2) +
|
|
((s16)0xA0)))) >>
|
|
BMM050_SHIFT_BIT_POSITION_BY_12_BITS))
|
|
>> BMM050_SHIFT_BIT_POSITION_BY_13_BITS)) +
|
|
(((s16)p_bmm050->dig_x1)
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_03_BITS);
|
|
} else {
|
|
/* overflow */
|
|
inter_retval = BMM050_OVERFLOW_OUTPUT;
|
|
}
|
|
return inter_retval;
|
|
}
|
|
/*!
|
|
* @brief This API used to get the compensated X data
|
|
* the out put of X as s32
|
|
*
|
|
*
|
|
*
|
|
* @param mag_data_x : The value of raw X data
|
|
* @param data_r : The value of R data
|
|
*
|
|
* @return results of compensated X data value output as s32
|
|
*
|
|
*/
|
|
s32 bmm050_compensate_X_s32(s16 mag_data_x, u16 data_r)
|
|
{
|
|
s32 retval = BMM050_INIT_VALUE;
|
|
|
|
retval = bmm050_compensate_X(mag_data_x, data_r);
|
|
if (retval == (s32)BMM050_OVERFLOW_OUTPUT)
|
|
retval = BMM050_OVERFLOW_OUTPUT_S32;
|
|
return retval;
|
|
}
|
|
#ifdef ENABLE_FLOAT
|
|
/*!
|
|
* @brief This API used to get the compensated X data
|
|
* the out put of X as float
|
|
*
|
|
*
|
|
*
|
|
* @param mag_data_x : The value of raw X data
|
|
* @param data_r : The value of R data
|
|
*
|
|
* @return results of compensated X data value output as float
|
|
*
|
|
*/
|
|
float bmm050_compensate_X_float(s16 mag_data_x, u16 data_r)
|
|
{
|
|
float inter_retval = BMM050_INIT_VALUE;
|
|
|
|
if (mag_data_x != BMM050_FLIP_OVERFLOW_ADCVAL /* no overflow */
|
|
) {
|
|
if ((data_r != BMM050_INIT_VALUE)
|
|
&& (p_bmm050->dig_xyz1 != BMM050_INIT_VALUE)) {
|
|
inter_retval = ((((float)p_bmm050->dig_xyz1)
|
|
* 16384.0 / data_r) - 16384.0);
|
|
} else {
|
|
inter_retval = BMM050_OVERFLOW_OUTPUT_FLOAT;
|
|
return inter_retval;
|
|
}
|
|
inter_retval = (((mag_data_x * ((((((float)p_bmm050->dig_xy2) *
|
|
(inter_retval*inter_retval /
|
|
268435456.0) +
|
|
inter_retval * ((float)p_bmm050->dig_xy1)
|
|
/ 16384.0)) + 256.0) *
|
|
(((float)p_bmm050->dig_x2) + 160.0)))
|
|
/ 8192.0)
|
|
+ (((float)p_bmm050->dig_x1) *
|
|
8.0)) / 16.0;
|
|
} else {
|
|
inter_retval = BMM050_OVERFLOW_OUTPUT_FLOAT;
|
|
}
|
|
return inter_retval;
|
|
}
|
|
#endif
|
|
/*!
|
|
* @brief This API used to get the compensated Y data
|
|
* the out put of Y as s16
|
|
*
|
|
*
|
|
*
|
|
* @param mag_data_y : The value of raw Y data
|
|
* @param data_r : The value of R data
|
|
*
|
|
* @return results of compensated Y data value output as s16
|
|
*
|
|
*/
|
|
s16 bmm050_compensate_Y(s16 mag_data_y, u16 data_r)
|
|
{
|
|
s16 inter_retval = BMM050_INIT_VALUE;
|
|
/* no overflow */
|
|
if (mag_data_y != BMM050_FLIP_OVERFLOW_ADCVAL) {
|
|
if ((data_r != BMM050_INIT_VALUE)
|
|
&& (p_bmm050->dig_xyz1 != BMM050_INIT_VALUE)) {
|
|
inter_retval = ((s16)(((u16)(((
|
|
(s32)p_bmm050->dig_xyz1)
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_14_BITS)/
|
|
(data_r != BMM050_INIT_VALUE ?
|
|
data_r : p_bmm050->dig_xyz1))) -
|
|
((u16)0x4000)));
|
|
} else {
|
|
inter_retval = BMM050_OVERFLOW_OUTPUT;
|
|
return inter_retval;
|
|
}
|
|
inter_retval = ((s16)((((s32)mag_data_y) * ((((((((s32)
|
|
p_bmm050->dig_xy2) * ((((s32) inter_retval) *
|
|
((s32)inter_retval)) >>
|
|
BMM050_SHIFT_BIT_POSITION_BY_07_BITS))
|
|
+ (((s32)inter_retval) *
|
|
((s32)(((s16)p_bmm050->dig_xy1) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_07_BITS))))
|
|
>> BMM050_SHIFT_BIT_POSITION_BY_09_BITS) +
|
|
((s32)0x100000)) *
|
|
((s32)(((s16)p_bmm050->dig_y2)
|
|
+ ((s16)0xA0))))
|
|
>> BMM050_SHIFT_BIT_POSITION_BY_12_BITS))
|
|
>> BMM050_SHIFT_BIT_POSITION_BY_13_BITS)) +
|
|
(((s16)p_bmm050->dig_y1)
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_03_BITS);
|
|
} else {
|
|
/* overflow */
|
|
inter_retval = BMM050_OVERFLOW_OUTPUT;
|
|
}
|
|
return inter_retval;
|
|
}
|
|
/*!
|
|
* @brief This API used to get the compensated Y data
|
|
* the out put of Y as s32
|
|
*
|
|
*
|
|
*
|
|
* @param mag_data_y : The value of raw Y data
|
|
* @param data_r : The value of R data
|
|
*
|
|
* @return results of compensated Y data value output as s32
|
|
*
|
|
*/
|
|
s32 bmm050_compensate_Y_s32(s16 mag_data_y, u16 data_r)
|
|
{
|
|
s32 retval = BMM050_INIT_VALUE;
|
|
|
|
retval = bmm050_compensate_Y(mag_data_y, data_r);
|
|
if (retval == BMM050_OVERFLOW_OUTPUT)
|
|
retval = BMM050_OVERFLOW_OUTPUT_S32;
|
|
return retval;
|
|
}
|
|
#ifdef ENABLE_FLOAT
|
|
/*!
|
|
* @brief This API used to get the compensated Y data
|
|
* the out put of Y as float
|
|
*
|
|
*
|
|
*
|
|
* @param mag_data_y : The value of raw Y data
|
|
* @param data_r : The value of R data
|
|
*
|
|
* @return results of compensated Y data value output as float
|
|
*
|
|
*/
|
|
float bmm050_compensate_Y_float(s16 mag_data_y, u16 data_r)
|
|
{
|
|
float inter_retval = BMM050_INIT_VALUE;
|
|
|
|
if (mag_data_y != BMM050_FLIP_OVERFLOW_ADCVAL /* no overflow */
|
|
) {
|
|
if ((data_r != BMM050_INIT_VALUE)
|
|
&& (p_bmm050->dig_xyz1 != BMM050_INIT_VALUE)) {
|
|
inter_retval = ((((float)p_bmm050->dig_xyz1)
|
|
* 16384.0
|
|
/data_r) - 16384.0);
|
|
} else {
|
|
inter_retval = BMM050_OVERFLOW_OUTPUT_FLOAT;
|
|
return inter_retval;
|
|
}
|
|
inter_retval = (((mag_data_y * ((((((float)p_bmm050->dig_xy2) *
|
|
(inter_retval*inter_retval
|
|
/ 268435456.0) +
|
|
inter_retval * ((float)p_bmm050->dig_xy1)
|
|
/ 16384.0)) +
|
|
256.0) *
|
|
(((float)p_bmm050->dig_y2) + 160.0)))
|
|
/ 8192.0) +
|
|
(((float)p_bmm050->dig_y1) * 8.0))
|
|
/ 16.0;
|
|
} else {
|
|
/* overflow, set output to 0.0f */
|
|
inter_retval = BMM050_OVERFLOW_OUTPUT_FLOAT;
|
|
}
|
|
return inter_retval;
|
|
}
|
|
#endif
|
|
/*!
|
|
* @brief This API used to get the compensated Z data
|
|
* the out put of Z as s16
|
|
*
|
|
*
|
|
*
|
|
* @param mag_data_z : The value of raw Z data
|
|
* @param data_r : The value of R data
|
|
*
|
|
* @return results of compensated Z data value output as s16
|
|
*
|
|
*/
|
|
s16 bmm050_compensate_Z(s16 mag_data_z, u16 data_r)
|
|
{
|
|
s32 retval = BMM050_INIT_VALUE;
|
|
|
|
if ((mag_data_z != BMM050_HALL_OVERFLOW_ADCVAL) /* no overflow */
|
|
) {
|
|
if ((p_bmm050->dig_z2 != BMM050_INIT_VALUE)
|
|
&& (p_bmm050->dig_z1 != BMM050_INIT_VALUE)
|
|
&& (p_bmm050->dig_z3 != BMM050_INIT_VALUE)
|
|
&& (data_r != BMM050_INIT_VALUE) &&
|
|
(p_bmm050->dig_xyz1 != BMM050_INIT_VALUE)) {
|
|
retval = (((((s32)(mag_data_z - p_bmm050->dig_z4))
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_15_BITS) -
|
|
((((s32)p_bmm050->dig_z3) * ((s32)(((s16)data_r) -
|
|
((s16) p_bmm050->dig_xyz1))))
|
|
>> BMM050_SHIFT_BIT_POSITION_BY_02_BITS))/
|
|
(p_bmm050->dig_z2 + ((s16)(((((s32)
|
|
p_bmm050->dig_z1) * ((((s16)data_r)
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_01_BIT)))+
|
|
(1 << BMM050_SHIFT_BIT_POSITION_BY_15_BITS))
|
|
>> BMM050_SHIFT_BIT_POSITION_BY_16_BITS))));
|
|
} else {
|
|
retval = BMM050_OVERFLOW_OUTPUT;
|
|
return retval;
|
|
}
|
|
/* saturate result to +/- 2 microTesla */
|
|
if (retval > BMM050_POSITIVE_SATURATION_Z) {
|
|
retval = BMM050_POSITIVE_SATURATION_Z;
|
|
} else {
|
|
if (retval < BMM050_NEGATIVE_SATURATION_Z)
|
|
retval = BMM050_NEGATIVE_SATURATION_Z;
|
|
}
|
|
} else {
|
|
/* overflow */
|
|
retval = BMM050_OVERFLOW_OUTPUT;
|
|
}
|
|
return (s16)retval;
|
|
}
|
|
/*!
|
|
* @brief This API used to get the compensated Z data
|
|
* the out put of Z as s32
|
|
*
|
|
*
|
|
*
|
|
* @param mag_data_z : The value of raw Z data
|
|
* @param data_r : The value of R data
|
|
*
|
|
* @return results of compensated Z data value output as s32
|
|
*
|
|
*/
|
|
s32 bmm050_compensate_Z_s32(s16 mag_data_z, u16 data_r)
|
|
{
|
|
s32 retval = BMM050_INIT_VALUE;
|
|
|
|
if (mag_data_z != BMM050_HALL_OVERFLOW_ADCVAL) {
|
|
if ((p_bmm050->dig_z2 != BMM050_INIT_VALUE)
|
|
&& (p_bmm050->dig_z1 != BMM050_INIT_VALUE)
|
|
&& (p_bmm050->dig_z3 != BMM050_INIT_VALUE)
|
|
&& (data_r != BMM050_INIT_VALUE) &&
|
|
(p_bmm050->dig_xyz1 != BMM050_INIT_VALUE)) {
|
|
retval = (((((s32)(mag_data_z
|
|
- p_bmm050->dig_z4))
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_15_BITS) -
|
|
((((s32)p_bmm050->dig_z3) *
|
|
((s32)(((s16)data_r) -
|
|
((s16)p_bmm050->dig_xyz1))))
|
|
>> BMM050_SHIFT_BIT_POSITION_BY_02_BITS))/
|
|
(p_bmm050->dig_z2 +
|
|
((s16)(((((s32)p_bmm050->dig_z1) *
|
|
((((s16)data_r)
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_01_BIT))) +
|
|
(1 << BMM050_SHIFT_BIT_POSITION_BY_15_BITS))
|
|
>> BMM050_SHIFT_BIT_POSITION_BY_16_BITS))));
|
|
} else {
|
|
retval = BMM050_OVERFLOW_OUTPUT_S32;
|
|
return retval;
|
|
}
|
|
} else {
|
|
retval = BMM050_OVERFLOW_OUTPUT_S32;
|
|
}
|
|
return retval;
|
|
}
|
|
#ifdef ENABLE_FLOAT
|
|
/*!
|
|
* @brief This API used to get the compensated Z data
|
|
* the out put of Z as float
|
|
*
|
|
*
|
|
*
|
|
* @param mag_data_z : The value of raw Z data
|
|
* @param data_r : The value of R data
|
|
*
|
|
* @return results of compensated Z data value output as float
|
|
*
|
|
*/
|
|
float bmm050_compensate_Z_float (s16 mag_data_z, u16 data_r)
|
|
{
|
|
float inter_retval = BMM050_INIT_VALUE;
|
|
/* no overflow */
|
|
if (mag_data_z != BMM050_HALL_OVERFLOW_ADCVAL) {
|
|
if ((p_bmm050->dig_z2 != BMM050_INIT_VALUE)
|
|
&& (p_bmm050->dig_z1 != BMM050_INIT_VALUE)
|
|
&& (p_bmm050->dig_z3 != BMM050_INIT_VALUE)
|
|
&& (p_bmm050->dig_xyz1 != BMM050_INIT_VALUE)
|
|
&& (data_r != BMM050_INIT_VALUE)) {
|
|
inter_retval = ((((((float)mag_data_z)-
|
|
((float)p_bmm050->dig_z4)) * 131072.0)-
|
|
(((float)p_bmm050->dig_z3)*(((float)data_r)
|
|
-((float)p_bmm050->dig_xyz1))))
|
|
/((((float)p_bmm050->dig_z2)+
|
|
((float)p_bmm050->dig_z1)*((float)data_r) /
|
|
32768.0) * 4.0)) / 16.0;
|
|
}
|
|
} else {
|
|
/* overflow, set output to 0.0f */
|
|
inter_retval = BMM050_OVERFLOW_OUTPUT_FLOAT;
|
|
}
|
|
return inter_retval;
|
|
}
|
|
#endif
|
|
/*!
|
|
* @brief This API used to set the control measurement
|
|
* X data in the register 0x4E bit 3
|
|
*
|
|
*
|
|
* @param v_enable_disable_u8: The value of control measurement-x
|
|
* value | Status
|
|
* --------|----------
|
|
* 1 | ENABLE
|
|
* 0 | DISABLE
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_set_control_measurement_x(
|
|
u8 v_enable_disable_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* read control measurement */
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_SENS_CONTROL_CHANNELX__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
v_data_u8 = BMM050_SET_BITSLICE(v_data_u8,
|
|
BMM050_SENS_CONTROL_CHANNELX,
|
|
v_enable_disable_u8);
|
|
com_rslt += p_bmm050->BMM050_BUS_WRITE_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_SENS_CONTROL_CHANNELX__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used to set the control measurement
|
|
* Y data in the register 0x4E bit 4
|
|
*
|
|
*
|
|
* @param v_enable_disable_u8: The value of control measurement-y
|
|
* value | Status
|
|
* --------|----------
|
|
* 1 | ENABLE
|
|
* 0 | DISABLE
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_set_control_measurement_y(
|
|
u8 v_enable_disable_u8)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
/* read control measurement */
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_SENS_CONTROL_CHANNELY__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
v_data_u8 = BMM050_SET_BITSLICE(
|
|
v_data_u8,
|
|
BMM050_SENS_CONTROL_CHANNELY,
|
|
v_enable_disable_u8);
|
|
com_rslt += p_bmm050->BMM050_BUS_WRITE_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_SENS_CONTROL_CHANNELY__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API used reset the register values to default
|
|
* in the register 0x4B
|
|
*
|
|
*
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_soft_rst(void)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
u8 v_data_u8 = BMM050_INIT_VALUE;
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
v_data_u8 = BMM050_ON;
|
|
/* write soft rest */
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_POWER_CONTROL_SOFT_RST_7__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
v_data_u8 = BMM050_SET_BITSLICE(v_data_u8,
|
|
BMM050_POWER_CONTROL_SOFT_RST_7,
|
|
BMM050_SOFT_RESET7_ON);
|
|
com_rslt += p_bmm050->BMM050_BUS_WRITE_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_POWER_CONTROL_SOFT_RST_7__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
|
|
com_rslt += p_bmm050->BMM050_BUS_READ_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_POWER_CONTROL_SOFT_RST_1__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
v_data_u8 = BMM050_SET_BITSLICE(v_data_u8,
|
|
BMM050_POWER_CONTROL_SOFT_RST_1,
|
|
BMM050_SOFT_RESET1_ON);
|
|
com_rslt += p_bmm050->BMM050_BUS_WRITE_FUNC(
|
|
p_bmm050->dev_addr,
|
|
BMM050_POWER_CONTROL_SOFT_RST_1__REG,
|
|
&v_data_u8, BMM050_GEN_READ_WRITE_DATA_LENGTH);
|
|
|
|
p_bmm050->delay_msec(BMM050_DELAY_SOFTRESET);
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API reads Magnetometer
|
|
* raw data of X,Y,Z values and RHALL values
|
|
* from location 0x42 to 0x49
|
|
*
|
|
*
|
|
*
|
|
*
|
|
* @param mag_data : The data of raw XYZ data
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_get_raw_xyz(
|
|
struct bmm050_mag_data_s16_t *mag_data)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
/* Array holding the mag XYZ and R data
|
|
v_data_u8[0] - X LSB
|
|
v_data_u8[1] - X MSB
|
|
v_data_u8[2] - Y LSB
|
|
v_data_u8[3] - Y MSB
|
|
v_data_u8[4] - Z LSB
|
|
v_data_u8[5] - Z MSB
|
|
v_data_u8[6] - R LSB
|
|
v_data_u8[7] - R MSB
|
|
*/
|
|
u8 v_data_u8[BMM050_DATA_FRAME_SIZE] = {
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE};
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_DATA_X_LSB, v_data_u8, BMM050_ALL_DATA_FRAME_LENGTH);
|
|
if (!com_rslt) {
|
|
/* x data */
|
|
v_data_u8[BMM050_XLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_XLSB_DATA],
|
|
BMM050_DATA_X_LSB_BIT);
|
|
mag_data->datax = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_XMSB_DATA]))
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_XLSB_DATA]);
|
|
/* y data */
|
|
v_data_u8[BMM050_YLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_YLSB_DATA],
|
|
BMM050_DATA_Y_LSB_BIT);
|
|
mag_data->datay = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_YMSB_DATA]))
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_YLSB_DATA]);
|
|
/* z data */
|
|
v_data_u8[BMM050_ZLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_ZLSB_DATA],
|
|
BMM050_DATA_Z_LSB_BIT);
|
|
mag_data->dataz = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_ZMSB_DATA]))
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_07_BITS)
|
|
| v_data_u8[BMM050_ZLSB_DATA]);
|
|
|
|
|
|
/* read the data ready status*/
|
|
mag_data->data_ready = BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_RDYSTAT);
|
|
|
|
|
|
|
|
|
|
/* r data */
|
|
v_data_u8[BMM050_RLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_R_LSB_BIT);
|
|
mag_data->resistance = (u16)((((u32)
|
|
v_data_u8[BMM050_RMSB_DATA]) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_06_BITS)
|
|
| v_data_u8[BMM050_RLSB_DATA]);
|
|
}
|
|
}
|
|
return com_rslt;
|
|
}
|
|
/*!
|
|
* @brief This API reads remapped Magnetometer
|
|
* raw data of X,Y,Z values and RHALL values
|
|
* from location 0x42 to 0x49
|
|
*
|
|
* @note In this function X and Y axis is remapped
|
|
* @note X is read from the address 0x44 & 0x45
|
|
* @note Y is read from the address 0x42 & 0x43
|
|
* @note this API is only applicable for BMX055 sensor
|
|
*
|
|
*
|
|
*
|
|
* @param mag_data : The data of remapped raw XYZ data
|
|
*
|
|
*
|
|
* @return results of bus communication function
|
|
* @retval 0 -> Success
|
|
* @retval -1 -> BMM050_ERROR
|
|
*
|
|
*/
|
|
BMM050_RETURN_FUNCTION_TYPE bmm050_get_bmx055_remapped_raw_xyz(
|
|
struct bmm050_remapped_mag_s16_data_t *mag_data)
|
|
{
|
|
/* variable used to return the bus communication result*/
|
|
BMM050_RETURN_FUNCTION_TYPE com_rslt = BMM050_ERROR;
|
|
/* Array holding the mag XYZ and R data
|
|
v_data_u8[0] - X LSB
|
|
v_data_u8[1] - X MSB
|
|
v_data_u8[2] - Y LSB
|
|
v_data_u8[3] - Y MSB
|
|
v_data_u8[4] - Z LSB
|
|
v_data_u8[5] - Z MSB
|
|
v_data_u8[6] - R LSB
|
|
v_data_u8[7] - R MSB
|
|
*/
|
|
u8 v_data_u8[BMM050_DATA_FRAME_SIZE] = {
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE,
|
|
BMM050_INIT_VALUE, BMM050_INIT_VALUE};
|
|
/* check the p_bmm050 pointer is NULL*/
|
|
if (p_bmm050 == BMM050_NULL) {
|
|
return E_BMM050_NULL_PTR;
|
|
} else {
|
|
com_rslt = p_bmm050->BMM050_BUS_READ_FUNC(p_bmm050->dev_addr,
|
|
BMM050_REMAPPED_BMX055_DATA_Y_LSB,
|
|
v_data_u8, BMM050_ALL_DATA_FRAME_LENGTH);
|
|
if (!com_rslt) {
|
|
/* x data */
|
|
v_data_u8[BMM050_XLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_XLSB_DATA],
|
|
BMM050_REMAPPED_BMX055_DATA_Y_LSB_BIT);
|
|
mag_data->datay = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_XMSB_DATA]))
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_XLSB_DATA]);
|
|
/* y data */
|
|
v_data_u8[BMM050_YLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_YLSB_DATA],
|
|
BMM050_REMAPPED_BMX055_DATA_X_LSB_BIT);
|
|
mag_data->datax = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_YMSB_DATA]))
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_05_BITS)
|
|
| v_data_u8[BMM050_YLSB_DATA]);
|
|
mag_data->datax = -mag_data->datax;
|
|
/* z data */
|
|
v_data_u8[BMM050_ZLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_ZLSB_DATA],
|
|
BMM050_DATA_Z_LSB_BIT);
|
|
mag_data->dataz = (s16)((((s32)
|
|
((s8)v_data_u8[BMM050_ZMSB_DATA]))
|
|
<< BMM050_SHIFT_BIT_POSITION_BY_07_BITS)
|
|
| v_data_u8[BMM050_ZLSB_DATA]);
|
|
|
|
|
|
/* read the data ready status*/
|
|
mag_data->data_ready = BMM050_GET_BITSLICE(
|
|
v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_RDYSTAT);
|
|
|
|
|
|
/* r data */
|
|
v_data_u8[BMM050_RLSB_DATA] =
|
|
BMM050_GET_BITSLICE(v_data_u8[BMM050_RLSB_DATA],
|
|
BMM050_DATA_R_LSB_BIT);
|
|
mag_data->resistance = (u16)((((u32)
|
|
v_data_u8[BMM050_RMSB_DATA]) <<
|
|
BMM050_SHIFT_BIT_POSITION_BY_06_BITS)
|
|
| v_data_u8[BMM050_RLSB_DATA]);
|
|
}
|
|
}
|
|
return com_rslt;
|
|
}
|