He habilitado esto en 2 sistemas embebidos. Para habilitar la interrupción del toque (o cualquier otra interrupción), simplemente debe establecer el bit de habilitación en 1. Si desea asignarlo a una salida de interrupción ... diga INT1 ... entonces debe asignar al pin INT1:
#define BMI160_REG_INT_EN_0 0x50
#define INT_S_TAP_EN (1<<5)
#define BMI160_REG_INT_MAP_0 0x55
#define INT1_S_TAP (1<<5)
bmi_write(BMI160_REG_INT_EN_0, INT_S_TAP_EN);
bmi_write(BMI160_REG_INT_MAP_0, INT1_S_TAP);
Además, si desea que esta interrupción realmente se enganche (permanezca verdadera para siempre), puede habilitar el enganche configurando el registro 0x54 = 0x0F. Creo que las interrupciones se pueden borrar estableciendo este registro en 0, luego volviendo a 0x0F. También puede ser preferible establecer el tiempo de retención en 2 veces su tasa de sondeo para que pueda capturarlo. La ecuación parece ser:
t = 312.5us x 2 ^ ([bits 3: 0] - 1)
Por lo tanto, establecer los bits 3: 0 = 0x4 le da: 312.5us x 2 (4-1) = 312.5us * 8 = 2.5ms
Algunas de las trampas en las que he caído con el IMC implican no establecer los modos de alimentación correctos antes de tiempo y no agregar un retraso entre las escrituras (450us para el sistema totalmente suspendido, 3us para los modos normal y de baja potencia).
Para referencia, tengo mi acelerómetro configurado de la siguiente manera: modo de bajo consumo, ODR de 25Hz, con el muestreo habilitado, BWP configurado en normal.
#define BMI160_REG_CMD 0x7E
#define CMD_PMU_ACC_LPW (0x12)
#define BMI160_REG_ACC_RANGE 0x41
#define ACC_RANGE_4G (5<<0)
#define BMI160_REG_ACC_CONF 0x40
#define ACC_US (1<<7)
#define ACC_BWP_NORM (2<<4)
#define ACC_ODR_25 (6<<0)
bmi_write(BMI160_REG_CMD, CMD_PMU_ACC_LPW);
bmi_write(BMI160_REG_ACC_RANGE, ACC_RANGE_4G);
bmi_write(BMI160_REG_ACC_CONF, ACC_US | ACC_BWP_NORM | ACC_ODR_25 );