CCS811编程和端口指南_第1页
CCS811编程和端口指南_第2页
CCS811编程和端口指南_第3页
CCS811编程和端口指南_第4页
CCS811编程和端口指南_第5页
已阅读5页,还剩15页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、CCS811编程和端口指南简介:这篇应用说明详细叙述了为剑桥 CMOS传感器CCS811数字瓦斯传感器的程序设计模型和 推荐的端口技术。它告诉软件开发商如何把 CCS811设备和另一个内核(例如一个传感芯片, 传感整合器,电话,平板电脑或者数字显示设备) 集成到一个环境。它详细叙述了用户软件 如何接通,控制,使用和停止这传感器。CCS811设备硬件概述:CCS811框图如图一下所示:数字主机接口采用12 C总线。所有预先带有“ n ”的信号为低电平有效并可选的,除了 nWAKE管脚(信 号)。如果不用它们可以置高电平。 特别强调的是nWAKE输入信号是由一个软件可配置的 GPIO管脚控制 的敏

2、感应用程序来控制。在应用程序的电平并不是一个主要问题,它可以让nWAKE接地。CCS811中配置和提取样本是通过主机在 I 2 C接口中发出处理信号到 CCS811中专门的地址来完成的。 传感器可以工作在轮询方式,或者当它读取了一个eCO 2读数或到达一个临界值时可以发岀一个中断在nINT 上。程序设计模型为了灵活性和软件驱动程序维护简化CCS811不支持在I2C总线上直接寻址的寄存器。相反,它支持单个字节邮箱,来代替这些有特定功能和数据大小的寄存器。访问一个寄存器,一个I2C传递必须和引用 CCS811上的目标地址且二者保持一致一同发出。当对CCS811进行读写操作时,所有 I2C事务必须使

3、用7位地址0x5A (I 2 C _ADDR low) 或者0x5B(I 2 C _ADDR high) 。CCS811寄存器图纸如表一所示MailboxIDProxy Register Size (Bytes)Proxy Register NameDirectionDescription0x001STATUSReadStatus register0x011MEASJVIODERead /WriteMeasure mode Used to start the orw o the supported drive modes0x023ALG_RE$ULT_DATAReadAlgorithm res

4、ult. The most significant 2 bytes are the eCO2 ppmt the 2 bytes of second most significance are the TVOC ppb.0x032RAW_DATAReadRaw data from the ADC reading. For me information please contact your local support represe ntativw OxOS4ENV_DATARead / WriteEnvironment data register for holding ambient tem

5、perature and relative humidity data from external sen so. U$« for dynamic compensation0x064NTCReadNegative thermal coefficient the-rmista Provides the voltage across the referer resistor and the voltage across the NTC resistor 一 from which the ambient temperature can be determined.0x105THRESHOL

6、DSRead /WriteThreshold registers. The CCS811 suppex low and high threshold with programmable hysteresis. Crossing a threshold in either direction results- in t nINT signal being assertedOxll2BASELINERead / WriteEncoded baseline value that can be rea« and written by the application software0x201

7、HWDReadHardware ID (value = 0x81).0x211HW_VERSIONReadHardware revision. Revision number of the CC5811. For more information please see the data sheet.0x232FW Boot VersionReadBoot version number.0x242ReadApplication code version number.OxEO1ERRORJDReadError ID. When the status register reports an err

8、or its source is located in this register0xF40APP.STARTWriteApplication start.OxFF4SW.RESETWriteSoftware reset. Writing the sequence 0xllrOxES, 0x72, 0x8A to this mailbox, resets the CCS811 and places it in boot mode状态寄存器(0 xOO)下表简述了状态寄存器中的各位:76543210FW_MODE-APP_VA LIDDATA_READY-ERROR表3:状态寄存器字段,叙述了寄

9、存器中各位功能:BITSFIELDDESCRIPTION7FW_MODE0:固件处于引导模式,并允许新固件加载1:固件是在应用程序模式。CCS811准备好ADC测量6: 5保留位4APP_VALID0:没有应用程序固件加载1:有效的应用程序加载固件3DATA_READY0:没有新数据样本已经准备好1 : 一个新的数据样本在ALG_RESULT_DATA ,这位在ALG_RESULT_DATA 读 I2 C 接口时清零。2: 1保留位0ERROR0 :没有错误发生在I2C或传感器1 :有错误发生在I2C或传感器,ERROR_ID 寄存器包含在 源错误里表4 :测量模式寄存器,表示了在测量模式寄存

10、器中的字段。76:43210-DRIVE MODEINTERRUPTTHRESH-F表详细描述了在测量模式寄存器各字段。BITSFIELDDESCIPTION7保留6:4DRIVE_MODE000:闲置,不开启测量,这是最低电平模式。001 : IAQ Mode 1- A每秒钟执行测量。010: IAQ Mode 2,-每A10秒执行测量。011: IAQ Mode 3,-每60秒执行测量。100: IAQ Mode 4- Raw Data Mo部算法,每隔 250毫秒测量,例如酒精检测。一个新样值被放在ALG_RESULT_DAT和 RAW_DATA寄存器中。状态寄存器中的DATA_READ

11、Y位设定测量的时间间隔。3INTERRUPT0:中断生成是禁用的。1:当一个新信号已经存在 ALG_RESULT_DATA 中时,nINT信号宣称低驱动。当 ALG_RESULT_DATA 时,就会停止并置为低电平。被I2C端口读数2THRESH0:中断方式是程序在 MEASMODE中断。1 :女口果 MEAS_MODEINTERRUPT= 1 ,当ALG_RESULT_DATA eCO2 读取一个阈值的时候 设置在 THRESHOLDS 寄存器,这位使得 CCS811发出nINT信号, 而不只是延迟。1:0保留位表6 :错误ID寄存器,表示了错误ID寄存器的字段。7:6543210HEATE

12、RSUPPLYHEATERFAULTMAXRESISTANCIMEASMODE三 INVALIDREAD_REGINVALIDMSGINVALID表7 :错误ID寄存器的原因和反应, 描述了在错误ID寄存器中的字段和反应,当STATUSERROR=1时,寄存器是非0.错误潜在原因推存行动MSGN VALIDCCS811收到一个I2C向本站的写请 求,但是邮箱ID或者大小错误。检查主机发送一个正确的序列READ_REG_INVALIDCCS811收到一个I2C读请求,对应的 邮箱ID是无效的。检查主机发送目的序列MEASMODE_INVALIDCCS811 收到 I2C 对 MEAS_MODE

13、不支持的写模式检查主机写一个支持模式MAX_RESISTANCE氧化物材料不再正常运行,可能是: *坏了*非常环境 *加热器不操作检查加热器故障标志确保传感器在一个典型的大气和记录任何传感器可能以前见过的环境HEATER_FAULT焊接,PCB或损坏问题检查焊接。在一个无源的板块上 5和 6之间应该有大约的38欧姆。HEATER_SUPPLY焊接或PCB的问题检查焊接。在一个无源的板块上 5和 6之间应该有大约的38欧姆。错误ID寄存器在下列情况下将会清空:应用程序软件在I2 C接口上执行读取错误寄存器操作。应用软件执行SW_RESET序列通过给SW_RESET邮箱编写相应的代码。触发复位功能

14、发出nRESET信号可能超过1错误标志设置在这个寄存器,因此每次读这个寄存器时应用软件应该单独检查每一位。下面的例子将使用下面的伪代码来帮助说明CCS811所必需的功能和编程。#define STATUS_REG 0x00#define MEAS_MODE_REG 0x01#define ALG_RESULT_DATA0x02#define ENV_DATA0x05#define NTC_REG0x06#define THRESHOLDS0x10#define BASELINE0x11#define HW_ID_REG 0x20#define ERROR_ID_REG 0xE0#define

15、APP_START_REG 0xF4#define SW_RESET0xFF#define CCS_811_ADDRESS0x5A#define GPIO_WAKE0x5#define DRIVE_MODE_IDLE 0x0#define DRIVE_MODE_1SEC 0x10#define DRIVE_MODE_10SEC 0x20#define DRIVE_MODE_60SEC 0x30#define INTERRUPT_DRIVEN0x8#define THRESHOLDS_ENABLED0x4u8 i2c_buff8;bool wake_gpio_enabled = true;voi

16、d i2c_write(u8 address, u8 register, u8 *tx_data_ptr, u8 length);void i2c_read(u8 address, u8 *rx_data_ptr, u8 length);void gpio_write(u8 gpio_id, u8 level);伪代码使用全局数组, i2c_buff ,来支持传输数据和接收数据。为了便于说明,假设读事务之前不会自 动执行设置写。一些环境抽象这个API 。 I2 C 功能原型基本是不言自明的:u8 address:这个参数的值是 CCS811 地址(CCS_811_ADDRESS)。u8 reg

17、ister :这个参数是邮箱 IDu8 rx_data_ptr/tx_data_ptr :指向缓冲区的指针调用函数将在那里访问数据,写入 CCS811 或存储 读取 CCS811 的数据, i2c_buff 在下面大部分的例子中gpio_write函数使用的主机写 GPIO输出(输入CCS811)逻辑高或低电平。其参数如下所述:u8 gpio_id :GPIO 数写到逻辑高或低。u8 gpio_id :0 为逻辑低 ,1 用于逻辑高。更多信息可参考如何使用它,可参考 Handling nWAKE Using a GPIO文档。为简单起见,这例子不显任何物理层的处理操作,例如 I2C 中止和超时

18、。CCS811 I2C 数据字节顺序当读写多个字节的用户必须注意 CCS811 使用的字节顺序。 CCS811 假定最重要级别的字节排在较小 的重要性字节的前面。 例如阅读一个 16 位标量值为 0 x1 1 aa ,总线上值为 0x11 的字节出现在字 节 0 xaa 之前。I2C写事务在预期的操作模式,主机必须执行I2C写事务来使能和配置传感器。当编写一个邮箱时,例如MEAS_MODE寄存器1 s驱动模式和中断启用时,用户软件将以类似的方式执行下面的代码示 例:i2c_buff0 = DRIVE_MODE_1SEC | INTERRUPT_DRIVEN;i2c_write(CCS_811_

19、ADDRESS, MEAS_MODE_REG, i2c_buff, 1);如果这事务在协议分析仪看起来类似图2所示:aw vnte醉axu 11-1 厂Figure 2: 1乂 rifeiuci tu MEAS_MOD Second Drie Miuk, urerruplh Enahlcd注意,I2C的地址占据了最重要的7位的第一个字节传输。最不重要的比特表明分别写或读一个逻辑0或逻辑1。这是一个写,因此为什么这样的字节为0 xb4 (i.e. 0x5A << 1 = 0xB4)。下一个字节的是邮箱MEAS_MODE 的ID,最后的数据 0x18 (DRIVE_MODE = 1s,

20、中断使能)是用来写到 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字节

21、。i2c_read函数将存储i2c_buff0状态寄存器的值即0 x98,根据状态寄存器 中字段的数值,用户软件可以做岀相应的反应。硬件ID(0 x20)寄存器处理硬件ID寄存器,有时成为“我是谁”寄存器,可以在 CCS811初始化时被读取以确保这设备确实是 CCS811。当这个邮箱为读取的目标,其代理的寄存器将返回值0 x81。读这个寄存器的主机软件将执行以下:i2c_write(CCS_811_ADDRESS, HW_ID_REG, i2c_buff, 0); i2c_read(CCS_811_ADDRESS, i2c_buff, 1);if(i2c_buff0 != 0x81)retur

22、n ERROR_NOT_A_CCS811;设置写邮箱HW_ID先于实际阅读代理寄存器。每次读字节长度为1字节,它必须返回0 x81 i2c_buff数组,否则设备将不会被主机的软件配置。由此产生的事务在I2C会出现如下协议分析仪截图如图4所示:Stfup WhCe ID I O3C04I + ACKKZD 由 AOEFijiurv4; I R»d Trankactiiin to KTW IDAPP_START(0 xf4)处理:邮箱ID为0xF4,APP_START,用于CCS811从启动过渡到应用程序模式状态。请注意这个邮箱的代理寄存器大小为0字节。因此触发状态转换设置所需要的是不

23、写数据。一个典型的流程如下:i2c_write(CCS_811_ADDRESS, STATUS_REG, i2c_buff, 0);i2c_read(CCS_811_ADDRESS, i2c_buff, 1);if(!(i2c_buff0 & 0x10)return ERROR_NO_VALID_APP;i2c_write(CCS_811_ADDRESS, APP_START_REG, i2c_buff, 0);首先读取状态寄存器和 APP_VALID标志检查。如果没有设置一个错误条件返回和有效应用程序固件应该下载到CCS811 o 如果有有效的固件,然后设置写 APP_START邮箱

24、,将CCS811从引导状态 过渡到应用程序模式。逻辑分析仪捕获说明了应用程序已经启动之前传感器的状态:Figure 5: Status RtfikTef Frtar Tc ATT START Setup Writesaw 1MI£; BDI0MS4I + MXOV10 4-NMK图5显示了状态寄存器返回值 0 x10,这表明存在一个有效的应用程序但传感器还在启动模式。I2C总线的下一个事务是一个设置写邮箱0 xf4,注意因为APP_START邮箱没有底层寄存器所以大小为零。后续读取状态寄存器的返回值为0 x90,即这有一个有效的应用程序和传感器是应用程序模式。DATA_READY标志

25、将保持零到一个有效的驱动模式写入MEAS_MODE寄存器。下载固件到CCS811的信息,请参阅cc - 000922执行应用程序二进制代码文件下载。主机软件轮询方式传感器的一个操作方式是轮询模式。在这种模式下所需的主机软件是周期性,在同一时期从传感器读取数据的程序驱动模式。一个定时器中断在主机应用程序可以用来读取传感器的eCO 2和TVOC的值。下面可以看到一个典型的例子:u8 *timer_routine_read_data()i2c_write(CCS_811_ADDRESS, STATUS_REG, i2c_buff, 0); i2c_read(CCS_811_ADDRESS, i2c_

26、buff, 1);if(i2c_buff & 0x8) / check if data readyi2c_write(CCS_811_ADDRESS, ALG_RESULT_DATA, i2c_buff, 0); i2c_read(CCS_811_ADDRESS, i2c_buff, 4);return i2c_buff;读取状态寄存器监察数据是否准备好了,如果数据已经准备好了,eCO 2和TVOC结果被通过执行一个4字节数据读取 ALG_RESULT_DATA 阅读。该软件可以根据 i2c_buff位置的eCO 2和TVOC的结果处理数据。协议分析器将显示类似于图6的图像:niMMi

27、in hi MiiimmiKijure 6: Fnllinu Mode for CCSN 1 Data Snntpks接下来设置写到邮箱 0基本地设置写和后续读1个字节到邮箱0 x0去检查数据的状态是否准备好i2c_buff具体过程如下:x2和一个4字节读取。数据将存储在i2c_buff0 = 0x01i2c_buff1 = 0x90i2c_buff2 = 0x00i2c_buff3 = 0x32注意,i2c_buff0和i2c_buff1值应该转换为16位0 X0190类型字段的值(10进制400),这是当前 eCO2读取传感器.。同样的字节值i2c_buff2和i2c_buff3应该转换为

28、16位值0 X0032这是TVOC,相 当于10进制50。这个例子假定从ALG_RESULT_DATA 读取4个字节的数据。从 ALG_RESULT_DATA可以读到八个 字节。表8所示的格式:ALG_RESULT_DATA 格式。Byte:0:12:3456:7Parameter:ECO2TVOCSTATUSERROR IDRAW_DATA用户可以定义一个结构来保存这些数据具体如下:typedef struct u16 eco2;u16 tvoc;u8 status;u8 error_id;u16 raw_data; ccs811_measurement_t;这种结构的基地址可以通过一个字符

29、指针作为地址,由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()i2

30、c_write(CCS_811_ADDRESS, ALG_RESULT_DATA, i2c_buff, 0); i2c_read(CCS_811_ADDRESS, i2c_buff, 4);return i2c_buff;这不需要检查数据是否准备好。中断的发布表明新的数据样本已经准备好了。协议分析器将显示类似的I2C事务具体如图7所示:l-i<fUF? 7: Interrupt 1 riuriof CC Sit 11 D ju SanipleiinINT线路由CCS811定义,短时间之后主机应用程序执行一个设置写邮0x2,ALG_RESULT_DATA调用回调函数。然后回调例程执行一个4

31、字节读,eCO 2和TVOC读数结果存储到i2c_buff位置。阅读阈值中断数据当eCO2阅读低或高阈值时,可以在 CCS811上编程,使nINT信号产生一个中断。如果阈值超过一 个可编程的滞后值,硬件将只会触发中断。typedef struct _packedu16 threshow;u16 thresh_high;u8 thresh_hyst;threshold_reg;threshold_reg thresh_reg = 1000, 2200, 50;temp_ptr = (uint8_t *)& thresh_reg->thresh_low;i2c_write(CCS_8

32、11_ADDRESS, THRESHOLDS, temp_ptr, 5);i2c_buff0 = DRIVE_MODE_1SEC | INTERRUPT_DRIVEN | THRESHOLDS_ENABLED; i2c_write(CCS_811_ADDRESS, MEAS_MODE_REG, i2c_buff, 1);使能驱动模式之前用户必须编程所需的低和高阈值在阈值的寄存器里。这可以通过定义和声明 threshold_reg结构如上图所示。它可以用于存放阈值寄存器的值。结构的底部可以把一个指针指向字 符,例如可以是i2c_write函数调用中tx_data_ptr的参数。CCS811阈值寄

33、存器的默认值如下,如果应用程序总是使用这些值,可以不要求写阈值寄存器:LOW_THRESHOLD =1500ppmHIGH_THRESHOLD =2500ppmHYSTERESIS = 50ppm如果只需要一个阈值,低和高阈值可以配置为相同的值,也可以在执行中改变阈值寄存器。使用GPIO处理nWAKE有两个方法处理nWAKE :1. 通常总是拉低。2. 使用GPIO动态的控制断言和 deassertion 无效。当低电平nWAKE信号断言CCS811集成处理器是在运行的,将处理 I2C接口上的请求。当这个销逻辑 高CCS811进入睡眠模式,所有I2C请求被忽略。因此,当这个信号由GPIO动态控

34、制,它可以有效地控制 CCS811能耗。在敏感的应用程序中永不推荐nWAKE置低。if(wake_gpio_enabled)gpio_write(GPIO_WAKE, 0);/ enable wakei2c_write(CCS_811_ADDRESS, STATUS_REG, i2c_buff, 0);i2c_read(CCS_811_ADDRESS, i2c_buff, 1);if(i2c_buff & 0x8) / check if data readyi2c_write(CCS_811_ADDRESS, ALG_RESULT_DATA, i2c_buff, 0);i2c_read

35、(CCS_811_ADDRESS, i2c_buff, 4);if(wake_gpio_enabled)gpio_write(GPIO_WAKE, 1); / disable wake首先启用 nWAKE 通过编写逻辑电平零给 GPIO ,如果这个信号是由 GPIO 控制注意目前的代码检 查。如果没有可用的 GPIO 那么 nWAKE 必须被拉低。然后读状态寄存器,看看数据是否已经准备好了。当数据准备好, eCO2 和 TVOC 结果是通过执行读 ALG_RESULT_DATA 。最后, nWAKE 是禁用 的。该软件可以处理数据根据在 i2c_buff 位置的 eCO2 和 TVOC 的结果

36、。禁用 CCS811为了禁用传感器和在尽可能低功耗模式(同时连接电源电压V DD ),可以用如下:if(wake_gpio_enabled)gpio_write(GPIO_WAKE, 0);/ enable wakei2c_buff0 = DRIVE_MODE_IDLE;i2c_write(CCS_811_ADDRESS, MEAS_MODE_REG, i2c_buff, 1); if(wake_gpio_enabled)gpio_write(GPIO_WAKE, 1); / disable wake在空闲状态,基本上驱动代码应该在 MEAS_MODE 驱动模式禁用传感器的读数。 nWAKE

37、信号可以 被放置在其不活动的状态,因此任何 I2C 命令都不会处理。为了 “捕猎 ”, 传感器 nWAKE 应该被定义, 适当的驱动模式包括中断,如果使用,应该写入 MEAS_MODE 。禁用传感器的另一个方法,通过编写 SW_RESET 邮箱重置解锁序列。 这序列 ,如下面的代码示例 所示(处理为简单起见没有显示 nWAKE ):u8 soft_reset_code = 0x11, 0xE5, 0x72, 0x8A; i2c_write(CCS_811_ADDRESS, SW_RESET , soft_reset_code, 4);这将重置 CCS811 和把它放在引导模式,准备重新编程。C

38、CS811 时间注意事项CCS811 数据表 CC-000619-DS ,列表的时间参数 ,程序员必须遵守。未能满足这些时间参数可能导 致初始化失败。 CCS811 可能在 I2C 上返回 NAK 。典型的流程是系统执行一个 I2C 设置写随后很快读 I2C ,具体代码示例如下:i2c_write(CCS_811_ADDRESS, STATUS_REG, i2c_buff, 0);i2c_read(CCS_811_ADDRESS, i2c_buff, 1);/ enable wakevoid i2c_write(ARGS) gpio_write(GPIO_WAKE, 0);I2C_WRITE_

39、HW_REG();gpio_write(GPIO_WAKE, 1); void i2c_read(ARGS) gpio_write(GPIO_WAKE, 0);I2C_READ_HW_REG();gpio_write(GPIO_WAKE, 1); / disable wake/ enable wake/ disable wake上面显示了状态寄存器设置写入,单个字节读紧随其后。注意 I2C 的读和写功能分别使用和禁用 nWAKE 。这样做是尽可能的接近物理 I2C 事务,并实现能耗最小。无论如何在数据表中的时间需要遵 守。例如T AWAKE被定义为50gs,为确保这实现,提供的软件必须至少使n

40、WAKE延迟50s。假设我们有一个例行公事,可以利用等待 (DELAY_US) ,提供延迟功能,以增加微秒数:void i2c_XXXXX(ARGS) / XXXXX = read or write gpio_write(GPIO_WAKE, 0);/ enable wakewait(50);/ ensure TAWAKEI2C_XXXXX_HW_REG();gpio_write(GPIO_WAKE, 1);/ disable wakeT DWAKE是20us,这是nWAKE信号在I2C和CCS811之间最小的定义时间。如果 i2c_write 程序 定义 nWAKE ,随后 i2c_read

41、 程序很快唤醒,可以打破这个时间。在 nWAKE 后,为确保不违反了这个 时间参数延迟程序可参见如下:void i2c_XXXXX(ARGS) / XXXXX = read or writewait(20);/ ensure TDWAKEgpio_write(GPIO_WAKE, 0);/ enable wakewait(50);/ ensure TAWAKEI2C_XXXXX_HW_REG();gpio_write(GPIO_WAKE, 1);/ disable wake它可以放在在 nWAKE 定义之前,或者直接放在定义好的在 I2C 例行程序 nWAKE 中。以类似的方式在脉冲nRESE

42、T或写SW_RESET或开启时,驱动器不能违反时间参数T START和T RESET要求处理环境参数ENV_DATA(O x05)CCS811支持补偿相对湿度和环境温度,ENV_DATA寄存器可以在每个周期更新温度和湿度仃H)值。为了避免浮点运算,一个典型的TH传感器将一个值代表几个数量级。例如42.348%的湿度阅读将存储在一个传感器的 H,结果登记为42348。CCS811支持7位域和9位分数的湿度,紧随其后的是7位和9位分数温度。Byte 0Byte 1Byte 2Byte 3Humidity High ByteHumidity Low ByteTemperature HighByteT

43、emperature Low Byte76543210765432107654321076543210Humidity %Humidity % FractionTemp + 25 ° CTemp + 25 ° C FractionTH传感器的数据格式必须映射到ENV_DATA格式如表9所示:环境寄存器字段和字节顺序。为了把湿度值放在I 2 C buffer中,i2c_buff在开始阶段,用户可以创建类似下面的例程程序:i2c_buff0 = (RH % 1000) / 100) > 7 ? (RH/1000 + 1)<<1 : (RH/1000)<&

44、lt;1;i2c_buff1 = 0;if(RH % 1000) / 100) > 2 && (RH % 1000) / 100) < 8)i2c_buff0 |= 1;这个例程程序接受一个参数:TH传感器的湿度读数。在此案例中,大于实际读数3个数量级表示一个百分比。目前CCS811支持增量分数值为0.5,因此只有最重要的部分字段需要设置。首先7位湿度值写入i2c_buff0。这是通过使用三元运算符检查余数是否是0.8或0.09,这种情况RH值将被去除以便取整,否则RH/1000将会被写入i2c_buff0中的7位湿度字段来表示。驱动器然后设置小数部分,它通过检查是

45、否余数字段的值包含在0.3到0.7之间(小数点后最重要的数字。)如果是的话,小数最重要的比特就会被设定。以类似的方式例程程序将温度的值放入i2c_buff可以由如下生成:TEMP += 25000;i2c_buff2 = (TEMP % 1000) / 100) > 7 ? (T EMP/1000 + 1)<<1 : (T EMP/1000)<<1;i2c_buff3 = 0;if(TEMP % 1000) / 100) > 2 && (TEMP % 1000) / 100) < 8)i2c_buff2 |= 1;粗体代码负责数据表,要

46、求写入当前临时值+ 25到ENV_DATA温度寄存器。为了编程ENV_DATA,用户代码可以参考如下代码:u32 TEMP , RH;read_temp_hum_sensor(TEMP , RH);ccs811_temp_hum_convert (T EMP , RH);i2c_write(CCS_811_ADDRESS, ENV_DATA, i2c_buff, 4);ccs811_temp_hum_convert 结合上面所示的两个例子,使从RH提取的值变成 CCS811 ENV_DATA寄存器所要求的格式(存储在i2c_buff )。在此之后,用户可以编程ENV_DATA使传感器在正常方式

47、使用i2c_write例行程序。如果应用程序支持温度或湿度补偿,但不能两者兼顾,那么对应不支持的环境参数数据表的默认值必 须写入寄存器。用户不能往不支持的温度或湿度场的ENV_DATA寄存器里写0。利用NTC(0 x06)来计算温度CCS811 AUX针连接外部信号到 CCS811的一个ADC。因此可以采用带 NTC热敏电阻的分压器电 路来实现,这允许用户计算环境温度。Figure fl:E-xwniiilc CircuitNTC寄存器的格式如下所示:Byte 0Byte 1Byte 2Byte 3Rw t mV)VQlTag.p across Rst; (mV)High ByteLow By

48、teHigh ByteLow &yteNTC寄存器可通过I2C接口读数据,通过如下类似的示例代码:i2c_write(CCS_811_ADDRESS, NTC_REG, i2c_buff, 0);i2c_read(CCS_811_ADDRESS, i2c_buff, 4);基本方法是先写再读4个字节的数据到NTC邮箱。在AUX排针上可以得到ADC针采样电压。在 i2c_buff返回的值可以用来计算热敏电阻的阻值,这个方程可以计算出电阻值:Rnic Vnjrc K Rn» /请参阅 CC-000925-AN Connecting an NTC Thermistor to the

49、 CCS811来获取关于从 NTC 邮箱读取的电压值来计算温度的详细信息。处理BASELINE 寄存器(0 x11)BASELINE寄存器可以用来保证 CCS811在每次上电后运行在稳定的和连续的状态,不管环境空气 质量如何(例如,如果传感器开始在脏”空气中)。当周围的空气是新鲜的,使用这个机制应用软件必须读取和存储基线寄存器。当使用CCS811所使用的格式编码,BASELINE寄存器值对主机应用程序是无意义的。应用软件只 需要读取该值并存储在本地。不发生强制性的写入这个寄存器,CCS811将自动配置和管理其 BASELINE寄存器。BASELINE寄存器可以阅读和存储它的值如下:u8 bas

50、eline_reg2; / storage for baseline value in clean air if(air_is_clean(eCO2, CO2)i2c_write(CCS_811_ADDRESS, BASELINE, baseline_reg, 0); i2c_read(CCS_811_ADDRESS, baseline_reg, 4);程序将判定空气是否干净。如果是,它执行写入BASELINE寄存器。然后读一个 2字节的参数到数组baseline_reg 寄存器中。因此 baseline_reg 参数写回到 BASELINE 寄存器:i2c_write(CCS_811_ADDRESS, BASE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论