CCS811编程和端口指南.docx
《CCS811编程和端口指南.docx》由会员分享,可在线阅读,更多相关《CCS811编程和端口指南.docx(28页珍藏版)》请在冰豆网上搜索。
CCS811编程和端口指南
CCS811编程和端口指南
简介:
这篇应用说明详细叙述了为剑桥CMOS传感器CCS811数字瓦斯传感器的程序设计模型和推荐的端口技术。
它告诉软件开发商如何把CCS811设备和另一个内核(例如一个传感芯片,传感整合器,电话,平板电脑或者数字显示设备)集成到一个环境。
它详细叙述了用户软件如何接通,控制,使用和停止这传感器。
CCS811设备硬件概述:
CCS811框图如图一下所示:
数字主机接口采用12C总线。
所有预先带有“n”的信号为低电平有效并可选的,除了nWAKE管脚(信号)。
如果不用它们可以置高电平。
特别强调的是nWAKE输入信号是由一个软件可配置的GPIO管脚控制的敏感应用程序来控制。
在应用程序的电平并不是一个主要问题,它可以让nWAKE接地。
CCS811中配置和提取样本是通过主机在I2C接口中发出处理信号到CCS811中专门的地址来完成的。
传感器可以工作在轮询方式,或者当它读取了一个eCO2读数或到达一个临界值时可以发岀一个中断在
nINT上。
程序设计模型
为了灵活性和软件驱动程序维护简化CCS811不支持在I2C总线上直接寻址的寄存器。
相反,它支持
单个字节邮箱,来代替这些有特定功能和数据大小的寄存器。
访问一个寄存器,一个I2C传递必须和引用CCS811上的目标地址且二者保持一致一同发出。
当对CCS811进行读写操作时,所有I2C事务必须使用7位地址0x5A(I2C_ADDRlow)或者0x5B
(I2C_ADDRhigh)。
CCS811寄存器图纸如表一所示
Mailbox
ID
ProxyRegisterSize(Bytes)
ProxyRegisterName
Direction
Description
0x00
1
STATUS
Read
Statusregister
0x01
1
MEASJVIODE
Read/
Write
Measuremode・Usedtostarttheorwothesupporteddrivemodes・
0x02
3
ALG_RE$ULT_DATA
Read
Algorithmresult.Themostsignificant2bytesaretheeCO2ppmtthe2bytesofsecondmostsignificancearetheTVOCppb.
0x03
2
RAW_DATA
Read
RawdatafromtheADCreading.Formeinformationpleasecontactyourlocalsupportrepresentativw・
OxOS
4
ENV_DATA
Read/Write
Environmentdataregisterforholdingambienttemperatureandrelativehumiditydatafromexternalsenso「.U$«fordynamiccompensation
0x06
4
NTC
Read
Negativethermalcoefficientthe-rmistaProvidesthevoltageacrosstherefererresistorandthevoltageacrosstheNTCresistor一fromwhichtheambienttemperaturecanbedetermined.
0x10
5
THRESHOLDS
Read/
Write
Thresholdregisters.TheCCS811suppexlowandhighthresholdwithprogrammablehysteresis.Crossingathresholdineitherdirectionresults-intnINTsignalbeingasserted・
Oxll
2
BASELINE
Read/Write
Encodedbaselinevaluethatcanberea«andwrittenbytheapplicationsoftware
0x20
1
HW」D
Read
HardwareID(value=0x81).
0x21
1
HW_VERSION
Read
Hardwarerevision.RevisionnumberoftheCC5811.Formoreinformationpleaseseethedatasheet.
0x23
2
FWBootVersion
Read
Bootversionnumber.
0x24
2
Read
Applicationcodeversionnumber.
OxEO
1
ERRORJD
Read
ErrorID.Whenthestatusregisterreportsanerroritssourceislocatedinthisregister
0xF4
0
APP.START
Write
Applicationstart.
OxFF
4
SW.RESET
Write
Softwarereset.Writingthesequence0xllr
OxES,0x72,0x8Atothismailbox,resetstheCCS811andplacesitinbootmode・
状态寄存器(0xOO)
下表简述了状态寄存器中的各位:
7
6
5
4
3
2
1
0
FW_MODE
-
-
APP_VALID
DATA_READY
-
-
ERROR
表3:
状态寄存器字段,叙述了寄存器中各位功能:
BITS
FIELD
DESCRIPTION
7
FW_MODE
0:
固件处于引导模式,并允许新固件加载
1:
固件是在应用程序模式。
CCS811准备好ADC测量
6:
5
保留位
4
APP_VALID
0:
没有应用程序固件加载
1:
有效的应用程序加载固件
3
DATA_READY
0:
没有新数据样本已经准备好
1:
一个新的数据样本在ALG_RESULT_DATA,这位在
ALG_RESULT_DATA读I2C接口时清零。
2:
1
保留位
0
ERROR
0:
没有错误发生在I2C或传感器
1:
有错误发生在I2C或传感器,ERROR_ID寄存器包含在源错误里
表4:
测量模式寄存器,表示了在测量模式寄存器中的字段。
7
6:
4
3
2
1
0
-
DRIVEMODE
INTERRUPT
THRESH
-
-
F表详细描述了在测量模式寄存器各字段。
BITS
FIELD
DESCIPTION
7
保留
6:
4
DRIVE_MODE
000:
闲置,不开启测量,这是最低电平模式。
001:
IAQMode1-A每秒钟执行测量。
010:
IAQMode2,-每A10秒执行测量。
011:
IAQMode3,-每\60秒执行测量。
100:
IAQMode4-RawDataMo部算法,每隔250
毫秒测量,例如酒精检测。
一个新样值被放在ALG_RESULT_DAT和RAW_DATA
寄存器中。
状态寄存器中的DATA_READY位设定测量
的时间间隔。
3
INTERRUPT
0:
中断生成是禁用的。
1:
当一个新信号已经存在ALG_RESULT_DATA中时,nINT
信号宣称低驱动。
当ALG_RESULT_DATA时,就会停止并置为低电平。
被I2C端口读数
2
THRESH
0:
中断方式是程序在MEAS—MODE中断。
1:
女口果MEAS_MODE[INTERRUPT]=1,当
ALG_RESULT_DATAeCO2读取一个阈值的时候设置在THRESHOLDS寄存器,这位使得CCS811发出nINT信号,而不只是延迟。
1:
0
保留位
表6:
错误ID寄存器,表示了错误ID寄存器的字段。
7:
6
5
4
3
2
1
0
HEATER
SUPPLY
HEATER
FAULT
MAX
RESISTANCI
MEASMODE
三INVALID
READ_REG
INVALID
MSG
INVALID
表7:
错误ID寄存器的原因和反应,描述了在错误ID寄存器中的字段和反应,当STATUS[ERROR]
=1时,寄存器是非0.
错误
潜在原因
推存行动
MSG」NVALID
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的问题
检查焊接。
在一个无源的板块上5和6之间应该有大约的38欧姆。
错误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数写到逻辑高或低。
•u8gpio_id:
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所示:
awvnte醉axu1
1-1厂
Figure2:
1乂’rifeiucituMEAS_MOD]SecondDri^eMiuk,[urerruplhEnahlcd
注意,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);i2c_read(CCS_811_ADDRESS,i2c_buff,1);
if(i2c_buff[0]!
=0x81)
returnERROR_NOT_A_CCS811;
设置写邮箱HW_ID先于实际阅读代理寄存器。
每次读字节长度为1字节,它必须返回0x81i2c_buff
数组,否则设备将不会被主机的软件配置。
由此产生的事务在I2C会出现如下协议分析仪截图如图4所示:
:
StfupWhCeIDIO3C04I+ACKKZD由AOE
Fijiurv4;IR»dTrankactiiintoKTWID
APP_START(0xf4)处理:
邮箱ID为0xF4,APP_START,用于CCS811从启动过渡到应用程序模式状态。
请注意这个邮箱
的代理寄存器大小为0字节。
因此触发状态转换设置所需要的是不写数据。
一个典型的流程如下:
i2c_write(CCS_811_ADDRESS,STATUS_REG,i2c_buff,0);
i2c_read(CCS_811_ADDRESS,i2c_buff,1);
if(!
(i2c_buff[0]&0x10))
returnERROR_NO_VALID_APP;
i2c_write(CCS_811_ADDRESS,APP_START_REG,i2c_buff,0);
首先读取状态寄存器和APP_VALID标志检查。
如果没有设置一个错误条件返回和有效应用程序
固件应该下载到CCS811o如果有有效的固件,然后设置写APP_START邮箱,将CCS811从引导状态过渡到应用程序模式。
逻辑分析仪捕获说明了应用程序已经启动之前传感器的状态:
Figure5:
StatusRtfikTefFrtarTcATTSTARTSetupWrite
图5显示了状态寄存器返回值0x10,这表明存在一个有效的应用程序但传感器还在启动模式。
I2C总
线的下一个事务是一个设置写邮箱0xf4,注意因为APP_START邮箱没有底层寄存器所以大小为零。
后
续读取状态寄存器的返回值为0x90,即这有一个有效的应用程序和传感器是应用程序模式。
DATA_READY
标志将保持零到一个有效的驱动模式写入MEAS_MODE寄存器。
下载固件到CCS811的信息,请参阅cc-000922执行应用程序二进制代码文件下载。
主机软件轮询方式
传感器的一个操作方式是轮询模式。
在这种模式下所需的主机软件是周期性,在同一时期从传感器读
取数据的程序驱动模式。
一个定时器中断在主机应用程序可以用来读取传感器的eCO2和TVOC的值。
下面可以看到一个典型的例子:
u8*timer_routine_read_data(){
i2c_write(CCS_811_ADDRESS,STATUS_REG,i2c_buff,0);i2c_read(CCS_811_ADDRESS,i2c_buff,1);
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的图像:
niMMiinhiMiiimmi
Kijure6:
FnllinuModeforCCSN]1DataSnntpks
接下来设置写到邮箱0
基本地设置写和后续读1个字节到邮箱0x0去检查数据的状态是否准备好
i2c_buff具体过程如下:
x2和一个4字节读取。
数据将存储在
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:
1
2:
3
4
5
6:
7
Parameter:
ECO2
TVOC
STATUS
ERRORID
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驱动器可以给主机应用程序的0/S提供一个回调函数,这回调函数是反应与nINT输出信号相
连接的GPIO信号。
当nINT信号宣称回调函数是需要的,然后从CCS811的ALG_RESULT_DATA
读取:
u8*ccs811_read_data_callback(){
i2c_write(CCS_811_ADDRESS,ALG_RESULT_DATA,i2c_buff,0);i2c_read(CCS_811_ADDRESS,i2c_buff,4);
returni2c_buff;
}
这不需要检查数据是否准备好。
中断的发布表明新的数据样本已经准备好了。
协议分析器将显示类
似的I2C事务具体如图7所示:
l-i7:
Interrupt1riu^riofCCSit11DjuSanipleii
nINT线路由CCS811定义,短时间之后主机应用程序执行一个设置写