LIS3DH寄存器配置and调试记录
最近两周做一个LIS3DH+国产蓝牙芯片(FR8016)计步功能项目,LIS3DH调试过程中出现了很多坑,亲测可用在此记录,也供大家参考。
1.寄存器件配置:
使用的I2C方式通信,读地址0x33,写地址0x32.具体配置的寄存器:
{
unsigned char Re;
uint8_t temp = 0;
co_delay_100us(2000);//ÑÓʱһ¶Îʱ¼ä
//lis3dhReadID();
if(!lis3dhReadID())
return false;
temp = 0x47;
if(!maxim_lis3dh_write_reg(LIS3DSH_CTRL_REG1,temp)) //10hz
return false;
temp = 0x09;//0x39;//0x3d;
if(!maxim_lis3dh_write_reg(LIS3DSH_CTRL_REG2, temp))//´ÓÄÚ²¿Â˲¨Æ÷·¢Ë͵½Êä³ö¼Ä´æÆ÷ºÍFIFOµÄÊý¾Ý
return false;
temp = 0x40;
if(!maxim_lis3dh_write_reg(LIS3DSH_CTRL_REG3, temp))
return false;
temp = 0x08;//0x09;
if(!maxim_lis3dh_write_reg(LIS3DSH_CTRL_REG4, temp))
return false;
temp = 0x08;//0x00;
if(!maxim_lis3dh_write_reg(LIS3DSH_CTRL_REG5, temp))
return false;
temp = 0x00;
if(!maxim_lis3dh_write_reg(LIS3DSH_CTRL_REG6, temp))
return false;
temp = 0x02;
if(!maxim_lis3dh_write_reg(LIS3DSH_INT1_THS, temp))
return false;
temp = 0x00;//0x02;
if(!maxim_lis3dh_write_reg(LIS3DSH_INT1_DURATION, temp))
return false;
temp = 0x5a;//0xaa;
if(!maxim_lis3dh_write_reg(LIS3DSH_INT1_CFG, temp)) //15
return false;
maxim_lis3dh_read_reg(LIS3DSH_REFERENCE,&Re);//Ðé¶Á
maxim_lis3dh_read_reg(LIS3DSH_INT1_SRC,&Re);//Çå³ýÖжÏÐźÅ
printf("Ç¿Öƽ«¸ßͨÂ˲¨Æ÷µÄÖµ¼ÓÔص½µ±Ç°¼ÓËÙ¶ÈÖµ£º%d\r\n",Re);
co_delay_100us(1000);//ÑÓʱһ¶Îʱ¼ä
return true;
}
配置寄存器前先读取一下lis3dh设备ID来确定I2C是否可以正常通信:lis3dh的ID为51(也就是0x33),如果读出来为0有两种可能:1)I2C通信没通 ,这个需要软硬联调,使用示波器看一下I2C的信号线的信号是否正常。2)I2C通了,但是读取前没先进行写操作,lis3dh读取寄存器时需要先写信号操作再读取信号操作。
uint8_t lis3dhReadID(void)
{
unsigned char Re;
maxim_lis3dh_read_reg(ADD_REG_WHO_AM_I,&Re);
if (Re != 0x33) {
printf("¼ì²â²»lis3dhÄ£¿é£¬Çë¼ì²éÄ£¿éÓ뿪·¢°åµÄ½ÓÏß");
printf("lis3dh ID = %d\r\n",Re);
return 0;
}
else {
printf("¼ì²âµ½lis3dhÄ£¿élis3dh ID = %d\r\n",Re);
return 1;
}
}
2.I2C通信写操作需要按照数据手册写的时序发送字节,我就是因为没发出去所以一直没有中断产生。
3.注意你的芯片是lis3dh还是lis3dsh,两个芯片的配置是有区别的,我使用的lis3dh芯片。
4.每次产生中断后,因为配置的寄存器5是锁存寄存器,读取x,y,z轴信息后,中断才会消失.