Hi, I think I managed to successfully setup 6D orientation interrupt with LSM6DS3 using INPUT_PULLDOWN_SENSE, however for some reason latching doesn’t seem to work even though I enable it. The device resets upon receiving interrupt, but the state of LSM6DS3_ACC_GYRO_D6D_SRC
register seems to always be zero… Anyone could help me out there?
#include <nrf52840.h>
#include "LSM6DS3.h"
#include "Wire.h"
#define int1Pin PIN_LSM6DS3TR_C_INT1
LSM6DS3 lsm6ds3(I2C_MODE, 0x6A);
volatile uint16_t detectCount = 0;
void blinkLED(int ledPin, int interval, int numBlinks) {
for (int i = 0; i < numBlinks; i++) {
digitalWrite(ledPin, HIGH);
delay(interval);
digitalWrite(ledPin, LOW);
delay(interval);
}
}
void setup() {
uint8_t readDataByte = 0;
int initError = lsm6ds3.begin();
pinMode(PIN_LSM6DS3TR_C_INT1, INPUT_PULLDOWN_SENSE);
lsm6ds3.readRegister(&readDataByte, LSM6DS3_ACC_GYRO_D6D_SRC);
pinMode(LED_BUILTIN, OUTPUT);
blinkLED(LED_BUILTIN, 100, 3);
Serial.begin(9600);
while(!Serial);
if (initError != 0) {
Serial.println("Device error");
} else {
Serial.println("Device OK!");
}
Serial.print("Register:");
Serial.println(readDataByte);
readDataByte &= 0x40;
if (readDataByte) {
detectCount ++;
Serial.println("ANGLE CHANGED");
blinkLED(LED_BUILTIN, 100, 20);
}
delay(1000);
if (0 != configure_angle()) {
Serial.println("Fail to configure!");
} else {
Serial.println("Success to Configure!");
}
delay(1000);
//Reset the latch before sleep
lsm6ds3.readRegister(&readDataByte, LSM6DS3_ACC_GYRO_D6D_SRC);
pinMode(PIN_LSM6DS3TR_C_INT1, INPUT_PULLDOWN_SENSE);
// nrf_gpio_cfg_sense_input(digitalPinToInterrupt(PIN_LSM6DS3TR_C_INT1), NRF_GPIO_PIN_PULLDOWN, NRF_GPIO_PIN_SENSE_HIGH);
attachInterrupt(digitalPinToInterrupt(PIN_LSM6DS3TR_C_INT1), int1ISR, RISING);
// nrf_gpio_cfg_sense_input(digitalPinToInterrupt(PIN_LSM6DS3TR_C_INT1), NRF_GPIO_PIN_PULLDOWN, NRF_GPIO_PIN_SENSE_HIGH);
Serial.println("Sleeping...");
digitalWrite(LED_BUILTIN, HIGH);
Serial.flush();
NRF_POWER->SYSTEMOFF = 1;
}
void int1ISR() {
detectCount ++;
}
void loop() {
}
int configure_angle(void) {
uint8_t error = 0;
uint8_t dataToWrite = 0;
dataToWrite |= LSM6DS3_ACC_GYRO_BW_XL_50Hz;
dataToWrite |= LSM6DS3_ACC_GYRO_FS_XL_2g;
dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_13Hz;
error += lsm6ds3.writeRegister(LSM6DS3_ACC_GYRO_CTRL1_XL, dataToWrite);
error += lsm6ds3.writeRegister(LSM6DS3_ACC_GYRO_TAP_CFG1, 0x81);
error += lsm6ds3.writeRegister(LSM6DS3_ACC_GYRO_TAP_THS_6D, 0xc0); // c0 11000000 d4d enable, 60 degrees
error += lsm6ds3.writeRegister(LSM6DS3_ACC_GYRO_CTRL8_XL, 0x01); // low pass
error += lsm6ds3.writeRegister(LSM6DS3_ACC_GYRO_MD1_CFG, 0x04);
return error;
}