277 lines
14 KiB
C
277 lines
14 KiB
C
/*
|
||
* lis2dw.h
|
||
*
|
||
* Created on: Jul 28, 2024
|
||
* Author: true
|
||
*/
|
||
|
||
#ifndef USER_SRC_LIS2DW_H_
|
||
#define USER_SRC_LIS2DW_H_
|
||
|
||
|
||
|
||
#define LIS2DW_ADDR 0x30
|
||
#define LIS2DW_ADDR_SDO_LOW 0x31
|
||
|
||
// registers
|
||
#define LIS2DW_REG_OUT_T_L 0x0d
|
||
#define LIS2DW_REG_OUT_T_H 0x0e
|
||
#define LIS2DW_REG_WHO_AM_I 0x0f
|
||
#define LIS2DW_REG_CTRL1 0x20
|
||
#define LIS2DW_REG_CTRL2 0x21
|
||
#define LIS2DW_REG_CTRL3 0x22
|
||
#define LIS2DW_REG_CTRL4 0x23
|
||
#define LIS2DW_REG_INT1_PAD 0x23 // default: 0x00
|
||
#define LIS2DW_REG_CTRL5 0x24
|
||
#define LIS2DW_REG_INT2_PAD 0x24 // default: 0x00
|
||
#define LIS2DW_REG_CTRL6 0x25
|
||
#define LIS2DW_REG_OUT_T 0x26
|
||
#define LIS2DW_REG_STATUS 0x27
|
||
#define LIS2DW_REG_OUT_X_L 0x28
|
||
#define LIS2DW_REG_OUT_X_H 0x29
|
||
#define LIS2DW_REG_OUT_Y_L 0x2a
|
||
#define LIS2DW_REG_OUT_Y_H 0x2b
|
||
#define LIS2DW_REG_OUT_Z_L 0x2c
|
||
#define LIS2DW_REG_OUT_Z_H 0x2d
|
||
#define LIS2DW_REG_FIFO_CTRL 0x2e
|
||
#define LIS2DW_REG_FIFO_SAMPLES 0x2f
|
||
#define LIS2DW_REG_TAP_THS_X 0x30
|
||
#define LIS2DW_REG_TAP_THS_Y 0x31
|
||
#define LIS2DW_REG_TAP_THS_Z 0x32
|
||
#define LIS2DW_REG_INT_DUR 0x33
|
||
#define LIS2DW_REG_WAKE_UP_THS 0x34
|
||
#define LIS2DW_REG_WAKE_UP_DUR 0x35
|
||
#define LIS2DW_REG_FREE_FALL 0x36
|
||
#define LIS2DW_REG_STATUS_DUP 0x37
|
||
#define LIS2DW_REG_WAKE_UP_SRC 0x38
|
||
#define LIS2DW_REG_TAP_SRC 0x39
|
||
#define LIS2DW_REG_SIXD_SRC 0x3a
|
||
#define LIS2DW_REG_ALL_INT_SRC 0x3b // read this register to clear all INT pins
|
||
#define LIS2DW_REG_X_OFS_USR 0x3c
|
||
#define LIS2DW_REG_Y_OFS_USR 0x3d
|
||
#define LIS2DW_REG_Z_OFS_USR 0x3e
|
||
#define LIS2DW_REG_CTRL_REG7 0x3f
|
||
#define LIS2DW_REG_CTRL7 0x3f
|
||
|
||
// register properties
|
||
#define LIS2DW_WHO_AM_I 0x44
|
||
|
||
#define LIS2DW_CTRL1_LP_MODE1 (0 << 0)
|
||
#define LIS2DW_CTRL1_LP_MODE2 (1 << 0)
|
||
#define LIS2DW_CTRL1_LP_MODE3 (2 << 0)
|
||
#define LIS2DW_CTRL1_LP_MODE4 (3 << 0)
|
||
|
||
#define LIS2DW_CTRL1_MODE_LO_POWR (0 << 2)
|
||
#define LIS2DW_CTRL1_MODE_HI_PERF (1 << 2)
|
||
#define LIS2DW_CTRL1_MODE_SNGL_DATA (2 << 2)
|
||
|
||
#define LIS2DW_CTRL1_DATA_RATE_PWR_DOWN (0 << 4)
|
||
#define LIS2DW_CTRL1_DATA_RATE_1_6 (1 << 4) // 12.5 in high power mode
|
||
#define LIS2DW_CTRL1_DATA_RATE_12_5 (2 << 4)
|
||
#define LIS2DW_CTRL1_DATA_RATE_25 (3 << 4)
|
||
#define LIS2DW_CTRL1_DATA_RATE_50 (4 << 4)
|
||
#define LIS2DW_CTRL1_DATA_RATE_100 (5 << 4)
|
||
#define LIS2DW_CTRL1_DATA_RATE_200 (6 << 4)
|
||
#define LIS2DW_CTRL1_DATA_RATE_400 (7 << 4) // 200 in low power mode
|
||
#define LIS2DW_CTRL1_DATA_RATE_800 (8 << 4) // 200 in low power mode
|
||
#define LIS2DW_CTRL1_DATA_RATE_1600 (9 << 4) // 200 in low power mode
|
||
|
||
#define LIS2DW_CTRL2_SPI_4_WIRE (0 << 0)
|
||
#define LIS2DW_CTRL2_SPI_3_WIRE (1 << 0)
|
||
#define LIS2DW_CTRL2_I2C_ENABLE (0 << 1)
|
||
#define LIS2DW_CTRL2_I2C_DISABLE (1 << 1)
|
||
#define LIS2DW_CTRL2_IF_ADDR_INC (1 << 2) // automatically increment register; roll back from 0x2d->0x28
|
||
#define LIS2DW_CTRL2_BLOCK_DATA_UPDATE (1 << 3) // only update data after both MSB+LSB read
|
||
#define LIS2DW_CTRL2_CS_PU_DISC (1 << 4)
|
||
#define LIS2DW_CTRL2_SOFT_RESET (1 << 6) // resets all registers
|
||
#define LIS2DW_CTRL2_BOOT (1 << 7) // re-loads calibration constants
|
||
|
||
#define LIS2DW_CTRL3_SLP_MODE_1 (1 << 0) // single data conversion on demand trigger
|
||
#define LIS2DW_CTRL3_SLP_MODE_SEL (1 << 1) // single data conversion on demand (0=INT2, 1=SLP_MODE_1)
|
||
#define LIS2DW_CTRL3_H_L_ACTIVE (1 << 3) // interrupt level. 0=active high, 1=active low
|
||
#define LIS2DW_CTRL3_LATCHED_IR (1 << 4) // signals latched. 0=not latched (pulse), 1=latched
|
||
#define LIS2DW_CTRL3_PP_OD (1 << 5) // push pull or open drain on interrupts. 0=pushpull, 1=opendrain
|
||
#define LIS2DW_CTRL3_SELFTEST_NONE (0 << 6)
|
||
#define LIS2DW_CTRL3_SELFTEST_POS (1 << 6)
|
||
#define LIS2DW_CTRL3_SELFTEST_NEG (2 << 6)
|
||
|
||
#define LIS2DW_INT1_DRDY (1 << 0) // data ready
|
||
#define LIS2DW_INT1_FTH (1 << 1) // fifo threshold
|
||
#define LIS2DW_INT1_DIFF5 (1 << 2) // fifo full
|
||
#define LIS2DW_INT1_TAP (1 << 3) // double tap
|
||
#define LIS2DW_INT1_FF (1 << 4) // free fall
|
||
#define LIS2DW_INT1_WU (1 << 5) // wakeup
|
||
#define LIS2DW_INT1_SINGLE_TAP (1 << 6) // single tap
|
||
#define LIS2DW_INT1_6D (1 << 7) // 6D
|
||
|
||
#define LIS2DW_INT2_DRDY (1 << 0) // data ready
|
||
#define LIS2DW_INT2_FTH (1 << 1) // fifo threshold
|
||
#define LIS2DW_INT2_DIFF5 (1 << 2) // fifo full
|
||
#define LIS2DW_INT1_OVR (1 << 3) // fifo overrun
|
||
#define LIS2DW_INT1_DRDY_TEMP (1 << 4) // temperature data ready
|
||
#define LIS2DW_INT1_BOOT (1 << 5) // boot
|
||
#define LIS2DW_INT1_SLEEP_CHG (1 << 6) // sleep change status
|
||
#define LIS2DW_INT1_SLEEP_STATE (1 << 7) // sleep state
|
||
|
||
#define LIS2DW_CTRL6_LOW_NOISE (1 << 2)
|
||
#define LIS2DW_CTRL6_FILTER_DATA_SELECT (1 << 3) // 0=low pass, 1=high pass
|
||
#define LIS2DW_CTRL6_FULLSCALE_2G (0 << 4)
|
||
#define LIS2DW_CTRL6_FULLSCALE_4G (1 << 4)
|
||
#define LIS2DW_CTRL6_FULLSCALE_8G (2 << 4)
|
||
#define LIS2DW_CTRL6_FULLSCALE_16G (3 << 4)
|
||
#define LIS2DW_CTRL6_BW_FILT_ODR_2 (0 << 6)
|
||
#define LIS2DW_CTRL6_BW_FILT_ODR_4 (1 << 6)
|
||
#define LIS2DW_CTRL6_BW_FILT_ODR_10 (2 << 6)
|
||
#define LIS2DW_CTRL6_BW_FILT_ODR_20 (3 << 6)
|
||
|
||
#define LIS2DW_STATUS_DRDY (1 << 0) // 0=nrdy, 1=x/y/z new data
|
||
#define LIS2DW_STATUS_FF_IA (1 << 1) // free fall event
|
||
#define LIS2DW_STATUS_6D_IA (1 << 2) // 6D change in pos detected
|
||
#define LIS2DW_STATUS_SINGLE_TAP (1 << 3)
|
||
#define LIS2DW_STATUS_DOUBLE_TAP (1 << 4)
|
||
#define LIS2DW_STATUS_SLEEP_STATE (1 << 5) // sleep event detected
|
||
#define LIS2DW_STATUS_WU_IA (1 << 6) // wakeup event detected
|
||
#define LIS2DW_STATUS_FIFO_THS (1 << 7) // fifo thresh; 1=equal or higher than threshold
|
||
|
||
#define LIS2DW_FIFO_THRESHOLD_MASK 0x1f
|
||
#define LIS2DW_FIFO_MODE_BYPASS (0 << 4)
|
||
#define LIS2DW_FIFO_MODE_FIFO (1 << 4)
|
||
#define LIS2DW_FIFO_MODE_CONT_TO_FIFO (3 << 4)
|
||
#define LIS2DW_FIFO_MODE_BYPASS_TO_CONT (4 << 4)
|
||
#define LIS2DW_FIFO_MODE_CONT (6 << 4)
|
||
|
||
#define LIS2DW_FIFO_SAMPLES_COUNT_MASK 0x3f
|
||
#define LIS2DW_FIFO_SAMPLES_OVERRUN (1 << 6) // 0=not filled, 1=filled and sample overwritten
|
||
#define LIS2DW_FIFO_SAMPLES_THRESHOLD (1 << 7) // 0=lower, 1=equal or higher
|
||
|
||
#define LIS2DW_TAP_THSX_THRESHOLD_MASK 0x1f
|
||
#define LIS2DW_TAP_6D_THRESHOLD_80DEG (0 << 5)
|
||
#define LIS2DW_TAP_6D_THRESHOLD_70DEG (1 << 5)
|
||
#define LIS2DW_TAP_6D_THRESHOLD_60DEG (2 << 5)
|
||
#define LIS2DW_TAP_6D_THRESHOLD_50DEG (3 << 5)
|
||
#define LIS2DW_TAP_4D_EN (1 << 7)
|
||
|
||
#define LIS2DW_TAP_THSY_THRESHOLD_MASK 0x1f
|
||
#define LIS2DW_TAP_PRIO_XYZ (0 << 5)
|
||
#define LIS2DW_TAP_PRIO_YXZ (1 << 5)
|
||
#define LIS2DW_TAP_PRIO_XZY (2 << 5)
|
||
#define LIS2DW_TAP_PRIO_ZYX (3 << 5)
|
||
#define LIS2DW_TAP_PRIO_YZX (5 << 5)
|
||
#define LIS2DW_TAP_PRIO_ZXY (6 << 5)
|
||
|
||
#define LIS2DW_TAP_THSZ_THRESHOLD_MASK 0x1f
|
||
#define LIS2DW_TAP_Z_EN (1 << 5)
|
||
#define LIS2DW_TAP_Y_EN (1 << 6)
|
||
#define LIS2DW_TAP_X_EN (1 << 7)
|
||
|
||
#define LIS2DW_INT_DUR_SHOCK_4xODR (0 << 0) // tap event min signal threshold
|
||
#define LIS2DW_INT_DUR_SHOCK_8xODR (1 << 0) // data sheet isn't clear on durations
|
||
#define LIS2DW_INT_DUR_SHOCK_12xODR (2 << 0)
|
||
#define LIS2DW_INT_DUR_SHOCK_16xODR (3 << 0)
|
||
#define LIS2DW_INT_DUR_QUIET_4xODR (0 << 2) // post tap event quiet time threshold
|
||
#define LIS2DW_INT_DUR_QUIET_8xODR (1 << 2)
|
||
#define LIS2DW_INT_DUR_QUIET_12xODR (2 << 2)
|
||
#define LIS2DW_INT_DUR_QUIET_16xODR (3 << 2)
|
||
#define LIS2DW_INT_DUR_LATENCY_16xODR (0 << 4) // double tap gap maximum time between events
|
||
#define LIS2DW_INT_DUR_LATENCY_32xODR (1 << 4)
|
||
#define LIS2DW_INT_DUR_LATENCY_48xODR (2 << 4)
|
||
#define LIS2DW_INT_DUR_LATENCY_64xODR (3 << 4)
|
||
#define LIS2DW_INT_DUR_LATENCY_80xODR (4 << 4)
|
||
#define LIS2DW_INT_DUR_LATENCY_96xODR (5 << 4)
|
||
#define LIS2DW_INT_DUR_LATENCY_112xODR (6 << 4)
|
||
#define LIS2DW_INT_DUR_LATENCY_128xODR (7 << 4)
|
||
|
||
#define LIS2DW_WAKE_UP_THRESHOLD_MASK 0x3f // 1 LSB = 1/64 of FS
|
||
#define LIS2DW_WAKE_UP_SLEEP_ON (1 << 6) // sleep enable / disable
|
||
#define LIS2DW_WAKE_UP_SNGL_DUBL_TAP (1 << 7) // enable single/double tap event, 0=single only, 1=both
|
||
|
||
#define LIS2DW_WAKE_UP_SLEEP_DUR_MASK 0x0f // duration in sleep. 0=16*1/ODR, LSB=512*1/ODR
|
||
#define LIS2DW_WAKE_UP_DUR_STATIONARY (1 << 4) // stationary detection ena/dis
|
||
#define LIS2DW_WAKE_UP_DURATION_0 (0 << 5)
|
||
#define LIS2DW_WAKE_UP_DURATION_1 (1 << 5)
|
||
#define LIS2DW_WAKE_UP_DURATION_2 (2 << 5)
|
||
#define LIS2DW_WAKE_UP_DURATION_3 (3 << 5)
|
||
#define LIS2DW_WAKE_UP_FF_DUR5 (1 << 7) // free fall duration, highest bit. see below.
|
||
|
||
#define LIS2DW_FREE_FALL_THRESHOLD_5 (0 << 0) // freefall threshold @ +-2G FS in LSB counts
|
||
#define LIS2DW_FREE_FALL_THRESHOLD_7 (1 << 0)
|
||
#define LIS2DW_FREE_FALL_THRESHOLD_8 (2 << 0)
|
||
#define LIS2DW_FREE_FALL_THRESHOLD_10 (3 << 0)
|
||
#define LIS2DW_FREE_FALL_THRESHOLD_11 (4 << 0)
|
||
#define LIS2DW_FREE_FALL_THRESHOLD_13 (5 << 0)
|
||
#define LIS2DW_FREE_FALL_THRESHOLD_15 (6 << 0)
|
||
#define LIS2DW_FREE_FALL_THRESHOLD_16 (7 << 0)
|
||
#define LIS2DW_FREE_FALL_DUR14_MASK 0xf8 // free fall duration, lowest bits. 1 LSB = 1 * 1/ODR
|
||
|
||
#define LIS2DW_STATUS_DUP_DRDY (1 << 0) // 0=nrdy, 1=x/y/z new data
|
||
#define LIS2DW_STATUS_DUP_FF_IA (1 << 1) // free fall event
|
||
#define LIS2DW_STATUS_DUP_6D_IA (1 << 2) // 6D change in pos detected
|
||
#define LIS2DW_STATUS_DUP_SINGLE_TAP (1 << 3)
|
||
#define LIS2DW_STATUS_DUP_DOUBLE_TAP (1 << 4)
|
||
#define LIS2DW_STATUS_DUP_SLEEP_STATE (1 << 5) // sleep event detected
|
||
#define LIS2DW_STATUS_DUP_DRDY_TEMP (1 << 6) // new temperature data available
|
||
#define LIS2DW_STATUS_FIFO_OVERRUN (1 << 7) // fifo overrun. 1=filled completely and data overwritten
|
||
|
||
#define LIS2DW_WAKE_UP_SRC_Z (1 << 0)
|
||
#define LIS2DW_WAKE_UP_SRC_Y (1 << 1)
|
||
#define LIS2DW_WAKE_UP_SRC_X (1 << 2)
|
||
#define LIS2DW_WAKE_UP_SRC_WU (1 << 3)
|
||
#define LIS2DW_WAKE_UP_SRC_SLEEP_STATE (1 << 4)
|
||
#define LIS2DW_WAKE_UP_SRC_FF (1 << 5)
|
||
|
||
#define LIS2DW_TAP_SRC_Z_TAP (1 << 0)
|
||
#define LIS2DW_TAP_SRC_Y_TAP (1 << 1)
|
||
#define LIS2DW_TAP_SRC_X_TAP (1 << 2)
|
||
#define LIS2DW_TAP_SRC_TAP_SIGN (1 << 3) // sign of detected tap acceleration
|
||
#define LIS2DW_TAP_SRC_DOUBLE_TAP (1 << 4) // double tap detected
|
||
#define LIS2DW_TAP_SRC_SINGLE_TAP (1 << 5) // single tap detected
|
||
#define LIS2DW_TAP_SRC_TAP_ANY (1 << 6) // tap of any kind detected
|
||
|
||
#define LIS2DW_6D_SRC_XL (1 << 0) // XL over threshold
|
||
#define LIS2DW_6D_SRC_XH (1 << 1) // XH over threshold
|
||
#define LIS2DW_6D_SRC_YL (1 << 2) // YL over threshold
|
||
#define LIS2DW_6D_SRC_YH (1 << 3) // YH over threshold
|
||
#define LIS2DW_6D_SRC_ZL (1 << 4) // ZL over threshold
|
||
#define LIS2DW_6D_SRC_ZH (1 << 5) // ZH over threshold
|
||
#define LIS2DW_6D_6D_POS_CHANGED (1 << 6) // position changed (portrait/landscape/faceup/facedown)
|
||
|
||
#define LIS2DW_ALL_INT_SRC_FF (1 << 0) // free fall event detected
|
||
#define LIS2DW_ALL_INT_SRC_WU (1 << 0) // wakeup event detected
|
||
#define LIS2DW_ALL_INT_SRC_SINGLE_TAP (1 << 0) // single tap status
|
||
#define LIS2DW_ALL_INT_SRC_DOUBLE_TAP (1 << 0) // double tap status
|
||
#define LIS2DW_ALL_INT_SRC_6D (1 << 0) // change in position
|
||
#define LIS2DW_ALL_INT_SRC_SLEEP_CHANGE (1 << 0) // sleep change detected
|
||
|
||
#define LIS2DW_CTRL7_LPASS_ON6D (1 << 0) // 0=ODR/2 low pass data sent to 6D interrupt, 1=LPF2 sent to 6D interrupt
|
||
#define LIS2DW_CTRL7_HP_REF_MODE (1 << 1) // 1=high pass filter reference mode eanbled
|
||
#define LIS2DW_CTRL7_USR_OFF_W (1 << 2) // 0=977ug/LSB, 1=15.6mg/LSB. weight of user offset words
|
||
#define LIS2DW_CTRL7_USR_OFF_ON_WU (1 << 3) // user offset value on XL data for wakeup only
|
||
#define LIS2DW_CTRL7_USR_OFF_ON_OUT (1 << 4) // user offset value on XL output data registers (CTRL6_FDS must be set to 0)
|
||
#define LIS2DW_CTRL7_INTERRUPTS_ENABLE (1 << 5)
|
||
#define LIS2DW_CTRL7_INT2_ON_INT1 (1 << 6) // 1=INT2 signals are routed to INT1
|
||
#define LIS2DW_CTRL7_DRDY_PUSLED (1 << 7) // 0=latched mode, 1=pulsed mode for DRDY
|
||
|
||
|
||
// API
|
||
enum {
|
||
LIS2DW_OP_MODE_HI_PERF = 0x00, // 14-bit, 90<39><30>A@200Hz, 12.5-1600Hz, 110<31><30>g/<2F><>Hz
|
||
LIS2DW_OP_MODE_LO_PWR_4 = 0x01, // 14-bit, 63<36><33>A@200Hz, 1.6 - 200Hz, 160<36><30>g/<2F><>Hz
|
||
LIS2DW_OP_MODE_LO_PWR_3 = 0x02, // 14-bit, 34<33><34>A@200Hz, 1.6 - 200Hz, 210<31><30>g/<2F><>Hz
|
||
LIS2DW_OP_MODE_LO_PWR_2 = 0x03, // 14-bit, 20<32><30>A@200Hz, 1.6 - 200Hz, 300<30><30>g/<2F><>Hz
|
||
LIS2DW_OP_MODE_LO_PWR_1 = 0x04, // 12-bit, 10<31><30>A@200Hz, 1.6 - 200Hz, 550<35><30>g/<2F><>Hz
|
||
|
||
LIS2DW_OP_MODE_HI_PERF_LN = 0x10, // 14-bit, 120<32><30>A@200, 12.5-1600Hz, 110<31><30>g/<2F><>Hz
|
||
LIS2DW_OP_MODE_LO_PWR_4_LN = 0x11, // 14-bit, 77<37><37>A@200Hz, 1.6 - 200Hz, 160<36><30>g/<2F><>Hz
|
||
LIS2DW_OP_MODE_LO_PWR_3_LN = 0x12, // 14-bit, 42<34><32>A@200Hz, 1.6 - 200Hz, 210<31><30>g/<2F><>Hz
|
||
LIS2DW_OP_MODE_LO_PWR_2_LN = 0x13, // 14-bit, 25<32><35>A@200Hz, 1.6 - 200Hz, 300<30><30>g/<2F><>Hz
|
||
LIS2DW_OP_MODE_LO_PWR_1_LN = 0x14, // 12-bit, 12<31><32>A@200Hz, 1.6 - 200Hz, 550<35><30>g/<2F><>Hz
|
||
};
|
||
|
||
|
||
|
||
void lis2dw_init();
|
||
|
||
|
||
|
||
#endif /* USER_SRC_LIS2DW_H_ */
|