FXLS8471Q - Accelerometer orientation detection function example code

Document created by Tomas Vaverka Employee on Oct 16, 2018Last modified by Tomas Vaverka Employee on Oct 18, 2018
Version 2Show Document
  • View in full screen mode

Hi Everyone,

 

If you are interested in a simple bare metal example code illustrating the use of the FXLS8471Q orientation detection function, please find below one of my examples I created for the FXLS8471Q accelerometer while working with the NXP FRDM-KL25Z platform and FRDMSTBC-A8471 board.

 

This example code complements the code snippet from the  AN4068.

 

void FXLS8471Q_Init (void)
{
      FXLS8471Q_WriteRegister(CTRL_REG1, 0x00);                   // Standby mode
     
      FXLS8471Q_WriteRegister(PL_CFG_REG, 0x40);                  // Enable orientation detection
      FXLS8471Q_WriteRegister(PL_BF_ZCOMP_REG, 0x43);             // Back/Front trip point set to 75°, Z-lockout angle set to 25°
      FXLS8471Q_WriteRegister(P_L_THS_REG, 0x14);                 // Threshold angle = 45°, hysteresis = 14°
      FXLS8471Q_WriteRegister(PL_COUNT_REG, 0x05);                // Debounce counter set to 100ms at 50Hz
     
      FXLS8471Q_WriteRegister(CTRL_REG3, 0x00);                   // Push-pull, active low interrupt
      FXLS8471Q_WriteRegister(CTRL_REG4, 0x10);                   // Orientation interrupt enabled
      FXLS8471Q_WriteRegister(CTRL_REG5, 0x10);                   // Route orientation interrupt to INT1 - PTD4
           
      FXLS8471Q_WriteRegister(CTRL_REG1, 0x21);                   // ODR = 50Hz, Active mode
}

 

 

In the ISR, only the interrupt flag is cleared and the PL_STATUS (0x10) register is read in order to:

 

- Clear the SRC_LNDPRT flag in the INT_SOURCE register and deassert the INT1 pin, as shown on the screenshot below.

- Get orientation information. 0x82 in this example corresponds to "Portrait down" orientation.

 

void PORTD_IRQHandler()
{
      PORTD_PCR4 |= PORT_PCR_ISF_MASK;                            // Clear the interrupt flag
      PL_Status = FXLS8471Q_ReadRegister(PL_STATUS_REG);          // Read the PL_STATUS register to clear the SRC_LNDPRT flag in the INT_SOURCE register 
}

 

 

 

Attached you can find the complete source code. If there are any questions regarding this simple example code, please feel free to ask below. 

 

Regards,

Tomas

Outcomes