CCS811编程和端口指南.docx

上传人:b****8 文档编号:9233214 上传时间:2023-02-03 格式:DOCX 页数:28 大小:268.37KB
下载 相关 举报
CCS811编程和端口指南.docx_第1页
第1页 / 共28页
CCS811编程和端口指南.docx_第2页
第2页 / 共28页
CCS811编程和端口指南.docx_第3页
第3页 / 共28页
CCS811编程和端口指南.docx_第4页
第4页 / 共28页
CCS811编程和端口指南.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

CCS811编程和端口指南.docx

《CCS811编程和端口指南.docx》由会员分享,可在线阅读,更多相关《CCS811编程和端口指南.docx(28页珍藏版)》请在冰豆网上搜索。

CCS811编程和端口指南.docx

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-i

7:

Interrupt1riu^riofCCSit11DjuSanipleii

nINT线路由CCS811定义,短时间之后主机应用程序执行一个设置写

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1