lis2dw: add support for bandwidth filtering

This commit is contained in:
Joey Castillo 2022-02-19 12:53:42 -05:00
parent efde4190f1
commit b1bec8f187
2 changed files with 39 additions and 1 deletions

View File

@ -115,6 +115,30 @@ lis2dw_data_rate_t lis2dw_get_data_rate(void) {
return watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL1) >> 4; return watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL1) >> 4;
} }
void lis2dw_set_filter_type(lis2dw_filter_t bwfilter) {
uint8_t val = watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL6) & ~(LIS2DW_CTRL6_VAL_FDS_HIGH);
uint8_t bits = bwfilter << 3;
watch_i2c_write8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL6, val | bits);
}
lis2dw_filter_t lis2dw_get_filter_type(void) {
uint8_t retval = watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL6) & (LIS2DW_CTRL6_VAL_FDS_HIGH);
retval >>= 3;
return (lis2dw_filter_t)retval;
}
void lis2dw_set_bandwidth_filtering(lis2dw_bandwidth_filtering_mode_t bwfilter) {
uint8_t val = watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL6) & ~(LIS2DW_CTRL6_VAL_BANDWIDTH_DIV20);
uint8_t bits = bwfilter << 6;
watch_i2c_write8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL6, val | bits);
}
lis2dw_bandwidth_filtering_mode_t lis2dw_get_filtering(void) {
uint8_t retval = watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL6) & (LIS2DW_CTRL6_VAL_BANDWIDTH_DIV20);
retval >>= 6;
return (lis2dw_bandwidth_filtering_mode_t)retval;
}
void lis2dw_set_low_power_mode(lis2dw_low_power_mode_t mode) { void lis2dw_set_low_power_mode(lis2dw_low_power_mode_t mode) {
uint8_t val = watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL1) & ~(0b11); uint8_t val = watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL1) & ~(0b11);
uint8_t bits = mode & 0b11; uint8_t bits = mode & 0b11;

View File

@ -87,6 +87,11 @@ typedef enum {
LIS2DW_BANDWIDTH_FILTER_DIV20 = 0b11, LIS2DW_BANDWIDTH_FILTER_DIV20 = 0b11,
} lis2dw_bandwidth_filtering_mode_t; } lis2dw_bandwidth_filtering_mode_t;
typedef enum {
LIS2DW_FILTER_LOW_PASS = 0,
LIS2DW_FILTER_HIGH_PASS = 1,
} lis2dw_filter_t;
typedef enum { typedef enum {
LIS2DW_RANGE_16_G = 0b11, // +/- 16g LIS2DW_RANGE_16_G = 0b11, // +/- 16g
LIS2DW_RANGE_8_G = 0b10, // +/- 8g LIS2DW_RANGE_8_G = 0b10, // +/- 8g
@ -167,7 +172,8 @@ typedef enum {
#define LIS2DW_CTRL6_VAL_RANGE_4G (LIS2DW_RANGE_4_G << 4) #define LIS2DW_CTRL6_VAL_RANGE_4G (LIS2DW_RANGE_4_G << 4)
#define LIS2DW_CTRL6_VAL_RANGE_8G (LIS2DW_RANGE_8_G << 4) #define LIS2DW_CTRL6_VAL_RANGE_8G (LIS2DW_RANGE_8_G << 4)
#define LIS2DW_CTRL6_VAL_RANGE_16G (LIS2DW_RANGE_16_G << 4) #define LIS2DW_CTRL6_VAL_RANGE_16G (LIS2DW_RANGE_16_G << 4)
#define LIS2DW_CTRL6_VAL_FDS 0b00001000 #define LIS2DW_CTRL6_VAL_FDS_LOW (LIS2DW_FILTER_LOW_PASS << 3)
#define LIS2DW_CTRL6_VAL_FDS_HIGH (LIS2DW_FILTER_HIGH_PASS << 3)
#define LIS2DW_CTRL6_VAL_LOW_NOISE 0b00000100 #define LIS2DW_CTRL6_VAL_LOW_NOISE 0b00000100
#define LIS2DW_REG_OUT_TEMP 0x26 #define LIS2DW_REG_OUT_TEMP 0x26
@ -277,6 +283,14 @@ void lis2dw_set_data_rate(lis2dw_data_rate_t dataRate);
lis2dw_data_rate_t lis2dw_get_data_rate(void); lis2dw_data_rate_t lis2dw_get_data_rate(void);
void lis2dw_set_filter_type(lis2dw_filter_t filter);
lis2dw_filter_t lis2dw_get_filter_type(void);
void lis2dw_set_bandwidth_filtering(lis2dw_bandwidth_filtering_mode_t bwfilter);
lis2dw_bandwidth_filtering_mode_t lis2dw_get_filtering(void);
void lis2dw_set_low_power_mode(lis2dw_low_power_mode_t mode); void lis2dw_set_low_power_mode(lis2dw_low_power_mode_t mode);
lis2dw_low_power_mode_t lis2dw_get_low_power_mode(void); lis2dw_low_power_mode_t lis2dw_get_low_power_mode(void);