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

下载本文档

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

文档简介

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

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

3、C _ADDR low) 或者 0x5B (I 2 C _ADDR high)。CCS811寄存器图纸如表一所示。状态寄存器(0 x00)下表简述了状态寄存器中的各位:76543210FW_MODE-APP_VALIDDATA_READY-ERROR表3:状态寄存器字段,叙述了寄存器中各位功能:BITSFIELDDESCRIPTION7FW_MODE0:固件处于引导模式,并允许新固件加载1:固件是在应用程序模式。CCS811准备好ADC测量6:5保留位4APP_VALID0:没有应用程序固件加载1:有效的应用程序加载固件3DATA_READY0:没有新数据样本已经准备好1:一个新的数据样本在A

4、LG_RESULT_DATA,这位在ALG_RESULT_DATA读I2 C接口时清零。2:1保留位0ERROR0:没有错误发生在I2C或传感器1:有错误发生在I2C或传感器, ERROR_ID寄存器包含在源错误里表4:测量模式寄存器,表示了在测量模式寄存器中的字段。76:43210-DRIVE_MODEINTERRUPTTHRESH-下表详细描述了在测量模式寄存器各字段。BITSFIELDDESCIPTION7保留6:4DRIVE_MODE000:闲置,不开启测量,这是最低电平模式。001:IAQ Mode 1 A,每秒钟执行测量。010: IAQ Mode 2 A,每10秒执行测量。011

5、: IAQ Mode 3 A,每60秒执行测量。100: IAQ Mode 4 Raw Data Mode.外部算法,每隔250毫秒测量,例如酒精检测。一个新样值被放在ALG_RESULT_DATA 和 RAW_DATA寄存器中。状态寄存器中的DATA_READY位设定测量的时间间隔。3INTERRUPT 0:中断生成是禁用的。1:当一个新信号已经存在ALG_RESULT_DATA中时,nINT信号宣称低驱动。当ALG_RESULT_DATA被I2C端口读数时,就会停止并置为低电平。2THRESH 0:中断方式是程序在MEAS_MODE中断。1:如果MEAS_MODEINTERRUPT = 1

6、,当ALG_RESULT_DATA eCO2读取一个阈值的时候设置在THRESHOLDS寄存器,这位使得CCS811发出nINT信号,而不只是延迟。1:0保留位 表6:错误ID寄存器,表示了错误ID寄存器的字段。7:6543210HEATERSUPPLYHEATERFAULTMAXRESISTANCEMEASMODEINVALIDREAD_REGINVALIDMSGINVALID表7:错误ID寄存器的原因和反应,描述了在错误ID寄存器中的字段和反应,当STATUSERROR = 1时,寄存器是非0.。错误潜在原因推荐行动MSG_INVALIDCCS811收到一个I2C向本站的写请求,但是邮箱I

7、D或者大小错误。检查主机发送一个正确的序列READ_REG_INVALIDCCS811收到一个I2C读请求,对应的邮箱ID是无效的。检查主机发送目的序列MEASMODE_INVALIDCCS811收到I2C对MEAS_MODE不支持的写模式检查主机写一个支持模式MAX_RESISTANCE氧化物材料不再正常运行,可能是:*坏了 *非常环境 *加热器不操作检查加热器故障标志确保传感器在一个典型的大气和记录任何传感器可能以前见过的环境 HEATER_FAULT焊接,PCB或损坏问题检查焊接。在一个无源的板块上5和6之间应该有大约的38欧姆。HEATER_SUPPLY焊接或PCB的问题检查焊接。在一

8、个无源的板块上5和6之间应该有大约的38欧姆。错误ID寄存器在下列情况下将会清空: 应用程序软件在I2 C接口上执行读取错误寄存器操作。 应用软件执行SW_RESET序列通过给SW_RESET邮箱编写相应的代码。 触发复位功能 发出nRESET信号可能超过1错误标志设置在这个寄存器,因此每次读这个寄存器时应用软件应该单独检查每一位。下面的例子将使用下面的伪代码来帮助说明CCS811所必需的功能和编程。#define STATUS_REG 0x00#define MEAS_MODE_REG 0x01#define ALG_RESULT_DATA 0x02#define ENV_DATA 0x05

9、#define NTC_REG 0x06#define THRESHOLDS 0x10#define BASELINE 0x11#define HW_ID_REG 0x20#define ERROR_ID_REG 0xE0#define APP_START_REG 0xF4#define SW_RESET 0xFF#define CCS_811_ADDRESS 0x5A#define GPIO_WAKE 0x5#define DRIVE_MODE_IDLE 0x0#define DRIVE_MODE_1SEC 0x10#define DRIVE_MODE_10SEC 0x20#define D

10、RIVE_MODE_60SEC 0x30#define INTERRUPT_DRIVEN 0x8#define THRESHOLDS_ENABLED 0x4u8 i2c_buff8;bool wake_gpio_enabled = true;void 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,

11、来支持传输数据和接收数据。为了便于说明,假设读事务之前不会自动执行设置写。一些环境抽象这个API。I2 C功能原型基本是不言自明的: u8 address:这个参数的值是CCS811地址(CCS_811_ADDRESS)。 u8 register:这个参数是邮箱ID u8 rx_data_ptr/tx_data_ptr:指向缓冲区的指针调用函数将在那里访问数据,写入CCS811或存储读取CCS811的数据,i2c_buff在下面大部分的例子中gpio_write函数使用的主机写GPIO输出(输入CCS811)逻辑高或低电平。其参数如下所述: u8 gpio_id:GPIO数写到逻辑高或低。 u

12、8 gpio_id:0为逻辑低,1用于逻辑高。更多信息可参考如何使用它,可参考Handling nWAKE Using a GPIO文档。为简单起见,这例子不显任何物理层的处理操作,例如I2C中止和超时。CCS811 I2C数据字节顺序当读写多个字节的用户必须注意CCS811使用的字节顺序。CCS811假定最重要级别的字节排在较小的重要性字节的前面。例如阅读一个16位标量值为0 x11aa,总线上值为0x11的字节出现在字节0 xaa之前。I2C写事务在预期的操作模式,主机必须执行I2C写事务来使能和配置传感器。当编写一个邮箱时,例如MEAS_MODE寄存器1 s驱动模式和中断启用时,用户软件

13、将以类似的方式执行下面的代码示例:i2c_buff0 = DRIVE_MODE_1SEC | INTERRUPT_DRIVEN;i2c_write(CCS_811_ADDRESS, MEAS_MODE_REG, i2c_buff, 1);如果这事务在协议分析仪看起来类似图2所示:注意,I2C的地址占据了最重要的7位的第一个字节传输。最不重要的比特表明分别写或读一个逻辑0或逻辑1。这是一个写,因此为什么这样的字节为0 xb4 (i.e. 0x5A thresh_low;i2c_write(CCS_811_ADDRESS, THRESHOLDS, temp_ptr, 5);.i2c_buff0 =

14、 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阈值寄存器的默认值如下,如果应用程序总是使用这些值,可以不要求写阈值寄存器: LOW_THRESHOLD =

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

16、o_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(CCS_811_ADDRESS, i2c_buff, 4);if(wake_gpio_enabled)gpi

17、o_write(GPIO_WAKE, 1); / disable wake首先启用nWAKE通过编写逻辑电平零给GPIO,如果这个信号是由GPIO控制注意目前的代码检查。如果没有可用的GPIO那么nWAKE必须被拉低。然后读状态寄存器,看看数据是否已经准备好了。当数据准备好,eCO2和TVOC结果是通过执行读ALG_RESULT_DATA。最后,nWAKE是禁用的。该软件可以处理数据根据在i2c_buff位置的eCO2和TVOC的结果。禁用CCS811为了禁用传感器和在尽可能低功耗模式(同时连接电源电压V DD),可以用如下:if(wake_gpio_enabled)gpio_write(GP

18、IO_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信号可以被放置在其不活动的状态,因此任何I2C命令都不会处理。为了“捕猎”, 传感器nWAKE应该被定义,适当的驱动模式包括中断,如果使用,应该写入MEAS_MODE。禁用传

19、感器的另一个方法,通过编写SW_RESET邮箱重置解锁序列。这序列,如下面的代码示例所示(处理为简单起见没有显示nWAKE):u8 soft_reset_code = 0x11, 0xE5, 0x72, 0x8A;i2c_write(CCS_811_ADDRESS, SW_RESET, soft_reset_code, 4);这将重置CCS811和把它放在引导模式,准备重新编程。CCS811时间注意事项CCS811数据表CC-DS,列表的时间参数,程序员必须遵守。未能满足这些时间参数可能导致初始化失败。CCS811可能在I2C上返回NAK。典型的流程是系统执行一个I2C设置写随后很快读I2C,

20、具体代码示例如下:i2c_write(CCS_811_ADDRESS, STATUS_REG, i2c_buff, 0);i2c_read(CCS_811_ADDRESS, i2c_buff, 1);void i2c_write(ARGS)gpio_write(GPIO_WAKE, 0); / enable wake.I2C_WRITE_HW_REG();.gpio_write(GPIO_WAKE, 1); / disable wakevoid i2c_read(ARGS)gpio_write(GPIO_WAKE, 0); / enable wake.I2C_READ_HW_REG();.gp

21、io_write(GPIO_WAKE, 1); / disable wake上面显示了状态寄存器设置写入,单个字节读紧随其后。注意I2C的读和写功能分别使用和禁用nWAKE。这样做是尽可能的接近物理I2C事务,并实现能耗最小。无论如何在数据表中的时间需要遵守。例如T AWAKE被定义为50s,为确保这实现,提供的软件必须至少使nWAKE延迟50s。假设我们有一个例行公事,可以利用等待(DELAY_US),提供延迟功能,以增加微秒数:void i2c_XXXXX(ARGS) / XXXXX = read or writegpio_write(GPIO_WAKE, 0); / enable wak

22、ewait(50); / ensure TAWAKE.I2C_XXXXX_HW_REG();.gpio_write(GPIO_WAKE, 1); / disable wakeT DWAKE是20us,这是nWAKE信号在I2C和CCS811之间最小的定义时间。如果i2c_write 程序定义nWAKE,随后i2c_read程序很快唤醒,可以打破这个时间。在 nWAKE后,为确保不违反了这个时间参数延迟程序可参见如下:void i2c_XXXXX(ARGS) / XXXXX = read or writewait(20); / ensure TDWAKEgpio_write(GPIO_WAKE,

23、 0); / enable wakewait(50); / ensure TAWAKE.I2C_XXXXX_HW_REG();.gpio_write(GPIO_WAKE, 1); / disable wake它可以放在在nWAKE定义之前,或者直接放在定义好的在I2C例行程序nWAKE中。以类似的方式在脉冲nRESET或写SW_RESET或开启时,驱动器不能违反时间参数T START 和 T RESET要求。处理环境参数ENV_DATA(0 x05)CCS811支持补偿相对湿度和环境温度,ENV_DATA寄存器可以在每个周期更新温度和湿度(TH)值。为了避免浮点运算,一个典型的TH传感器将一个

24、值代表几个数量级。例如42.348%的湿度阅读将存储在一个传感器的H,结果登记为42348。CCS811支持7位域和9位分数的湿度,紧随其后的是7位和9位分数温度。Byte 0Byte 1Byte 2Byte 3Humidity High ByteHumidity Low ByteTemperature HighByteTemperature Low ByteHumidity % Humidity % FractionTemp + 25C Temp + 25C FractionTH传感器的数据格式必须映射到ENV_DATA格式如表9所示:环境寄存器字段和字节顺序。为了把湿度值放在I 2 C b

25、uffer中, i2c_buff在开始阶段,用户可以创建类似下面的例程程序:i2c_buff0 = (RH % 1000) / 100) 7 ? (RH/1000 + 1)1 : (RH/1000) 2 & (RH % 1000) / 100) 7 ? (TEMP/1000 + 1)1 : (TEMP/1000) 2 & (TEMP % 1000) / 100) 8)i2c_buff2 |= 1;粗体代码负责数据表,要求写入当前临时值+ 25 到ENV_DATA温度寄存器。为了编程ENV_DATA,用户代码可以参考如下代码:u32 TEMP, RH;read_temp_hum_sensor(T

26、EMP, RH);ccs811_temp_hum_convert(TEMP, RH);i2c_write(CCS_811_ADDRESS, ENV_DATA, i2c_buff, 4);ccs811_temp_hum_convert结合上面所示的两个例子,使从RH提取的值变成CCS811 ENV_DATA寄存器所要求的格式(存储在i2c_buff)。在此之后,用户可以编程ENV_DATA使传感器在正常方式使用i2c_write例行程序。如果应用程序支持温度或湿度补偿,但不能两者兼顾,那么对应不支持的环境参数数据表的默认值必须写入寄存器。用户不能往不支持的温度或湿度场的ENV_DATA寄存器里写

27、0。利用NTC(0 x06)来计算温度CCS811 AUX针连接外部信号到CCS811的一个ADC。因此可以采用带NTC热敏电阻的分压器电路来实现,这允许用户计算环境温度。NTC寄存器的格式如下所示:NTC寄存器可通过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返回的值可以用来计算热敏电阻的阻值,这个方程可以计算出电阻值

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

29、ASELINE寄存器。BASELINE寄存器可以阅读和存储它的值如下:u8 baseline_reg2; / storage for baseline value in clean airif(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参数写回到

30、BASELINE寄存器:i2c_write(CCS_811_ADDRESS, BASELINE, baseline_reg, 2);将baseline_reg寄存器中的2字节数据写入CCS811的BASELINE寄存器,设置CCS811 BASELINE寄存器在干净空气中的电阻。它通常是每次CCS811上电传感器已经稳定后被写入。 当CCS811MEAS_MODEDRIVE_MODE不在空闲状态时,BASELINE寄存器才能被写入。由于金属氧化物传感器有漂移,建议新的清洁BASELINE寄存器定期存储。主机处理器字节顺序为了处理eCO 2和TVOC的值,需要知道主处理器的对齐方式。前面i2c_buff加载为: i2c_buff0 = 0x01 i2c_buff1 = 0x90 i2c_buff2 =

温馨提示

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

评论

0/150

提交评论