For motion detection, I advise you to use the Acceleration Vector-Magnetitude detection feature inluded in the FXOS8700CQ device.
////////////////////////////////////////////////////////////////////////////////
//! Defines
////////////////////////////////////////////////////////////////////////////////
// Cfg register
#define FXOS8700_WHO_AM_I 0x0D
#define FXOS8700_CTRL_REG1 0x2A
#define FXOS8700_CTRL_REG2 0x2B
#define FXOS8700_CTRL_REG3 0x2C
#define FXOS8700_CTRL_REG4 0x2D
#define FXOS8700_CTRL_REG5 0x2E
#define FXOS8700_M_CTRL_REG1 0x5B
#define FXOS8700_M_CTRL_REG2 0x5C
#define FXOS8700_M_CTRL_REG3 0x5D
#define FXOS8700_XYZ_DATA_CFG 0x0E
// Interupts
#define FXOS8700_A_VECM_CFG 0x5F
#define FXOS8700_A_VECM_THS_MSB 0x60
#define FXOS8700_A_VECM_THS_LSB 0x61
#define FXOS8700_ASLP_COUNT 0x29
#define FXOS8700_TRIG_CFG 0x0A
// Data register
#define FXOS8700_M_OUT_X 0x33
#define FXOS8700_OUT_X 0x01
#define FXOS8700_TEMP 0x51
#define FXOS8700_WHO_AM_I_VALUE 0xC7
////////////////////////////////////////////////////////////////////////////////
//! Static members
////////////////////////////////////////////////////////////////////////////////
static bool _b_IsFXOS8700Init=FALSE;
////////////////////////////////////////////////////////////////////////////////
//! Public functions
////////////////////////////////////////////////////////////////////////////////
bool bFXOS8700_Init()
{
bool __b_result = FALSE;
uint8_t __u8_CmdResult = 0;
if(!_b_IsFXOS8700Init)
{
I2C_Init (NULL);
if(_bFXOS8700_Write(FXOS8700_CTRL_REG1,0x00)) // Pass to standby mode for writable operations
if(_bFXOS8700_Read(FXOS8700_WHO_AM_I,&__u8_CmdResult)) // Check device communication
if(__u8_CmdResult== FXOS8700_WHO_AM_I_VALUE) // Check device ID
if(_bFXOS8700_Write(FXOS8700_XYZ_DATA_CFG,0x02)) //±0.976 mg/LSB
if(_bFXOS8700_Write(FXOS8700_M_CTRL_REG1,0x17))// Hybrid
if(_bFXOS8700_Write(FXOS8700_M_CTRL_REG2,0x00))
if(_bFXOS8700_Write(FXOS8700_M_CTRL_REG3,0x80))
/* Sleep mode */
if( _bFXOS8700_Write(FXOS8700_TRIG_CFG, 0x02))
if( _bFXOS8700_Write(FXOS8700_CTRL_REG2,0x04))//Autosleep on
if( _bFXOS8700_Write(FXOS8700_ASLP_COUNT,0x06))//Auto-sleep trigg
if( _bFXOS8700_Write(FXOS8700_CTRL_REG4,0x02))//Autosleep IT enable
if( _bFXOS8700_Write(FXOS8700_CTRL_REG5,0x02))//IT on IT1 pin
if( _bFXOS8700_Write(FXOS8700_CTRL_REG3,0x07))//wake on vecm 1101
if( _bFXOS8700_Write(FXOS8700_A_VECM_CFG,0x48))//A_VECM_CFG
if( _bFXOS8700_Write(FXOS8700_A_VECM_THS_MSB,0x00))//A_VECM_THS_MSB
if( _bFXOS8700_Write(FXOS8700_A_VECM_THS_LSB,/0x40))//A_VECM_THS_LSB
if( _bFXOS8700_Write(FXOS8700_CTRL_REG3,0x04))//wake on vecm
//---------------
if(_bFXOS8700_Write(FXOS8700_CTRL_REG1,0x29)) // Active Mode + ODR max ->freq min
if(_bFXOS8700_Read(0x0B,&__u8_CmdResult)) // Check WakeMode
if((__u8_CmdResult&0x03)== 1) // ok
{
_b_IsFXOS8700Init = TRUE;
__b_result =TRUE;
}
}
return __b_result;
}