关于6轴传感器LSM6DSLTR的调试说明

关于6轴传感器LSM6DSLTR的调试说明

  1. AP的检测脚需要配置为pull-down的,不能配置为pull-up,否则中断脚一直是高;sensor的int1脚配置为open-drain模式:在这里插入图片描述
  2. 可以配置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
  1. 上报的单位问题:
    量程控制是由寄存器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位上报;
    其他类推。

猜你喜欢

转载自blog.csdn.net/cornerstone1/article/details/111360402