ccs811调试指南

前言

最近使用CCS811这一款集成环境参数测量芯片,由于CCS811本身的原因,导致调试颇为不顺利。现在已经调试出来,把自己的经验分享给大家。主控芯片stm32f103。

问题一:无法正常读取硬件id及状态

这个问题有可能是:

1.进行了某些误操作,导致CCS811芯片本身跑飞,所以怎么复位都不能读取。解决办法是对芯片复位,即INT脚接地
2.IIC通讯本身有问题,讲IIC通讯的读和写里的延迟加大,至少5us

问题二:从boot模式转换到测量模式失败

当上面的参数能读取出来的时候,其实通讯本身已经没有问题,但是由于CCS811内部集成的MCU需要一定的时间转换模式,即当我们发送测量转换指令后,必须等待至少180us时间,才能够对ccs811进行读写操作,假如提前读写便导致CCS811跑飞。
解决办法,当发送转换指令时必须等待180us,代码如下

//测量数据前必须开启
void app_Start(void)
{
    nWAKE=0;
    delay_us(50);
    IIC_Start(); 
    IIC_Send_Byte(WRIT);       //发送写命令
    if(IIC_Wait_Ack()){
    IIC_Stop();return;}
    IIC_Send_Byte(0xF4);
    delay_us(180);          //必须等待180us以上才能够收到应答
    if(IIC_Wait_Ack()){IIC_Stop();return;}
    IIC_Stop();
    nWAKE=1;

}

问题三:进入测量模式但无法读取环境参数

这个问题也是CCS811内部集成的MCU的锅,当进入测量模式后,CCS811的IIC通讯就变慢了,也就是说,IIC通讯必须变慢,否则CCS811反应不过来。
解决办法是调整IIC读写速度,读写延迟至少50us。
代码如下:

//测量数据前必须开启
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
        SDA_OUT();      
    IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
        if((txd&0x80)>>7)
            IIC_SDA=1;
        else
            IIC_SDA=0;
        txd<<=1;      
        delay_us(50);   //对TEA5767这三个延时都是必须的
        IIC_SCL=1;
        delay_us(50); 
        IIC_SCL=0;  
        delay_us(50); 

    }    

}       
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
    unsigned char i,receive=0;
    SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
        {
        IIC_SCL=0; 
        delay_us(50);
                IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
                delay_us(50); 
    }                    
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK   
    return receive;
}

其他问题

按照器件手册上的介绍都可以解决

结束语

调试一块板子真的很不容易,尤其是官方文档写的奇奇怪怪的。一开始以为IIC有问题,调了两三天,后面才明白怎么回事,如果有一块逻辑分析仪应该不用这么久吧。附上我写的库,祝大家能够早日调出来。
https://ltengy.github.io/2018/08/04/ccs811%E8%B0%83%E8%AF%95%E6%8C%87%E5%8D%97/

你可能感兴趣的:(ccs811,stm32,stm32f103)