CCS811 编程和端口指南Word文件下载.docx
《CCS811 编程和端口指南Word文件下载.docx》由会员分享,可在线阅读,更多相关《CCS811 编程和端口指南Word文件下载.docx(22页珍藏版)》请在冰豆网上搜索。
APP_VALID
DATA_READY
ERROR
表3:
状态寄存器字段,叙述了寄存器中各位功能:
BITS
FIELD
DESCRIPTION
0:
固件处于引导模式,并允许新固件加载
1:
固件是在应用程序模式。
CCS811准备好ADC测量
6:
保留位
没有应用程序固件加载
有效的应用程序加载固件
没有新数据样本已经准备好
一个新的数据样本在ALG_RESULT_DATA,这位在 ALG_RESULT_DATA读I2C接口时清零。
2:
没有错误发生在I2C或传感器
有错误发生在I2C或传感器,ERROR_ID寄存器包含在源错误里
表4:
测量模式寄存器,表示了在测量模式寄存器中的字段。
6:
DRIVE_MODE
INTERRUPT
THRESH
下表详细描述了在测量模式寄存器各字段。
DESCIPTION
保留
000:
闲置,不开启测量,这是最低电平模式。
001:
IAQMode1–A,每秒钟执行测量。
010:
IAQMode2–A,每10秒执行测量。
011:
IAQMode3–A,每60秒执行测量。
100:
IAQMode4–RawDataMode.外部算法,每隔250毫秒测量,例如酒精检测。
一个新样值被放在ALG_RESULT_DATA和RAW_DATA寄存器中。
状态寄存器中的DATA_READY位设定测量的时间间隔。
INTERRUPT
中断生成是禁用的。
当一个新信号已经存在ALG_RESULT_DATA中时,nINT信号宣称低驱动。
当ALG_RESULT_DATA被I2C端口读数时,就会停止并置为低电平。
THRESH
中断方式是程序在MEAS_MODE中断。
如果MEAS_MODE[INTERRUPT]=1,当ALG_RESULT_DATAeCO2读取一个阈值的时候设置在THRESHOLDS寄存器,这位使得CCS811发出nINT信号,而不只是延迟。
1:
表6:
错误ID寄存器,表示了错误ID寄存器的字段。
7:
HEATER
SUPPLY
FAULT
MAX
RESISTANCE
MEASMODE
INVALID
READ_REG
MSG
表7:
错误ID寄存器的原因和反应,描述了在错误ID寄存器中的字段和反应,当STATUS[ERROR]=1时,寄存器是非0.。
错误
潜在原因
推荐行动
MSG_INVALID
CCS811收到一个I2C向本站的写请求,但是邮箱ID或者大小错误。
检查主机发送一个正确的序列
READ_REG_INVALID
CCS811收到一个I2C读请求,对应的邮箱ID是无效的。
检查主机发送目的序列
MEASMODE_INVALID
CCS811收到I2C对MEAS_MODE不支持的写模式
检查主机写一个支持模式
MAX_RESISTANCE
氧化物材料不再正常运行,可能是:
*坏了*非常环境*加热器不操作
检查加热器故障标志
确保传感器在一个典型的大气和记录任何传感器可能以前见过的环境
HEATER_FAULT
焊接,PCB或损坏问题
检查焊接。
在一个无源的板块上5和6之间应该有大约的38欧姆。
HEATER_SUPPLY
焊接或PCB的问题
错误ID寄存器在下列情况下将会清空:
●应用程序软件在I2C接口上执行读取错误寄存器操作。
●应用软件执行SW_RESET序列通过给SW_RESET邮箱编写相应的代码。
●触发复位功能
●发出nRESET信号
可能超过1错误标志设置在这个寄存器,因此每次读这个寄存器时应用软件应该单独检查每一位。
下面的例子将使用下面的伪代码来帮助说明CCS811所必需的功能和编程。
#defineSTATUS_REG0x00
#defineMEAS_MODE_REG0x01
#defineALG_RESULT_DATA0x02
#defineENV_DATA0x05
#defineNTC_REG0x06
#defineTHRESHOLDS0x10
#defineBASELINE0x11
#defineHW_ID_REG0x20
#defineERROR_ID_REG0xE0
#defineAPP_START_REG0xF4
#defineSW_RESET0xFF
#defineCCS_811_ADDRESS0x5A
#defineGPIO_WAKE0x5
#defineDRIVE_MODE_IDLE0x0
#defineDRIVE_MODE_1SEC0x10
#defineDRIVE_MODE_10SEC0x20
#defineDRIVE_MODE_60SEC0x30
#defineINTERRUPT_DRIVEN0x8
#defineTHRESHOLDS_ENABLED0x4
u8i2c_buff[8];
boolwake_gpio_enabled=true;
voidi2c_write(u8address,u8register,u8*tx_data_ptr,u8length);
voidi2c_read(u8address,u8*rx_data_ptr,u8length);
voidgpio_write(u8gpio_id,u8level);
伪代码使用全局数组,i2c_buff,来支持传输数据和接收数据。
为了便于说明,假设读事务之前不会自动执行设置写。
一些环境抽象这个API。
I2C功能原型基本是不言自明的:
●u8address:
这个参数的值是CCS811地址(CCS_811_ADDRESS)。
●u8register:
这个参数是邮箱ID
●u8rx_data_ptr/tx_data_ptr:
指向缓冲区的指针调用函数将在那里访问数据,写入CCS811或存储读取CCS811的数据,i2c_buff在下面大部分的例子中
gpio_write函数使用的主机写GPIO输出(输入CCS811)逻辑高或低电平。
其参数如下所述:
●u8gpio_id:
GPIO数写到逻辑高或低。
0为逻辑低,1用于逻辑高。
更多信息可参考如何使用它,可参考HandlingnWAKEUsingaGPIO文档。
为简单起见,这例子不显任何物理层的处理操作,例如I2C中止和超时。
CCS811I2C数据字节顺序
当读写多个字节的用户必须注意CCS811使用的字节顺序。
CCS811假定最重要级别的字节排在较小的重要性字节的前面。
例如阅读一个16位标量值为0x11aa,总线上值为0x11的字节出现在字节0xaa之前。
I2C写事务
在预期的操作模式,主机必须执行I2C写事务来使能和配置传感器。
当编写一个邮箱时,例如MEAS_MODE寄存器1s驱动模式和中断启用时,用户软件将以类似的方式执行下面的代码示例:
i2c_buff[0]=DRIVE_MODE_1SEC|INTERRUPT_DRIVEN;
i2c_write(CCS_811_ADDRESS,MEAS_MODE_REG,i2c_buff,1);
如果这事务在协议分析仪看起来类似图2所示:
注意,I2C的地址占据了最重要的7位的第一个字节传输。
最不重要的比特表明分别写或读一个逻辑0或逻辑1。
这是一个写,因此为什么这样的字节为0xb4(i.e.0x5A<
<
1=0xB4)。
下一个字节的是邮箱MEAS_MODE的ID,最后的数据0x18(DRIVE_MODE=1s,中断使能)是用来写到MEAS_MODE邮箱寄存器的。
I2C读事务
I2C读事务在读之前必须设置写,启用目标邮箱。
这最好用一个例子来说明。
假设用户需要读取状态寄存器,示例代码如下:
i2c_write(CCS_811_ADDRESS,STATUS_REG,i2c_buff,0);
i2c_read(CCS_811_ADDRESS,i2c_buff,1);
查看这个协议分析仪:
图3表示了设置写入邮箱0x00确保以后所有读事务确定目标状态寄存器。
注意在这个实例中写入数据的大小为0字节,因此i2c_buff数组不需要写入任何数据。
读取命令中包含的数据的大小在这个邮箱的寄存器中,在这里为1字节。
i2c_read函数将存储i2c_buff[0]状态寄存器的值即0x98,根据状态寄存器中字段的数值,用户软件可以做出相应的反应。
硬件ID(0x20)寄存器处理
硬件ID寄存器,有时成为“我是谁”寄存器,可以在CCS811初始化时被读取以确保这设备确实是CCS811。
当这个邮箱为读取的目标,其代理的寄存器将返回值0x81。
读这个寄存器的主机软件将执行以下:
i2c_write(CCS_811_ADDRESS,HW_ID_REG,i2c_buff,0);
if(i2c_buff[0]!
=0x81)
returnERROR_NOT_A_CCS811;
设置写邮箱HW_ID先于实际阅读代理寄存器。
每次读字节长度为1字节,它必须返回0x81i2c_buff数组,否则设备将不会被主机的软件配置。
由此产生的事务在I2C会出现如下协议分析仪截图如图4所示:
:
APP_START(0xf4)处理:
邮箱ID为0xF4,APP_START,用于CCS811从启动过渡到应用程序模式状态。
请注意这个邮箱的代理寄存器大小为0字节。
因此触发状态转换设置所需要的是不写数据。
一个典型的流程如下:
if(!
(i2c_buff[0]&
0x10))
returnERROR_NO_VALID_APP;
i2c_write(CCS_811_ADDRESS,APP_START_REG,i2c_buff,0);
首先读取状态寄存器和APP_VALID标志检查。
如果没有设置一个错误条件 返回和有效应用程序固件应该下载到CCS811。
如果有有效的固件,然后设置写APP_START邮箱,将CCS811从引导状态过渡到应用程序模式。
逻辑分析仪捕获说明了应用程序已经启动之前传感器的状态:
图5显示了状态寄存器返回值0x10,这表明存在一个有效的应用程序但传感器还在启动模式。
I2C总线的下一个事务是一个设置写邮箱0xf4,注意因为APP_START邮箱没有底层寄存器所以大小为零。
后续读取状态寄存器的返回值为0x90,即这有一个有效的应用程序和传感器是应用程序模式。
DATA_READY标志将保持零到一个有效的驱动模式写入MEAS_MODE寄存器。
下载固件到CCS811的信息,请参阅cc-000922执行应用程序二进制代码文件下载。
主机软件轮询方式
传感器的一个操作方式是轮询模式。
在这种模式下所需的主机软件是周期性,在同一时期从传感器读取数据的程序驱动模式。
一个定时器中断在主机应用程序可以用来读取传感器的eCO2和TVOC的值。
下面可以看到一个典型的例子:
u8*timer_routine_read_data(){
if(i2c_buff&
0x8)//checkifdataready
{
i2c_write(CCS_811_ADDRESS,ALG_RESULT_DATA,i2c_buff,0);
i2c_read(CCS_811_ADDRESS,i2c_buff,4);
}
returni2c_buff;
读取状态寄存器监察数据是否准备好了,如果数据已经准备好了,eCO2和TVOC结果被通过执行一个4字节数据读取ALG_RESULT_DATA阅读。
该软件可以根据i2c_buff位置的eCO2和TVOC的结果处理数据。
协议分析器将显示类似于图6的图像:
基本地设置写和后续读1个字节到邮箱0x0去检查数据的状态是否准备好。
接下来设置写到邮箱0x2和一个4字节读取。
数据将存储在i2c_buff具体过程如下:
i2c_buff[0]=0x01
i2c_buff[1]=0x90
i2c_buff[2]=0x00
i2c_buff[3]=0x32
注意,i2c_buff[0]和i2c_buff[1]值应该转换为16位0x0190类型字段的值(10进制400),这是当前eCO2读取传感器.。
同样的字节值i2c_buff[2]和i2c_buff[3]应该转换为16位值0x0032这是TVOC,相当于10进制50。
这个例子假定从ALG_RESULT_DATA读取4个字节的数据。
从ALG_RESULT_DATA可以读到八个字节。
表8所示的格式:
ALG_RESULT_DATA格式。
Byte:
0:
2:
3
Parameter:
ECO2
TVOC
STATUS
ERROR_ID
RAW_DATA
用户可以定义一个结构来保存这些数据具体如下:
typedefstruct{
u16eco2;
u16tvoc;
u8status;
u8error_id;
u16raw_data;
}ccs811_measurement_t;
这种结构的基地址可以通过一个字符指针作为地址,由i2c_read常规从传感器读取数据作为地址。
或者数据可以以当前i2c_buff复制到这个结构里。
当用i2c_read函数访问数据写入i2c_buff时,必须注意与处理器字节顺序。
禁用中断阈值读取数据
只要新数据准备和MEAS_MODE(中断)字节设置好,nINT信号被CCS811置为低电平。
主机的CSS811驱动器可以给主机应用程序的O/S提供一个回调函数,这回调函数是反应与nINT输出信号相连接的GPIO信号。
当nINT信号宣称回调函数是需要的,然后从CCS811的ALG_RESULT_DATA读取:
u8*ccs811_read_data_callback(){
这不需要检查数据是否准备好。
中断的发布表明新的数据样本已经准备好了。
协议分析器将显示类似的I2C事务具体如图7所示:
nINT线路由CCS811定义,短时间之后主机应用程序执行一个设置写邮0x2,ALG_RESULT_DATA调用回调函数。
然后回调例程执行一个4字节读,eCO2和TVOC读数结果存储到i2c_buff位置。
阅读阈值中断数据
当eCO2阅读低或高阈值时,可以在CCS811上编程,使nINT信号产生一个中断。
如果阈值超过一个可编程的滞后值,硬件将只会触发中断。
typedefstruct__packed{
u16thresh_low;
u16thresh_high;
u8thresh_hyst;
}threshold_reg;
...
threshold_regthresh_reg={1000,2200,50};
temp_ptr=(uint8_t*)&
thresh_reg->
thresh_low;
i2c_write(CCS_811_ADDRESS,THRESHOLDS,temp_ptr,5);
i2c_buff[0]=DRIVE_MODE_1SEC|INTERRUPT_DRIVEN|THRESHOLDS_ENABLED;
使能驱动模式之前用户必须编程所需的低和高阈值在阈值的寄存器里。
这可以通过定义和声明threshold_reg结构如上图所示。
它可以用于存放阈值寄存器的值。
结构的底部可以把一个指针指向字符,例如可以是i2c_write函数调用中tx_data_ptr的参数。
CCS811阈值寄存器的默认值如下,如果应用程序总是使用这些值,可以不要求写阈值寄存器:
LOW_THRESHOLD=1500ppm
HIGH_THRESHOLD=2500ppm
HYSTERESIS=50ppm
如果只需要一个阈值,低和高阈值可以配置为相同的值,也可以在执行中改变阈值寄存器。
使用GPIO处理nWAKE
有两个方法处理nWAKE:
1.通常总是拉低。
2.使用GPIO动态的控制断言和deassertion无效。
当低电平nWAKE信号断言CCS811集成处理器是在运行的,将处理I2C接口上的请求。
当这个销逻辑高CCS811进入睡眠模式,所有I2C请求被忽略。
因此,当这个信号由GPIO动态控制,它可以有效地控制CCS811能耗。
在敏感的应用程序中永不推荐nWAKE置低。
if(wake_gpio_enabled)
gpio_write(GPIO_WAKE,0);
//enablewake
gpio_write(GPIO_WAKE,1);
//disablewake
首先启用nWAKE通过编写逻辑电平零给GPIO,如果这个信号是由GPIO控制注意目前的代码检查。
如果没有可用的GPIO那么nWAKE必须被拉低。
然后读状态寄存器,看看数据是否已经准备好了。
当数据准备好,eCO2和TVOC结果是通过执行读ALG_RESULT_DATA。
最后,nWAKE是禁用的。
该软件可以处理数据根据在i2c_buff位置的eCO2和TVOC的结果。
禁用CCS811
为了禁用传感器和在尽可能低功耗模式(同时连接电源电压VDD),可以用如下:
i2c_buff[0]=DRIVE_MODE_IDLE;
在空闲状态,基本上驱动代码应该在MEAS_MODE驱动模式禁用传感器的读数。
nWAKE信号可以被放置在其不活动的状态,因此任何I2C命令都不会处理。
为了“捕猎”,传感器nWAKE应该被定义,适当的驱动模式包括中断,如果使用,应该写入MEAS_MODE。
禁用传感器的另一个方法,通过编写SW_RESET邮箱重置解锁序列。
这序列,如下面的代码示例所示(处理为简单起见没有显示nWAKE):
u8soft_reset_code[]={0x11,0xE5,0x72,0x8A};
i2c_write(CCS_811_ADDRESS,SW_RESET,soft_reset_code,4);
这将重置CCS811和把它放在引导模式,准备重新编程。
CCS811时间注意事项
CCS811数据表CC-000619-DS,列表的时间参数,程序员必须遵守。
未能满足这些时间参数可能导致初始化失败。
CCS811可能在I2C上返回NAK。
典型的流程是系统执行一个I2C设置写随后很快读I2C,具体代码示例如下: