关于6轴传感器LSM6DSLTR的调试说明
- AP的检测脚需要配置为pull-down的,不能配置为pull-up,否则中断脚一直是高;sensor的int1脚配置为open-drain模式:
- 可以配置wakeup中断,阈值设置为1.2g产生中断。
在lsm6dsl_init_sensors函数中添加:
printk(KERN_ERR "------sy: set wakeup--- \n");
err = lsm6dsl_write_data_with_mask(sdata->cdata,
LSM6DSL_ACCEL_ODR_ADDR, //CTRL1_XL 0x10
0x40,
LSM6DSL_EN_BIT, false);
//这个参数必须是false,否则导致卡死
err = lsm6dsl_write_data_with_mask(sdata->cdata,
LSM6DSL_ACCEL_ODR_ADDR, //0x10
0x20,
LSM6DSL_EN_BIT, false);
err = lsm6dsl_write_data_with_mask(sdata->cdata,
0x0B, //dataReady mode 0x0B set pluse mode
0x80,
LSM6DSL_EN_BIT, false);
//打开基本的中断:wakeup free-fall,具体使用哪些,在别的寄存器控制
err = lsm6dsl_write_data_with_mask(sdata->cdata,
LSM6DSL_LIR_ADDR, //TAP_CFG: 0x58
0x80,
LSM6DSL_EN_BIT, false);
//HPF apply
err = lsm6dsl_write_data_with_mask(sdata->cdata,
LSM6DSL_LIR_ADDR, //0x58
0x10,
LSM6DSL_EN_BIT, false);
//设置唤醒阈值wake up thr set 101 1.2/(16g/64)=4.8
err = lsm6dsl_write_data_with_mask(sdata->cdata,
LSM6DSL_WAKE_UP_ADDR,
0x04,
LSM6DSL_EN_BIT, false);
//err = lsm6dsl_write_data_with_mask(sdata->cdata,
// LSM6DSL_WAKE_UP_ADDR,
// 0x02,
// LSM6DSL_EN_BIT, false);
err = lsm6dsl_write_data_with_mask(sdata->cdata,
LSM6DSL_WAKE_UP_ADDR,
0x01,
LSM6DSL_EN_BIT, false);
//route wake_up to int1
err = lsm6dsl_write_data_with_mask(sdata->cdata,
LSM6DSL_MD1_ADDR, //005e
0x20,
LSM6DSL_EN_BIT, false);
//int1 int2 set open-drain
err = lsm6dsl_write_data_with_mask(sdata->cdata,
LSM6DSL_BDU_ADDR,
0x10,
LSM6DSL_EN_BIT, false);
//end: shiyan added
- 上报的单位问题:
量程控制是由寄存器CTRL1_XL (10h)的bit2和bit3,如下:
#define LSM6DSL_ACCEL_FS_ADDR 0x10
#define LSM6DSL_ACCEL_FS_MASK 0x0c
如下值是设置的量程:
#define LSM6DSL_ACCEL_FS_2G_VAL 0x00
#define LSM6DSL_ACCEL_FS_4G_VAL 0x02
#define LSM6DSL_ACCEL_FS_8G_VAL 0x03
#define LSM6DSL_ACCEL_FS_16G_VAL 0x01
如下值是对应的增益:
#define LSM6DSL_ACCEL_FS_2G_GAIN 1
#define LSM6DSL_ACCEL_FS_4G_GAIN 2
#define LSM6DSL_ACCEL_FS_8G_GAIN 4
#define LSM6DSL_ACCEL_FS_16G_GAIN 8
以FS_SEL=1为例,这时加速度的量程为-16g到+16g。
代码中上报的是16位的数:
xyz[0] = ((s16)(data[0] | (data[1] << 8)));
xyz[1] = ((s16)(data[2] | (data[3] << 8)));
xyz[2] = ((s16)(data[4] | (data[5] << 8)));
*xyz[0] *= sdata->c_gain;
xyz[1] *= sdata->c_gain;
xyz[2] = sdata->c_gain;
这里上报的是采样值会乘以gain,不同的量程,gain不一样,但是对于同一个物理值用不同的档位测试,结果是一样的。
上报加速度的值按照单位g/16384,即1g的加速度上报16384。HAL层会 乘以(GRAVITY_EARTH /16384)
#define ACCEL_CONVERT (GRAVITY_EARTH /16384)
#define CONVERT_ACCEL_X ACCEL_CONVERT
#define CONVERT_ACCEL_Y ACCEL_CONVERT
#define CONVERT_ACCEL_Z ACCEL_CONVERT
#define GRAVITY_EARTH (9.80665f)
float value = event->value;
mPendingEvent.data[0] = value * CONVERT_ACCEL_X;
量程是±2g时,按照原始值上报;
量程是±4g时,按照原始值<<1位上报;
其他类推。