01-19-2021 04:08 AM
Hi all,
I'm using BMI160 with an MCU. The MCU is able to receive interrupts such as step counter and any-motion.
However, I am not able to get LOW-G interrupt even though I adjusted parameters like low_dur & low_thres .
In another platform (a different MCu) with the same settings I can easily generate LOW-G interrupt.
My code is as follows.
Any feedback is appreciated.
struct bmi160_int_settg int_config;
/* Select the Interrupt channel/pin */
int_config.int_channel = BMI160_INT_CHANNEL_1;// Interrupt channel/pin 1
/* Select the Interrupt type */
int_config.int_type = BMI160_ACC_LOW_G_INT;// Choosing LOW G/fall detection interrupt
/* Select the interrupt channel/pin settings */
int_config.int_pin_settg.output_en = BMI160_ENABLE;// Enabling interrupt pins to act as output pin
int_config.int_pin_settg.output_mode = BMI160_DISABLE;// Choosing push-pull mode for interrupt pin
int_config.int_pin_settg.output_type = BMI160_DISABLE;// Choosing active low output
int_config.int_pin_settg.edge_ctrl = BMI160_ENABLE;// Choosing edge triggered output
int_config.int_pin_settg.input_en = BMI160_DISABLE;// Disabling interrupt pin to act as input
int_config.int_pin_settg.latch_dur = BMI160_LATCH_DUR_NONE;// non-latched output
int_config.int_type_cfg.acc_low_g_int.low_data_src=BMI160_ENABLE;//
int_config.int_type_cfg.acc_low_g_int.low_en = BMI160_ENABLE;//
int_config.int_type_cfg.acc_low_g_int.low_mode = BMI160_ENABLE;//
int_config.int_type_cfg.acc_low_g_int.low_hyst = BMI160_ENABLE;//
int_config.int_type_cfg.acc_low_g_int.low_dur = acc_int.fd_fall_duration; // [ms] ((n+1) * 2.5) PREV=50
int_config.int_type_cfg.acc_low_g_int.low_thres = acc_int.fd_fall_threshold; // [mg] (n * 7.81) PREV=96
bmi160_set_int_config(&int_config, &vImec_gsensor); /* sensor is an instance of the structure bmi160_dev */
01-26-2021 04:11 AM - edited 01-26-2021 04:21 AM
Is it possible that it clears itself so quickly so the interrupt status bit will always be 0 ?
If that's the case, how do I distinguish different interrupts?
01-26-2021 06:43 AM
Hello potter1234,
"After some more experiment I am able to receive low-g interrupt now", do you meant apollo2 could response interrupt?
Normally, for your low-g test when you receive interrupt and read out interrupt status, int_status.bit.low_g should be 1. Other interrupt bits should be 0 if you didn't enable corresponding features.
01-27-2021 04:06 AM - edited 01-27-2021 08:12 AM
Hi,
I mean I can receive interrupt from NRF52 now. However, int_status.bit.low_g is always 0 as well as int_status.bit.
I am pretty sure low-g is the only interrupt I enabled.
05-19-2021 11:34 AM
Hello potter1234,
I tested low-g on MCU, it worked well. MCU could received interrupt, and low-g bit value of 0x1D register is 1.
Please refer my code and test result.
int8_t Open_BMI160_LOW_G(struct bmi160_dev *dev)
{
int8_t rslt = BMI160_OK;
struct bmi160_int_settg int_config;
/* Select the Interrupt channel/pin */
int_config.int_channel = BMI160_INT_CHANNEL_1;// Interrupt channel/pin 1
/* Select the Interrupt type */
int_config.int_type = BMI160_ACC_LOW_G_INT;
/* Select the interrupt channel/pin settings */
int_config.int_pin_settg.output_en = BMI160_ENABLE;// Enabling interrupt pins to act as output pin
int_config.int_pin_settg.output_mode = BMI160_DISABLE;// Choosing push-pull mode for interrupt pin
int_config.int_pin_settg.output_type = BMI160_ENABLE;// Choosing active high output
int_config.int_pin_settg.edge_ctrl = BMI160_ENABLE;// Choosing edge triggered output
int_config.int_pin_settg.input_en = BMI160_DISABLE;// Disabling interrupt pin to act as input
int_config.int_pin_settg.latch_dur = BMI160_LATCH_DUR_NONE;// latched output
/* Select the Flat interrupt parameters */
int_config.int_type_cfg.acc_low_g_int.low_dur = 24;/*! low-g interrupt trigger delay */
int_config.int_type_cfg.acc_low_g_int.low_thres = 12;/*! low-g interrupt trigger threshold */
int_config.int_type_cfg.acc_low_g_int.low_hyst = BMI160_ENABLE;/*! hysteresis of low-g interrupt */
int_config.int_type_cfg.acc_low_g_int.low_mode = BMI160_ENABLE;/*! 0 - single-axis mode ,1 - axis-summing mode */
int_config.int_type_cfg.acc_low_g_int.low_data_src=BMI160_ENABLE; /*! data source 0- filter & 1 pre-filter */
int_config.int_type_cfg.acc_low_g_int.low_en = BMI160_ENABLE; /*! 1 - enable low-g, 0 - disable low-g */
/* Set the Flat interrupt */
rslt = bmi160_set_int_config(&int_config, dev); /* sensor is an instance of the structure bmi160_dev */
if(rslt == BMI160_OK)
{
PDEBUG("bmi160_set_int_config for low-g success\r\n");
}
else
{
PDEBUG("bmi160_set_int_config for low-g failed\r\n");
}
return rslt;
}
void StartBMI160InterruptTask(void const * argument)
{
int8_t rslt = BMI160_OK;
struct bmi160_dev *dev;
volatile union bmi160_int_status int_status;
dev = &bmi160dev;
for(;;)
{
if((int1_flag == 1) || (int2_flag == 1))
{
memset(int_status.data, 0x00, sizeof(int_status.data));
bmi160_get_int_status(BMI160_INT_STATUS_ALL, &int_status, dev);
PDEBUG("data: 0x%02X, 0x%02X, 0x%02X, 0x%02X\r\n", int_status.data[0], int_status.data[1], int_status.data[2], int_status.data[3]);
if(int_status.bit.step)
{
PDEBUG("Step detector interrupt occured\r\n");
}
if(int_status.bit.anym)
{
PDEBUG("Any motion interrupt occured\r\n");
}
if(int_status.bit.nomo)
{
PDEBUG("No motion interrupt occured\r\n");
}
if(int_status.bit.flat_int)
{
PDEBUG("Flat detection interrupt occured\r\n");
}
if(int_status.bit.s_tap)
{
PDEBUG("Single TAP interrupt occured\r\n");
}
if(int_status.bit.d_tap)
{
PDEBUG("Double TAP interrupt occured\r\n");
}
if(int_status.bit.tap_sign)
{
PDEBUG("TAP sign 1\r\n");
}
else
{
PDEBUG("TAP sign 0\r\n");
}
if(int_status.bit.orient)
{
PDEBUG("Orientation interrupt occured\r\n");
}
if(int_status.bit.high_g)
{
PDEBUG("High-g interrupt occured\r\n");
}
if(int_status.bit.low_g)
{
PDEBUG("Low-g interrupt occured\r\n");
}
memset(int_status.data, 0x00, sizeof(int_status.data));
int1_flag = 0;
}
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_10)//INT1
{
PDEBUG("INT1 Triggered\r\n");
int1_flag = 1;
}
}
struct bmi160_acc_low_g_int_cfg
{
#if LITTLE_ENDIAN == 1
/*! low-g interrupt trigger delay */
uint8_t low_dur;
/*! low-g interrupt trigger threshold */
uint8_t low_thres;
/*! hysteresis of low-g interrupt */
uint8_t low_hyst : 2;
/*! 0 - single-axis mode ,1 - axis-summing mode */
uint8_t low_mode : 1;
/*! data source 0- filter & 1 pre-filter */
uint8_t low_data_src : 1;
/*! 1 - enable low-g, 0 - disable low-g */
uint8_t low_en : 1;
#elif BIG_ENDIAN == 1
/*! 1 - enable low-g, 0 - disable low-g */
uint8_t low_en : 1;
/*! data source 0- filter & 1 pre-filter */
uint8_t low_data_src : 1;
/*! 0 - single-axis mode ,1 - axis-summing mode */
uint8_t low_mode : 1;
/*! hysteresis of low-g interrupt */
uint8_t low_hyst : 2;
/*! low-g interrupt trigger threshold */
uint8_t low_thres;
/*! low-g interrupt trigger delay */
uint8_t low_dur;
#endif
}