CCS811气体传感器

    CCS811 是一款低功耗微型的MEMS气体传感器,使用IIC进行通信,但与最常见的一些IIC传感器相比,多了中断、使能、复位这些功能和相应的管脚,而且程序控制涉及到模式和状态切换,调试过程不太顺利而且网上可参考的资料较少。

    首先需要理清楚IIC通行的流程,由于该器件的寄存器较丰富,包括有带有该器件ID的HW_ID(0x20)只读寄存器,所以在相应的管脚状态配置完成后通行开始时应该先读该寄存器以确认CCS811的在位情况,反馈数据为0x81表示器件在位。

    接下来应该是配置CCS811的工作模式,主要指工作周期和中断配置,通过写寄存器MEAS_MODE(0x01)(这一步可以在读回数据前任何期间完成)

配置完成之后读状态寄存器(0x00)获得传感器的当前状态情况:

    根据上表所示,一般需要关注4:3位,如果读回的信息为0x10,表示有固件,可以通过写APP_START(0xF4)寄存器(不带参数写入),让CCS811从启动模式切换到应用模式(模式切换是该传感器的问题点),然后再读取状态寄存器,如果读回的数据bit 3置1,表示数据已准备完成,可以通过读寄存器ALG_RESULT(0x02)获取相关的数据了。如果有设置中断,读数步骤通过中断函数完成。


遇到的几个坑:

1、读不到数据

         IIC发送指令后没有相应,通信无法继续,如果你的IIC通信没有问题,应该就是地址的问题了,官方datasheet中的地址是0x5A/5B,但这是7位IIC模式,转换为正常使用的IIC通信(含读写位的8位数据格式)应该是0xB4(写)和0xB5(读),通信地址不对,就毫无响应了,这也是IIC通信常见的问题。

读不到正确的数据:

参考下帖

http://bbs.elecfans.com/jishu_1102563_1_1.html

读气体数据时读回的数据全是0xFD,波形如下:

可能原因包括:传感器未正常工作,有错误和异常需要处理。有说需要拉低复位至少20ms等待传感器内部的程序启动,但这种时间不够现象是IIC通信中断,根本收不到数据而不是收到错误的0xFD。

在读状态寄存器0x00以确认,读回的数据为0x11,根据错误获取传感器内部的ERROR_ID(0xE0)寄存器值为0x03,对照下表:

出现的是错误3,传感器的电阻测量结果超量测,结合反馈的数据0XFD,让我确认不是我收到了错误的数据,而是传感器获取的数据本身就超过了量测范围,然后又好好检查了一下,尝试了一下,然后发现在配置模式寄存器0x01后,一定要等待足够长的时间,这也是网友提到的问题所在,加上一个较长的时间后就可以读到数据了。

 CCS811_Reset(); 
 CCS811_Mode();
 Delay_ms(30);//延时很重要
 CCS811_MEAS();

在使用过程中(UCOS III系统中实现),工作的周期时间也会影响到采集的数据

  while(1)   {          OSTimeDlyHMSM(0,0,2,200,OS_OPT_TIME_TIMEOUT,&err); //在轮询的方式中,调整该处延时时间,会获得不同的结果。        OSSchedLock(&err);           Init_CCS811();         OSSchedUnlock(&err);        OSTimeDlyHMSM(0,0,0,400,OS_OPT_TIME_TIMEOUT,&err);             OSSchedLock(&err);        Convert_CCS811();        OSSchedUnlock(&err);   }