Added double-tap capabilities to LIS2DW

This commit is contained in:
David Volovskiy 2025-11-15 12:47:53 -05:00
parent fe1c024e47
commit eaae42cca9
3 changed files with 22 additions and 2 deletions

View File

@ -516,18 +516,19 @@ bool movement_enable_tap_detection_if_available(void) {
if (movement_state.has_lis2dw) { if (movement_state.has_lis2dw) {
// configure tap duration threshold and enable Z axis // configure tap duration threshold and enable Z axis
lis2dw_configure_tap_threshold(0, 0, 12, LIS2DW_REG_TAP_THS_Z_Z_AXIS_ENABLE); lis2dw_configure_tap_threshold(0, 0, 12, LIS2DW_REG_TAP_THS_Z_Z_AXIS_ENABLE);
lis2dw_configure_tap_duration(10, 2, 2); lis2dw_configure_tap_duration(2, 2, 2);
// ramp data rate up to 400 Hz and high performance mode // ramp data rate up to 400 Hz and high performance mode
lis2dw_set_low_noise_mode(true); lis2dw_set_low_noise_mode(true);
lis2dw_set_data_rate(LIS2DW_DATA_RATE_HP_400_HZ); lis2dw_set_data_rate(LIS2DW_DATA_RATE_HP_400_HZ);
lis2dw_set_mode(LIS2DW_MODE_HIGH_PERFORMANCE); lis2dw_set_mode(LIS2DW_MODE_HIGH_PERFORMANCE);
lis2dw_enable_double_tap();
// Settling time (1 sample duration, i.e. 1/400Hz) // Settling time (1 sample duration, i.e. 1/400Hz)
delay_ms(3); delay_ms(3);
// enable tap detection on INT1/A3. // enable tap detection on INT1/A3.
lis2dw_configure_int1(LIS2DW_CTRL4_INT1_SINGLE_TAP | LIS2DW_CTRL4_INT1_6D); lis2dw_configure_int1(LIS2DW_CTRL4_INT1_SINGLE_TAP | LIS2DW_CTRL4_INT1_DOUBLE_TAP | LIS2DW_CTRL4_INT1_6D);
return true; return true;
} }
@ -541,6 +542,7 @@ bool movement_disable_tap_detection_if_available(void) {
lis2dw_set_low_noise_mode(false); lis2dw_set_low_noise_mode(false);
lis2dw_set_data_rate(movement_state.accelerometer_background_rate); lis2dw_set_data_rate(movement_state.accelerometer_background_rate);
lis2dw_set_mode(LIS2DW_MODE_LOW_POWER); lis2dw_set_mode(LIS2DW_MODE_LOW_POWER);
lis2dw_disable_double_tap();
// ...disable Z axis (not sure if this is needed, does this save power?)... // ...disable Z axis (not sure if this is needed, does this save power?)...
lis2dw_configure_tap_threshold(0, 0, 0, 0); lis2dw_configure_tap_threshold(0, 0, 0, 0);

View File

@ -302,6 +302,20 @@ void lis2dw_clear_fifo(void) {
#endif #endif
} }
void lis2dw_enable_double_tap(void) {
#ifdef I2C_SERCOM
uint8_t configuration = watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_WAKE_UP_THS);
watch_i2c_write8(LIS2DW_ADDRESS, LIS2DW_REG_WAKE_UP_THS, configuration | LIS2DW_WAKE_UP_THS_ENABLE_DOUBLE_TAP);
#endif
}
void lis2dw_disable_double_tap(void) {
#ifdef I2C_SERCOM
uint8_t configuration = watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_WAKE_UP_THS);
watch_i2c_write8(LIS2DW_ADDRESS, LIS2DW_REG_WAKE_UP_THS, configuration & ~LIS2DW_WAKE_UP_THS_ENABLE_DOUBLE_TAP);
#endif
}
void lis2dw_enable_sleep(void) { void lis2dw_enable_sleep(void) {
#ifdef I2C_SERCOM #ifdef I2C_SERCOM
uint8_t configuration = watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_WAKE_UP_THS); uint8_t configuration = watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_WAKE_UP_THS);

View File

@ -343,6 +343,10 @@ bool lis2dw_read_fifo(lis2dw_fifo_t *fifo_data);
void lis2dw_clear_fifo(void); void lis2dw_clear_fifo(void);
void lis2dw_enable_double_tap(void);
void lis2dw_disable_double_tap(void);
void lis2dw_enable_sleep(void); void lis2dw_enable_sleep(void);
void lis2dw_disable_sleep(void); void lis2dw_disable_sleep(void);