关于LIS3DH和LIS3DSH的使用及误区

关于LIS3DH和LIS3DSH的使用及误区

  • LIS3DH和LIS3DSH的差异

LIS3DH和LIS3DSH的差异

背景
在这次项目中,需要用的lis3dh来唤醒主控MCU以达到省电低功耗的目的,然而经过了一周的时间,项目毫无进展,手上的MCU通过三线模拟SPI与3DH通信完全失败,由于3DH是LGA封装,多余的引脚全部未焊接,也不能用示波器看3DH的SDO脚是否有输出,在这儿一卡就是一周,试过各种方式(硬件SPI、IIC)全部无效,一度怀疑是硬件的问题。但是由于硬件是大佬开发的,心里也只是怀疑。后来的一天,去某宝买3DH的模块,这个时候才发现这个芯片有两个型号,一个是 LIS3DH,另一个LIS3DSH。突然想到问题是不是在这儿,果然,芯片手册下载下来一看,发现问题了。这两个芯片完全不一样,虽然他们能达到相同的目的,但是他们的操作方式完全不同,包括寄存器的配置,芯片内部的结构等等。于是果断在某宝各入手一块。等拿到之后,才发现项目硬件用的是LIS3DSH,根本不是LIS3DH,而且芯片上的丝印完全不是芯片的名字。马上换下芯片,烧好写好的代码,中断立马出现。

差异
在LIS3DH中,我们都是通过写CTRL_REG1和CTRL_REG4来达到设置传感器工作速率、工作模式和量程的。对于LIS3DH而言,传感器的每一个操作步骤都是按照我们设定的来走。比如我们的INT1运动检测中断,我们配置好所有的寄存器之后,当XYZ任意轴检测到此刻的轴上加速度超过我们设定的中断阈值时,就会有相应的中断信号(LIS3DH规定高电平为中断信号)映射到INT1脚上,如果我们选择了锁存中断信号,只要我们不去读INT1_SRC这个中断寄存器,那么中断信号就会一直存在。代码如下:

void lis3dh_init(void){
	
	spi_init();                                //初始化SPI
	
	LIS3DH_WriteReg(LIS3DH_CTRL_REG4, 0x08);   //设置量程为2g,四线接口
	delay_ms(100);
																						 //设置LIS3DH_CTRL_REG4 为0x00, LIS3DH_CTRL_REG1 为0x5f即可开启低功耗模式
	LIS3DH_WriteReg(LIS3DH_CTRL_REG1, 0x57);   //100Hz 正常模式 使能ZYX(低功耗在这儿开启)
	delay_ms(100);
	
	LIS3DH_WriteReg(LIS3DH_CTRL_REG2, 0x09);   //启用INT1高通滤波
	delay_ms(100);
	
	LIS3DH_WriteReg(LIS3DH_CTRL_REG3, 0x40);   // INT1引脚上的中断发生器 1
	delay_ms(100);
		
	LIS3DH_WriteReg(LIS3DH_CTRL_REG5, 0x08);   //锁存中断请求
	delay_ms(100);
	
	LIS3DH_WriteReg(LIS3DH_INT1_CFG, 0xa8);    //中断源  zyx低
	delay_ms(100);
	
	LIS3DH_WriteReg(LIS3DH_INT1_THS, 0x10);    //设置中断1阈值(指定多大的加速度产生中断)
	delay_ms(100);
	
	LIS3DH_WriteReg(LIS3DH_INT1_DURATION, 0);  //中断持续时间(因为中断已经锁存,所以设置持续时间为0)
	delay_ms(100);
		
	LIS3DH_ReadReference();                    //第一次虚读reference寄存器   必须设置第一次虚读,不然不能产生中断!!!!
	delay_ms(100);
	
}

但是在LIS3DSH中一切都变样了。在这个传感器中,工作模式不需要我们写固定的寄存器来确定,我们只需要选择好传感器的采样率即可自动配置好传感器的工作电流,如下表所示:
关于LIS3DH和LIS3DSH的使用及误区_第1张图片
只要我们在CTRL_REG4寄存器写入值之后,即可配置好模式及速率。之后,如果详细阅读LIS3DSH的手册,你会发现该传感器里面有两个状态机,这两个状态机分别拥有可选16步的处理流程。这就相当于这个传感器自带一个逻辑处理器(微型的MCU),它可以处理一些简单的东西。最不可思议的是,这个传感器里面竟然还有4个定时器!!!后面有兴趣的同学可以深入研究一番。LIS3DSH的中断电平极性是可以自己选择的,在CTRL_REG3寄存器的IEA位可以选择是高电平中断还是低电平中断。具体的INT1中断配置实现代码如下:

void lis3dsh_init(void){
		
	spi_init();
	/*****************************************INT1唤醒*******************************************************/
	LIS3DSH_WriteReg(LIS3DSH_CTRL_REG4, 0x67);  //100Hz ,enable XYZ    
	delay1ms(100);
	
	LIS3DSH_WriteReg(LIS3DSH_CTRL_REG5, 0x00);  //Full-scale selection 2g, 4-wire interface
	delay1ms(100);
	
	LIS3DSH_WriteReg(LIS3DSH_CTRL_REG1, 0x01);  //SM1 interrupt routed to INT1, SM1 enabled    
	delay1ms(100);
	
	LIS3DSH_WriteReg(LIS3DSH_CTRL_REG3, 0x48);  //interrupt signals active HIGH, interrupt signal latched, INT1/DRDY signal enabled    
	delay1ms(100);
		
	LIS3DSH_WriteReg(LIS3DSH_THRS1_1, 0x55);    //Threshold value for SM1 operation
	delay1ms(100);
	
	LIS3DSH_WriteReg(LIS3DSH_ST1_1, 0x05);      //State machine 1 0x05 Any/triggered axis greater than THRS1
	delay1ms(100);
	
	LIS3DSH_WriteReg(LIS3DSH_ST1_2, 0x11);      //State machine 1 0x11 Continues execution from RESETPOINT
	delay1ms(100);
	
	LIS3DSH_WriteReg(LIS3DSH_MASK1_B, 0xA8);    //XYZ +- enabled(swap)
	delay1ms(100);
	
	LIS3DSH_WriteReg(LIS3DSH_MASK1_A, 0xA8);    //XYZ +- enabled(default)
	delay1ms(100);
	
	LIS3DSH_WriteReg(LIS3DSH_SETT1, 0x01);     //program flow can be modified by STOP and CONT commands
	delay1ms(100);
	
	LIS3DSH_WriteReg(LIS3DSH_PR1, 0x00);       //Program and reset pointers for State Machine 1
	delay1ms(100);
	/*********************************************************************************/
}	

误区
在调试INT运动中断的时候,要适当的设置中断阈值,如果你设置的阈值太大,会产生不了中断信号的。还有就是这个传感器验证的时候不需要先配置,你只需要直接读(读的时候欲读寄存器地址的最高位需置1)WHO_AM_I这个寄存器即可读出芯片的ID(LIS3DH对应ID为0x33,LIS3DSH对应ID为0x3F)。如果你直接读都读不到值,就说明是你的SPI或者IIC配置的问题了。最后一点就是使用LIS3DH产生运动中断配置的时候需要读一次REFERENCE_REG这个寄存器,这个寄存器是用来存放中断生成参考值的。
反思与总结
首次使用这种传感器或者其他一些没有用过的东西,一定要先确定好具体的型号,而且一定不要忽略名称上的差异。就像文中的两块IC,封装、功能、尺寸一模一样,只看外表是看不到任何差异的,谁都不知道一个名字上S的差异,两个东西的操作就完全不一样了。所以搞开发一定要小心,做硬件的时不时就给你挖个坑,到时候的锅还要你自己背上,简直太悲伤了。最后,若需要LIS3DH和LIS3DSH三线、四线模拟SPI通信INT1中断的源码可点下面的链接下载,本人已全部上传。
https://download.csdn.net/download/cxieyunsky/12187716
------------------------------------------------------------------------------------------------------------@曼珠沙华----
--------------------------------------------------------------------------------------------------------------2019/8/16----

你可能感兴趣的:(关于LIS3DH和LIS3DSH的使用及误区)