Hello,
I get an error message when running this function:
int ret = i2c_reg_write_byte(data->dev, cfg->i2c_addr,
LSM6DSOX_INT1_CTRL, test);
I know 0x0BAE0002 error means NRFX_ERROR_DRV_TWI_ERR_DNACK but hard to tell what is the cause of this error.
If I run the sensor in polling mode, everything works fine which can exclude error because of wiring.
Any help on this will be helpful.
Here is the error message.
2021-09-23T09:50:21.478Z DEBUG modem << *** Booting Zephyr OS build v2.6.0-rc1-ncs1 ***
2021-09-23T09:50:23.399Z DEBUG modem << Testing LSM6DSO sensor in trigger mode.
2021-09-23T09:50:23.452Z DEBUG modem << [00:00:04.368,957] [1;31m<err> os: ***** Spurious interrupt (IRQ 6) *****[0m
2021-09-23T09:50:23.454Z DEBUG modem << [00:00:04.368,957] [1;31m<err> os: r0/a1: 0x20001400 r1/a2: 0x00004965 r2/a3: 0x0000a2bf[0m
2021-09-23T09:50:23.496Z DEBUG modem << [00:00:04.368,988] [1;31m<err> os: r3/a4: 0x000049b9 r12/ip: 0x000049b9 r14/lr: 0x000049b9[0m
2021-09-23T09:50:23.540Z DEBUG modem << [00:00:04.368,988] [1;31m<err> os: xpsr: 0x00000000[0m
2021-09-23T09:50:23.556Z DEBUG modem << [00:00:04.368,988] [1;31m<err> os: Faulting instruction address (r15/pc): 0x000049b9[0m
2021-09-23T09:50:23.594Z DEBUG modem << [00:00:04.369,018] [1;31m<err> os: >>> ZEPHYR FATAL ERROR 0: CPU exception on CPU 0[0m
2021-09-23T09:50:23.640Z DEBUG modem << [00:00:04.369,018] [1;31m<err> os: Current thread: 0x200003b8 (unknown)[0m
2021-09-23T09:50:23.690Z DEBUG modem << [00:00:04.626,678] [1;31m<err> fatal_error: Resetting system[0m
2021-09-23T09:51:36.834Z DEBUG modem << *** Booting Zephyr OS build v2.6.0-rc1-ncs1 ***
2021-09-23T09:51:37.617Z DEBUG modem << No device "LSM6DSOX" found.
2021-09-23T09:51:37.839Z DEBUG modem << [00:00:01.063,354] [1;31m<err> i2c_nrfx_twim: Error 0x0BAE0002 occurred for message 0[0m
overlay
arduino_i2c: &i2c0 {
lsm6dsox@6a {
compatible = "st,lsm6dsox";
label = "LSM6DSOX";
reg = <0x6a>;
irq-gpios = <&gpio0 11 GPIO_ACTIVE_HIGH>,<&gpio0 12 GPIO_ACTIVE_HIGH>;
int-pin = <1>;
};
};
The function cause this error
static int lsm6dsox_enable_xl_int(const struct device *dev, int enable)
{
const struct lsm6dsox_config *cfg = dev->config;
struct lsm6dsox_data *data = dev->data;
if (enable) {
/* dummy read: re-trigger interrupt */
int16_t buf[3];
if (i2c_burst_read(data->dev, cfg->i2c_addr,
LSM6DSOX_REG_DATA_START_NO_TEMP, (uint8_t *)buf, 6) < 0) {
LOG_ERR("Failed to read data sample.");
return -EIO;
}
}
/* set interrupt */
if (cfg->int_pin == 1) {
lsm6dsox_int1_ctrl_t int1_ctrl;
if (i2c_reg_read_byte(data->dev, cfg->i2c_addr,
LSM6DSOX_INT1_CTRL, (uint8_t*)&int1_ctrl) < 0) {
return EIO;
}
int1_ctrl.int1_drdy_xl = enable;
uint8_t test = 0x01;
// this line trigger Spurious interrupt (IRQ 6)
int ret = i2c_reg_write_byte(data->dev, cfg->i2c_addr,
LSM6DSOX_INT1_CTRL, test);
if (ret != 0){
printf("cannot write");
}
return ret;
}
}
int lsm6dsox_trigger_set(const struct device *dev,
const struct sensor_trigger *trig,
sensor_trigger_handler_t handler)
{
struct lsm6dsox_data *lsm6dsox = dev->data;
if (trig->chan == SENSOR_CHAN_ACCEL_XYZ) {
lsm6dsox->handler_drdy_acc = handler;
if (handler) {
return lsm6dsox_enable_xl_int(dev, LSM6DSO_EN_BIT);
} else {
return lsm6dsox_enable_xl_int(dev, 0);
}
} else if (trig->chan == SENSOR_CHAN_GYRO_XYZ) {
lsm6dsox->handler_drdy_gyr = handler;
if (handler) {
return lsm6dsox_enable_g_int(dev, 1);
} else {
return lsm6dsox_enable_g_int(dev, 0);
}
}
return -ENOTSUP;
}