版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
CCS811編程和端口指南簡(jiǎn)介:這篇應(yīng)用說(shuō)明詳細(xì)表達(dá)了為劍橋CMOS傳感器CCS811數(shù)字瓦斯傳感器的程序設(shè)計(jì)模型和推薦的端口技術(shù)。它告訴軟件開(kāi)發(fā)商如何把CCS811設(shè)備和另一個(gè)內(nèi)核〔例如一個(gè)傳感芯片,傳感整合器,,平板電腦或者數(shù)字顯示設(shè)備〕集成到一個(gè)環(huán)境。它詳細(xì)表達(dá)了用戶軟件如何接通,控制,使用和停止這傳感器。CCS811設(shè)備硬件概述:CCS811框圖如圖一下所示:數(shù)字主機(jī)接口采用I2C總線。所有預(yù)先帶有“n〞的信號(hào)為低電平有效并可選的,除了nWAKE管腳〔信號(hào)〕。如果不用它們可以置高電平。特別強(qiáng)調(diào)的是nWAKE輸入信號(hào)是由一個(gè)軟件可配置的GPIO管腳控制的敏感應(yīng)用程序來(lái)控制。在應(yīng)用程序的電平并不是一個(gè)主要問(wèn)題,它可以讓nWAKE接地。CCS811中配置和提取樣本是通過(guò)主機(jī)在I2C接口中發(fā)出處理信號(hào)到CCS811中專門的地址來(lái)完成的。傳感器可以工作在輪詢方式,或者當(dāng)它讀取了一個(gè)eCO2讀數(shù)或到達(dá)一個(gè)臨界值時(shí)可以發(fā)出一個(gè)中斷在nINT上。程序設(shè)計(jì)模型為了靈活性和軟件驅(qū)動(dòng)程序維護(hù)簡(jiǎn)化CCS811不支持在I2C總線上直接尋址的存放器。相反,它支持單個(gè)字節(jié)郵箱,來(lái)代替這些有特定功能和數(shù)據(jù)大小的存放器。訪問(wèn)一個(gè)存放器,一個(gè)I2C傳遞必須和引用CCS811上的目標(biāo)地址且二者保持一致一同發(fā)出。當(dāng)對(duì)CCS811進(jìn)行讀寫操作時(shí),所有I2C事務(wù)必須使用7位地址0x5A(I2C_ADDRlow)或者0x5B(I2C_ADDRhigh)。CCS811存放器圖紙如表一所示。狀態(tài)存放器(0x00)下表簡(jiǎn)述了狀態(tài)存放器中的各位:76543210FW_MODE--APP_VALIDDATA_READY--ERROR表3:狀態(tài)存放器字段,表達(dá)了存放器中各位功能:BITSFIELDDESCRIPTION7FW_MODE0:固件處于引導(dǎo)模式,并允許新固件加載1:固件是在應(yīng)用程序模式。CCS811準(zhǔn)備好ADC測(cè)量6:5保存位4APP_VALID0:沒(méi)有應(yīng)用程序固件加載1:有效的應(yīng)用程序加載固件3DATA_READY0:沒(méi)有新數(shù)據(jù)樣本已經(jīng)準(zhǔn)備好1:一個(gè)新的數(shù)據(jù)樣本在ALG_RESULT_DATA,這位在ALG_RESULT_DATA讀I2C接口時(shí)清零。2:1保存位0ERROR0:沒(méi)有錯(cuò)誤發(fā)生在I2C或傳感器1:有錯(cuò)誤發(fā)生在I2C或傳感器,ERROR_ID存放器包含在源錯(cuò)誤里表4:測(cè)量模式存放器,表示了在測(cè)量模式存放器中的字段。76:43210-DRIVE_MODEINTERRUPTTHRESH--下表詳細(xì)描述了在測(cè)量模式存放器各字段。BITSFIELDDESCIPTION7保存6:4DRIVE_MODE000:閑置,不開(kāi)啟測(cè)量,這是最低電平模式。001:IAQMode1–A,每秒鐘執(zhí)行測(cè)量。010:IAQMode2–A,每10秒執(zhí)行測(cè)量。011:IAQMode3–A,每60秒執(zhí)行測(cè)量。100:IAQMode4–RawDataMode.外部算法,每隔250毫秒測(cè)量,例如酒精檢測(cè)。一個(gè)新樣值被放在ALG_RESULT_DATA和RAW_DATA存放器中。狀態(tài)存放器中的DATA_READY位設(shè)定測(cè)量的時(shí)間間隔。3INTERRUPT0:中斷生成是禁用的。1:當(dāng)一個(gè)新信號(hào)已經(jīng)存在ALG_RESULT_DATA中時(shí),nINT信號(hào)宣稱低驅(qū)動(dòng)。當(dāng)ALG_RESULT_DATA被I2C端口讀數(shù)時(shí),就會(huì)停止并置為低電平。2THRESH0:中斷方式是程序在MEAS_MODE中斷。1:如果MEAS_MODE[INTERRUPT]=1,當(dāng)ALG_RESULT_DATAeCO2讀取一個(gè)閾值的時(shí)候設(shè)置在THRESHOLDS存放器,這位使得CCS811發(fā)出nINT信號(hào),而不只是延遲。1:0保存位表6:錯(cuò)誤ID存放器,表示了錯(cuò)誤ID存放器的字段。7:6543210HEATERSUPPLYHEATERFAULTMAXRESISTANCEMEASMODEINVALIDREAD_REGINVALIDMSGINVALID表7:錯(cuò)誤ID存放器的原因和反響,描述了在錯(cuò)誤ID存放器中的字段和反響,當(dāng)STATUS[ERROR]=1時(shí),存放器是非0.。錯(cuò)誤潛在原因推薦行動(dòng)MSG_INVALIDCCS811收到一個(gè)I2C向本站的寫請(qǐng)求,但是郵箱ID或者大小錯(cuò)誤。檢查主機(jī)發(fā)送一個(gè)正確的序列READ_REG_INVALIDCCS811收到一個(gè)I2C讀請(qǐng)求,對(duì)應(yīng)的郵箱ID是無(wú)效的。檢查主機(jī)發(fā)送目的序列MEASMODE_INVALIDCCS811收到I2C對(duì)MEAS_MODE不支持的寫模式檢查主機(jī)寫一個(gè)支持模式MAX_RESISTANCE氧化物材料不再正常運(yùn)行,可能是:*壞了*非常環(huán)境*加熱器不操作檢查加熱器故障標(biāo)志確保傳感器在一個(gè)典型的大氣和記錄任何傳感器可能以前見(jiàn)過(guò)的環(huán)境HEATER_FAULT焊接,PCB或損壞問(wèn)題檢查焊接。在一個(gè)無(wú)源的板塊上5和6之間應(yīng)該有大約的38歐姆。HEATER_SUPPLY焊接或PCB的問(wèn)題檢查焊接。在一個(gè)無(wú)源的板塊上5和6之間應(yīng)該有大約的38歐姆。錯(cuò)誤ID存放器在以下情況下將會(huì)清空:●應(yīng)用程序軟件在I2C接口上執(zhí)行讀取錯(cuò)誤存放器操作?!駪?yīng)用軟件執(zhí)行SW_RESET序列通過(guò)給SW_RESET郵箱編寫相應(yīng)的代碼?!裼|發(fā)復(fù)位功能●發(fā)出nRESET信號(hào)可能超過(guò)1錯(cuò)誤標(biāo)志設(shè)置在這個(gè)存放器,因此每次讀這個(gè)存放器時(shí)應(yīng)用軟件應(yīng)該單獨(dú)檢查每一位。下面的例子將使用下面的偽代碼來(lái)幫助說(shuō)明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_ENABLED0x4u8i2c_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);偽代碼使用全局?jǐn)?shù)組,i2c_buff,來(lái)支持傳輸數(shù)據(jù)和接收數(shù)據(jù)。為了便于說(shuō)明,假設(shè)讀事務(wù)之前不會(huì)自動(dòng)執(zhí)行設(shè)置寫。一些環(huán)境抽象這個(gè)API。I2C功能原型根本是不言自明的:●u8address:這個(gè)參數(shù)的值是CCS811地址(CCS_811_ADDRESS)?!駏8register:這個(gè)參數(shù)是郵箱ID●u8rx_data_ptr/tx_data_ptr:指向緩沖區(qū)的指針調(diào)用函數(shù)將在那里訪問(wèn)數(shù)據(jù),寫入CCS811或存儲(chǔ)讀取CCS811的數(shù)據(jù),i2c_buff在下面大局部的例子中g(shù)pio_write函數(shù)使用的主機(jī)寫GPIO輸出(輸入CCS811)邏輯高或低電平。其參數(shù)如下所述:●u8gpio_id:GPIO數(shù)寫到邏輯高或低?!駏8gpio_id:0為邏輯低,1用于邏輯高。更多信息可參考如何使用它,可參考HandlingnWAKEUsingaGPIO文檔。為簡(jiǎn)單起見(jiàn),這例子不顯任何物理層的處理操作,例如I2C中止和超時(shí)。CCS811I2C數(shù)據(jù)字節(jié)順序當(dāng)讀寫多個(gè)字節(jié)的用戶必須注意CCS811使用的字節(jié)順序。CCS811假定最重要級(jí)別的字節(jié)排在較小的重要性字節(jié)的前面。例如閱讀一個(gè)16位標(biāo)量值為0x11aa,總線上值為0x11的字節(jié)出現(xiàn)在字節(jié)0xaa之前。I2C寫事務(wù)在預(yù)期的操作模式,主機(jī)必須執(zhí)行I2C寫事務(wù)來(lái)使能和配置傳感器。當(dāng)編寫一個(gè)郵箱時(shí),例如MEAS_MODE存放器1s驅(qū)動(dòng)模式和中斷啟用時(shí),用戶軟件將以類似的方式執(zhí)行下面的代碼例如:i2c_buff[0]=DRIVE_MODE_1SEC|INTERRUPT_DRIVEN;i2c_write(CCS_811_ADDRESS,MEAS_MODE_REG,i2c_buff,1);如果這事務(wù)在協(xié)議分析儀看起來(lái)類似圖2所示:注意,I2C的地址占據(jù)了最重要的7位的第一個(gè)字節(jié)傳輸。最不重要的比特說(shuō)明分別寫或讀一個(gè)邏輯0或邏輯1。這是一個(gè)寫,因此為什么這樣的字節(jié)為0xb4(i.e.0x5A<<1=0xB4)。下一個(gè)字節(jié)的是郵箱MEAS_MODE的ID,最后的數(shù)據(jù)0x18(DRIVE_MODE=1s,中斷使能)是用來(lái)寫到MEAS_MODE郵箱存放器的。I2C讀事務(wù)I2C讀事務(wù)在讀之前必須設(shè)置寫,啟用目標(biāo)郵箱。這最好用一個(gè)例子來(lái)說(shuō)明。假設(shè)用戶需要讀取狀態(tài)存放器,例如代碼如下:i2c_write(CCS_811_ADDRESS,STATUS_REG,i2c_buff,0);i2c_read(CCS_811_ADDRESS,i2c_buff,1);查看這個(gè)協(xié)議分析儀:圖3表示了設(shè)置寫入郵箱0x00確保以后所有讀事務(wù)確定目標(biāo)狀態(tài)存放器。注意在這個(gè)實(shí)例中寫入數(shù)據(jù)的大小為0字節(jié),因此i2c_buff數(shù)組不需要寫入任何數(shù)據(jù)。讀取命令中包含的數(shù)據(jù)的大小在這個(gè)郵箱的存放器中,在這里為1字節(jié)。i2c_read函數(shù)將存儲(chǔ)i2c_buff[0]狀態(tài)存放器的值即0x98,根據(jù)狀態(tài)存放器中字段的數(shù)值,用戶軟件可以做出相應(yīng)的反響。硬件ID(0x20)存放器處理硬件ID存放器,有時(shí)成為“我是誰(shuí)〞存放器,可以在CCS811初始化時(shí)被讀取以確保這設(shè)備確實(shí)是CCS811。當(dāng)這個(gè)郵箱為讀取的目標(biāo),其代理的存放器將返回值0x81。讀這個(gè)存放器的主機(jī)軟件將執(zhí)行以下: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;設(shè)置寫郵箱HW_ID先于實(shí)際閱讀代理存放器。每次讀字節(jié)長(zhǎng)度為1字節(jié),它必須返回0x81i2c_buff數(shù)組,否那么設(shè)備將不會(huì)被主機(jī)的軟件配置。由此產(chǎn)生的事務(wù)在I2C會(huì)出現(xiàn)如下協(xié)議分析儀截圖如圖4所示::APP_START(0xf4)處理:郵箱ID為0xF4,APP_START,用于CCS811從啟動(dòng)過(guò)渡到應(yīng)用程序模式狀態(tài)。請(qǐng)注意這個(gè)郵箱的代理存放器大小為0字節(jié)。因此觸發(fā)狀態(tài)轉(zhuǎn)換設(shè)置所需要的是不寫數(shù)據(jù)。一個(gè)典型的流程如下: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);首先讀取狀態(tài)存放器和APP_VALID標(biāo)志檢查。如果沒(méi)有設(shè)置一個(gè)錯(cuò)誤條件返回和有效應(yīng)用程序固件應(yīng)該下載到CCS811。如果有有效的固件,然后設(shè)置寫APP_START郵箱,將CCS811從引導(dǎo)狀態(tài)過(guò)渡到應(yīng)用程序模式。邏輯分析儀捕獲說(shuō)明了應(yīng)用程序已經(jīng)啟動(dòng)之前傳感器的狀態(tài):圖5顯示了狀態(tài)存放器返回值0x10,這說(shuō)明存在一個(gè)有效的應(yīng)用程序但傳感器還在啟動(dòng)模式。I2C總線的下一個(gè)事務(wù)是一個(gè)設(shè)置寫郵箱0xf4,注意因?yàn)锳PP_START郵箱沒(méi)有底層存放器所以大小為零。后續(xù)讀取狀態(tài)存放器的返回值為0x90,即這有一個(gè)有效的應(yīng)用程序和傳感器是應(yīng)用程序模式。DATA_READY標(biāo)志將保持零到一個(gè)有效的驅(qū)動(dòng)模式寫入MEAS_MODE存放器。下載固件到CCS811的信息,請(qǐng)參閱cc-000922執(zhí)行應(yīng)用程序二進(jìn)制代碼文件下載。主機(jī)軟件輪詢方式傳感器的一個(gè)操作方式是輪詢模式。在這種模式下所需的主機(jī)軟件是周期性,在同一時(shí)期從傳感器讀取數(shù)據(jù)的程序驅(qū)動(dòng)模式。一個(gè)定時(shí)器中斷在主機(jī)應(yīng)用程序可以用來(lái)讀取傳感器的eCO2和TVOC的值。下面可以看到一個(gè)典型的例子: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;讀取狀態(tài)存放器監(jiān)察數(shù)據(jù)是否準(zhǔn)備好了,如果數(shù)據(jù)已經(jīng)準(zhǔn)備好了,eCO2和TVOC結(jié)果被通過(guò)執(zhí)行一個(gè)4字節(jié)數(shù)據(jù)讀取ALG_RESULT_DATA閱讀。該軟件可以根據(jù)i2c_buff位置的eCO2和TVOC的結(jié)果處理數(shù)據(jù)。協(xié)議分析器將顯示類似于圖6的圖像:根本地設(shè)置寫和后續(xù)讀1個(gè)字節(jié)到郵箱0x0去檢查數(shù)據(jù)的狀態(tài)是否準(zhǔn)備好。接下來(lái)設(shè)置寫到郵箱0x2和一個(gè)4字節(jié)讀取。數(shù)據(jù)將存儲(chǔ)在i2c_buff具體過(guò)程如下:i2c_buff[0]=0x01i2c_buff[1]=0x90i2c_buff[2]=0x00i2c_buff[3]=0x32注意,i2c_buff[0]和i2c_buff[1]值應(yīng)該轉(zhuǎn)換為16位0x0190類型字段的值〔10進(jìn)制400〕,這是當(dāng)前eCO2讀取傳感器.。同樣的字節(jié)值i2c_buff[2]和i2c_buff[3]應(yīng)該轉(zhuǎn)換為16位值0x0032這是TVOC,相當(dāng)于10進(jìn)制50。這個(gè)例子假定從ALG_RESULT_DATA讀取4個(gè)字節(jié)的數(shù)據(jù)。從ALG_RESULT_DATA可以讀到八個(gè)字節(jié)。表8所示的格式:ALG_RESULT_DATA格式。Byte:0:12:3456:7Parameter:ECO2TVOCSTATUSERROR_IDRAW_DATA用戶可以定義一個(gè)結(jié)構(gòu)來(lái)保存這些數(shù)據(jù)具體如下:typedefstruct{u16eco2;u16tvoc;u8status;u8error_id;u16raw_data;}ccs811_measurement_t;這種結(jié)構(gòu)的基地址可以通過(guò)一個(gè)字符指針作為地址,由i2c_read常規(guī)從傳感器讀取數(shù)據(jù)作為地址?;蛘邤?shù)據(jù)可以以當(dāng)前i2c_buff復(fù)制到這個(gè)結(jié)構(gòu)里。當(dāng)用i2c_read函數(shù)訪問(wèn)數(shù)據(jù)寫入i2c_buff時(shí),必須注意與處理器字節(jié)順序。禁用中斷閾值讀取數(shù)據(jù)只要新數(shù)據(jù)準(zhǔn)備和MEAS_MODE(中斷)字節(jié)設(shè)置好,nINT信號(hào)被CCS811置為低電平。主機(jī)的CSS811驅(qū)動(dòng)器可以給主機(jī)應(yīng)用程序的O/S提供一個(gè)回調(diào)函數(shù),這回調(diào)函數(shù)是反響與nINT輸出信號(hào)相連接的GPIO信號(hào)。當(dāng)nINT信號(hào)宣稱回調(diào)函數(shù)是需要的,然后從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;}這不需要檢查數(shù)據(jù)是否準(zhǔn)備好。中斷的發(fā)布說(shuō)明新的數(shù)據(jù)樣本已經(jīng)準(zhǔn)備好了。協(xié)議分析器將顯示類似的I2C事務(wù)具體如圖7所示:nINT線路由CCS811定義,短時(shí)間之后主機(jī)應(yīng)用程序執(zhí)行一個(gè)設(shè)置寫郵0x2,ALG_RESULT_DATA調(diào)用回調(diào)函數(shù)。然后回調(diào)例程執(zhí)行一個(gè)4字節(jié)讀,eCO2和TVOC讀數(shù)結(jié)果存儲(chǔ)到i2c_buff位置。閱讀閾值中斷數(shù)據(jù)當(dāng)eCO2閱讀低或高閾值時(shí),可以在CCS811上編程,使nINT信號(hào)產(chǎn)生一個(gè)中斷。如果閾值超過(guò)一個(gè)可編程的滯后值,硬件將只會(huì)觸發(fā)中斷。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;i2c_write(CCS_811_ADDRESS,MEAS_MODE_REG,i2c_buff,1);使能驅(qū)動(dòng)模式之前用戶必須編程所需的低和高閾值在閾值的存放器里。這可以通過(guò)定義和聲明threshold_reg結(jié)構(gòu)如上圖所示。它可以用于存放閾值存放器的值。結(jié)構(gòu)的底部可以把一個(gè)指針指向字符,例如可以是i2c_write函數(shù)調(diào)用中tx_data_ptr的參數(shù)。CCS811閾值存放器的默認(rèn)值如下,如果應(yīng)用程序總是使用這些值,可以不要求寫閾值存放器:LOW_THRESHOLD=1500ppmHIGH_THRESHOLD=2500ppmHYSTERESIS=50ppm如果只需要一個(gè)閾值,低和高閾值可以配置為相同的值,也可以在執(zhí)行中改變閾值存放器。使用GPIO處理nWAKE有兩個(gè)方法處理nWAKE:通??偸抢?。使用GPIO動(dòng)態(tài)的控制斷言和deassertion無(wú)效。當(dāng)?shù)碗娖絥WAKE信號(hào)斷言CCS811集成處理器是在運(yùn)行的,將處理I2C接口上的請(qǐng)求。當(dāng)這個(gè)銷邏輯高CCS811進(jìn)入睡眠模式,所有I2C請(qǐng)求被忽略。因此,當(dāng)這個(gè)信號(hào)由GPIO動(dòng)態(tài)控制,它可以有效地控制CCS811能耗。在敏感的應(yīng)用程序中永不推薦nWAKE置低。if(wake_gpio_enabled)gpio_write(GPIO_WAKE,0);//enablewakei2c_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);}if(wake_gpio_enabled)gpio_write(GPIO_WAKE,1);//disablewake首先啟用nWAKE通過(guò)編寫邏輯電平零給GPIO,如果這個(gè)信號(hào)是由GPIO控制注意目前的代碼檢查。如果沒(méi)有可用的GPIO那么nWAKE必須被拉低。然后讀狀態(tài)存放器,看看數(shù)據(jù)是否已經(jīng)準(zhǔn)備好了。當(dāng)數(shù)據(jù)準(zhǔn)備好,eCO2和TVOC結(jié)果是通過(guò)執(zhí)行讀ALG_RESULT_DATA。最后,nWAKE是禁用的。該軟件可以處理數(shù)據(jù)根據(jù)在i2c_buff位置的eCO2和TVOC的結(jié)果。禁用CCS811為了禁用傳感器和在盡可能低功耗模式〔同時(shí)連接電源電壓VDD〕,可以用如下:if(wake_gpio_enabled)gpio_write(GPIO_WAKE,0);//enablewakei2c_buff[0]=DRIVE_MODE_IDLE;i2c_write(CCS_811_ADDRESS,MEAS_MODE_REG,i2c_buff,1);if(wake_gpio_enabled)gpio_write(GPIO_WAKE,1);//disablewake在空閑狀態(tài),根本上驅(qū)動(dòng)代碼應(yīng)該在MEAS_MODE驅(qū)動(dòng)模式禁用傳感器的讀數(shù)。nWAKE信號(hào)可以被放置在其不活動(dòng)的狀態(tài),因此任何I2C命令都不會(huì)處理。為了“捕獵〞,傳感器nWAKE應(yīng)該被定義,適當(dāng)?shù)尿?qū)動(dòng)模式包括中斷,如果使用,應(yīng)該寫入MEAS_MODE。禁用傳感器的另一個(gè)方法,通過(guò)編寫SW_RESET郵箱重置解鎖序列。這序列,如下面的代碼例如所示〔處理為簡(jiǎn)單起見(jiàn)沒(méi)有顯示nWAKE〕:u8soft_reset_code[]={0x11,0xE5,0x72,0x8A};i2c_write(CCS_811_ADDRESS,SW_RESET,soft_reset_code,4);這將重置CCS811和把它放在引導(dǎo)模式,準(zhǔn)備重新編程。CCS811時(shí)間考前須知CCS811數(shù)據(jù)表CC-000619-DS,列表的時(shí)間參數(shù),程序員必須遵守。未能滿足這些時(shí)間參數(shù)可能導(dǎo)致初始化失敗。CCS811可能在I2C上返回NAK。典型的流程是系統(tǒng)執(zhí)行一個(gè)I2C設(shè)置寫隨后很快讀I2C,具體代碼例如如下:i2c_write(CCS_811_ADDRESS,STATUS_REG,i2c_buff,0);i2c_read(CCS_811_ADDRESS,i2c_buff,1);voidi2c_write(ARGS){gpio_write(GPIO_WAKE,0);//enablewake...I2C_WRITE_HW_REG();...gpio_write(GPIO_WAKE,1);//disablewake}voidi2c_read(ARGS){gpio_write(GPIO_WAKE,0);//enablewake...I2C_READ_HW_REG();...gpio_write(GPIO_WAKE,1);//disablewake}上面顯示了狀態(tài)存放器設(shè)置寫入,單個(gè)字節(jié)讀緊隨其后。注意I2C的讀和寫功能分別使用和禁用nWAKE。這樣做是盡可能的接近物理I2C事務(wù),并實(shí)現(xiàn)能耗最小。無(wú)論如何在數(shù)據(jù)表中的時(shí)間需要遵守。例如TAWAKE被定義為50μs,為確保這實(shí)現(xiàn),提供的軟件必須至少使nWAKE延遲50μs。假設(shè)我們有一個(gè)例行公事,可以利用等待(DELAY_US),提供延遲功能,以增加微秒數(shù):voidi2c_XXXXX(ARGS){//XXXXX=readorwritegpio_write(GPIO_WAKE,0);//enablewakewait(50);//ensureTAWAKE...I2C_XXXXX_HW_REG();...gpio_write(GPIO_WAKE,1);//disablewakeTDWAKE是20us,這是nWAKE信號(hào)在I2C和CCS811之間最小的定義時(shí)間。如果i2c_write程序定義nWAKE,隨后i2c_read程序很快喚醒,可以打破這個(gè)時(shí)間。在nWAKE后,為確保不違反了這個(gè)時(shí)間參數(shù)延遲程序可參見(jiàn)如下:voidi2c_XXXXX(ARGS){//XXXXX=readorwritewait(20);//ensureTDWAKEgpio_write(GPIO_WAKE,0);//enablewakewait(50);//ensureTAWAKE...I2C_XXXXX_HW_REG();...gpio_write(GPIO_WAKE,1);//disablewake它可以放在在nWAKE定義之前,或者直接放在定義好的在I2C例行程序nWAKE中。以類似的方式在脈沖nRESET或?qū)慡W_RESET或開(kāi)啟時(shí),驅(qū)動(dòng)器不能違反時(shí)間參數(shù)TSTART和TRESET要求。處理環(huán)境參數(shù)ENV_DATA(0x05)CCS811支持補(bǔ)償相對(duì)濕度和環(huán)境溫度,ENV_DATA存放器可以在每個(gè)周期更新溫度和濕度(TH)值。為了防止浮點(diǎn)運(yùn)算,一個(gè)典型的TH傳感器將一個(gè)值代表幾個(gè)數(shù)量級(jí)。例如42.348%的濕度閱讀將存儲(chǔ)在一個(gè)傳感器的H,結(jié)果登記為42348。CCS811支持7位域和9位分?jǐn)?shù)的濕度,緊隨其后的是7位和9位分?jǐn)?shù)溫度。Byte0Byte1Byte2Byte3HumidityHighByteHumidityLowByteTemperatureHighByteTemperatureLowByte76543210765432107654321076543210Humidity%Humidity%FractionTemp+25°CTemp+25°CFractionTH傳感器的數(shù)據(jù)格式必須映射到ENV_DATA格式如表9所示:環(huán)境存放器字段和字節(jié)順序。為了把濕度值放在I2Cbuffer中,i2c_buff在開(kāi)始階段,用戶可以創(chuàng)立類似下面的例程程序:i2c_buff[0]=((RH%1000)/100)>7?(RH/1000+1)<<1:(RH/1000)<<1;i2c_buff[1]=0;if(((RH%1000)/100)>2&&(((RH%1000)/100)<8)){i2c_buff[0]|=1;}這個(gè)例程程序接受一個(gè)參數(shù):TH傳感器的濕度讀數(shù)。在此案例中,大于實(shí)際讀數(shù)3個(gè)數(shù)量級(jí)表示一個(gè)百分比。目前CCS811支持增量分?jǐn)?shù)值為0.5,因此只有最重要的局部字段需要設(shè)置。首先7位濕度值寫入i2c_buff[0]。這是通過(guò)使用三元運(yùn)算符檢查余數(shù)是否是0.8或0.09,這種情況RH值將被去除以便取整,否那么RH/1000將會(huì)被寫入i2c_buff[0]中的7位濕度字段來(lái)表示。驅(qū)動(dòng)器然后設(shè)置小數(shù)局部,它通過(guò)檢查是否余數(shù)字段的值包含在0.3到0.7之間〔小數(shù)點(diǎn)后最重要的數(shù)字?!橙绻堑脑?,小數(shù)最重要的比特就會(huì)被設(shè)定。以類似的方式例程程序?qū)囟鹊闹捣湃雐2c_buff可以由如下生成:TEMP+=25000;i2c_buff[2]=((TEMP%1000)/100)>7?(TEMP/1000+1)<<1:(TEMP/1000)<<1;i2c_buff[3]=0;if(((TEMP%1000)/100)>2&&(((TEMP%1000)/100)<8)){i2c_buff[2]|=1;}粗體代碼負(fù)責(zé)數(shù)據(jù)表,要求寫入當(dāng)前臨時(shí)值+25到ENV_DATA溫度存放器。為了編程ENV_DATA,用戶代碼可以參考如下代碼:u32TEMP,RH;read_temp_hum_sensor(TEMP,RH);ccs811_temp_hum_convert(TEMP,RH);i2c_write(CCS_811_ADDRESS,ENV_DATA,i2c_buff,4);ccs811_temp_hum_convert結(jié)合上面所示的兩個(gè)例子,使從RH提取的值變成CCS811ENV_DATA存放器所要求的格式〔存儲(chǔ)在i2c_buff〕。在此之后,用戶可以編程ENV_DATA使傳感器在正常方式使用i2c_write例行程序。如果應(yīng)用程序支持溫度或濕度補(bǔ)償,但不能兩者兼顧,那么對(duì)應(yīng)不支持的環(huán)境參數(shù)數(shù)據(jù)表的默認(rèn)值必須寫入存放器。用戶不能往不支持的溫度或濕度場(chǎng)的ENV_DATA存放器里寫0。利用NTC(0x06)來(lái)計(jì)算溫度CCS811AUX針連接外部信號(hào)到CCS811的一個(gè)ADC。因此可以采用帶NTC熱敏電阻的分壓器電路來(lái)實(shí)現(xiàn),這允許用戶計(jì)算環(huán)境溫度。NTC存放器的格式如下所示:NTC存放器可通過(guò)I2C接口讀數(shù)據(jù),通過(guò)如下類似的例如代碼:i2c_write(CCS_811_ADDRESS,NTC_REG,i2c_buff,0);i2c_read(CCS_811_ADDRESS,i2c_buff,4);根本方法是先寫再讀4個(gè)字節(jié)的數(shù)據(jù)到NTC郵箱。在AUX排針上可以得到ADC針采樣電壓。在i2c_buff返回的值可以用來(lái)計(jì)算熱敏電阻的阻值,這個(gè)方程可以計(jì)算出電阻值:請(qǐng)參閱CC-000925-ANConnectinganNTCThermistortotheCCS811來(lái)獲取關(guān)于從NTC郵箱讀取的電壓值來(lái)計(jì)算溫度的詳細(xì)信息。處理BASELINE存放器(0x11)BASELINE存放器可以用來(lái)保證CCS811在每次上電后運(yùn)行在穩(wěn)定的和連續(xù)的狀態(tài),不管環(huán)境空氣質(zhì)量如何〔例如,如果傳感器開(kāi)始在“臟〞空氣中〕。當(dāng)周圍的空氣是新鮮的,使用這個(gè)機(jī)制應(yīng)用軟件必須讀取和存儲(chǔ)基線存放器。當(dāng)使用CCS811所使用的格式編碼,BASELINE存放器值對(duì)主機(jī)應(yīng)用程序是無(wú)意義的。應(yīng)用軟件只需要讀取該值并存儲(chǔ)在本地。不發(fā)生強(qiáng)制性的寫入這個(gè)存放器,CCS811將自動(dòng)配置和管理其BASELINE存放器。BASELINE存放器可以閱讀和存儲(chǔ)它的值如下:u8baseline_reg[2];//storageforbaselinevalueincleanairif(air_is_clean(eCO2,CO2)){i2c_write(CCS_811_ADDRESS,BASELINE,baseline_reg,0);i2c_read(CCS_811_ADDRESS,baseline_reg,4);}程序?qū)⑴卸諝馐欠窀蓛簟H绻?,它?zhí)行寫入BASELINE存放器。然后讀一個(gè)2字節(jié)的參數(shù)到數(shù)組baseline_reg存放器中。因此baseline_reg參數(shù)寫回到BASELINE存放器
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 內(nèi)勤培訓(xùn)教學(xué)課件
- 幻想畫室活動(dòng)策劃方案(3篇)
- 牛皮癬廣告管理制度(3篇)
- 甲醇燃料灶使用管理制度(3篇)
- 短保食品管理制度(3篇)
- 空壓機(jī)氣體流量管理制度(3篇)
- 線上教學(xué)跟蹤管理制度內(nèi)容(3篇)
- 貴州獸藥陳列管理制度(3篇)
- 隔離期孕婦的管理制度(3篇)
- 《GA 1015-2012槍支去功能處理與展覽槍支安全防范要求》專題研究報(bào)告
- 年產(chǎn)6萬(wàn)噸環(huán)氧樹(shù)脂工藝設(shè)計(jì)
- 軌道線路養(yǎng)護(hù)維修作業(yè)-改道作業(yè)
- QB∕T 3826-1999 輕工產(chǎn)品金屬鍍層和化學(xué)處理層的耐腐蝕試驗(yàn)方法 中性鹽霧試驗(yàn)(NSS)法
- 北師大版五年級(jí)數(shù)學(xué)上冊(cè)第七單元《可能性》教案
- 2023-2024學(xué)年上海市閔行區(qū)四上數(shù)學(xué)期末綜合測(cè)試試題含答案
- 中等職業(yè)學(xué)校班主任能力比賽幼兒保育專業(yè)班級(jí)建設(shè)方案
- 解除勞動(dòng)合同證明電子版(6篇)
- 呼吸科規(guī)培疑難病例討論
- 《離子反應(yīng)》 第1課時(shí) 教學(xué)設(shè)計(jì)【高中化學(xué)必修1(人教版)】
- 有關(guān)中國(guó)居民死亡態(tài)度的調(diào)查報(bào)告
- 核對(duì)稿100和200單元概述
評(píng)論
0/150
提交評(píng)論