陳錫華,賈磊磊
(桂林航天工業(yè)高等??茖W(xué)校,桂林541004)
陳錫華(副教授),主要研究方向?yàn)闊o(wú)線通信技術(shù)、單片機(jī)技術(shù)應(yīng)用。
單總線溫度傳感器DS18B20采用單總線接口技術(shù),使系統(tǒng)布設(shè)傳感器線路少、連接方式簡(jiǎn)單。每個(gè)DS18B20都有唯一的64比特(包括8比特的CRC碼)序列號(hào),用以區(qū)別單總線上不同的溫度傳感器,對(duì)其訪問(wèn)有特殊的協(xié)議和嚴(yán)格的時(shí)序[1]。在多點(diǎn)溫度檢測(cè)系統(tǒng)應(yīng)用中,單總線上連接著批量(多個(gè))傳感器,系統(tǒng)必須掌握每個(gè)傳感器的序列號(hào),以實(shí)現(xiàn)對(duì)各個(gè)傳感器的操作。DS18B20溫度傳感器內(nèi)置溫度報(bào)警電路,溫度超出設(shè)置的上、下限溫度時(shí),將置報(bào)警標(biāo)志。對(duì)總線進(jìn)行報(bào)警搜索,實(shí)際上是對(duì)報(bào)警傳感器序列號(hào)的搜索。方便、快速地搜索到傳感器的序列號(hào)可以提高系統(tǒng)性能。
DS18B20數(shù)據(jù)輸出口與總線采用線與方式連接,多個(gè)傳感器輸出響應(yīng)將會(huì)在總線上產(chǎn)生線與的結(jié)果。進(jìn)行一次傳感器序列號(hào)搜索,是在系統(tǒng)對(duì)總線發(fā)布序列號(hào)搜索命令(0xf0)之后開(kāi)始的。從第一個(gè)比特到最后一個(gè)比特逐步進(jìn)行,每一比特操作按讀原碼、讀反碼、回寫(xiě)結(jié)果3個(gè)步驟完成。系統(tǒng)發(fā)出搜索命令之后,立即對(duì)第一個(gè)比特進(jìn)行操作,以后的各比特操作不再對(duì)總線發(fā)布序列號(hào)搜索命令,直接重復(fù)讀原碼、讀反碼、回寫(xiě)結(jié)果3個(gè)步驟直至完成序列號(hào)搜索[1-2]。
每一次回寫(xiě)比特后,讀取下一比特的原碼和反碼時(shí),只有序列號(hào)與前面所有回寫(xiě)比特都對(duì)應(yīng)相符的傳感器響應(yīng)總線;不相符的傳感器將端口切換為高阻,不再影響后面比特的搜索。搜索過(guò)程實(shí)際上是序列號(hào)排除過(guò)程,能對(duì)64個(gè)比特序列號(hào)都響應(yīng)的僅有一個(gè)傳感器。搜索過(guò)程結(jié)束后將獲得一個(gè)傳感器的序列號(hào)。DS18B20序列號(hào)前一個(gè)字節(jié)為0x28,搜索第一個(gè)字節(jié)時(shí),總線上的傳感器都會(huì)作出響應(yīng)。
設(shè)一次搜索過(guò)程中,系統(tǒng)第i次對(duì)總線操作獲得第i比特ai。從總線讀取傳感器響應(yīng)的原碼和補(bǔ)碼分別為Ai和Bi(i=0,1,2,…,63),其4種可能組合情況如表 1所列。表中AiBi=11的情況可作為搜索結(jié)束條件,01和10的情況下比特是確定的,00情況下表明存在多個(gè)傳感器,對(duì)其不同分支方向搜索可得到多個(gè)傳感器序列號(hào)。
表1 DS18B20序列號(hào)搜索讀取比特含義
對(duì)單總線上連接的批量傳感器進(jìn)行序列號(hào)搜索,將會(huì)出現(xiàn)AiBi=00的情形,出現(xiàn)序列號(hào)分支,該處分支比特稱為一個(gè)分支點(diǎn),分支點(diǎn)有取0和取1兩個(gè)分支方向;不同數(shù)量和不同傳感器,分支次數(shù)和分支的位置不同,搜索次數(shù)和搜索路徑無(wú)法預(yù)先確定[3-4]??紤]一個(gè)序列號(hào)的搜索路徑,若遇到分支點(diǎn)任意指定或按一定規(guī)律指定,都獲得一個(gè)序列號(hào)。DS18B20序列號(hào)的唯一性決定了一個(gè)序列號(hào)對(duì)應(yīng)一條唯一完整的搜索路徑。搜索算法必須考慮兩個(gè)方面:
①完整性。無(wú)遺漏搜索出總線上所有傳感器序列號(hào),必須對(duì)任意一個(gè)分支點(diǎn)的兩個(gè)分支方向都進(jìn)行完全搜索。
②有效性。保證搜索不重復(fù),每一個(gè)序列號(hào)只搜索一次,即每一個(gè)序列號(hào)搜索都不同于前面的搜索路徑。
批量序列號(hào)搜索算法基本思想是:每一個(gè)序列號(hào)搜索只在上一個(gè)序列號(hào)搜索產(chǎn)生的最后一個(gè)有效分支點(diǎn)改變搜索方向,獲得新的序列號(hào)。有效分支點(diǎn)是在當(dāng)前搜索路徑中出現(xiàn)但未經(jīng)過(guò)改變搜索方向處理的分支點(diǎn);反之,在當(dāng)前搜索路徑中出現(xiàn)且經(jīng)過(guò)改變搜索方向處理的分支點(diǎn)為無(wú)效分支點(diǎn)。每一個(gè)完整的序列號(hào)搜索過(guò)程都會(huì)產(chǎn)生一個(gè)最后有效分支點(diǎn),為敘述方便,稱為下一個(gè)序列號(hào)搜索的末點(diǎn)。出于算法規(guī)則考慮,假想序列號(hào)第0比特的前一比特是一個(gè)分支點(diǎn),該分支點(diǎn)只搜索取0方向。每一個(gè)序列號(hào)搜索只在末點(diǎn)改變搜索方向,同時(shí)末點(diǎn)處的分支點(diǎn)也將變?yōu)闊o(wú)效分支點(diǎn)。這樣每搜索一個(gè)到序列號(hào)將去掉一個(gè)末點(diǎn),當(dāng)末點(diǎn)退回到假想分支點(diǎn)時(shí),標(biāo)志搜索結(jié)束[5]。
對(duì)分支點(diǎn)兩個(gè)搜索方向,可以設(shè)定先搜索取0方向,再搜索取1方向。算法設(shè)置3個(gè)寄存器:
①有效分支點(diǎn)位置寄存器BR_Addr。每一次序列號(hào)搜索遇到有效分支點(diǎn)時(shí),將分支點(diǎn)位置寄存器更新為該有效分支點(diǎn)位置值,以便下一個(gè)序列號(hào)搜索獲得末點(diǎn)位置。
②末點(diǎn)寄存器END_Addr。記錄每一個(gè)序列號(hào)搜索產(chǎn)生的最后有效分支點(diǎn)。
③傳感器數(shù)量累計(jì)寄存器CODE_Num。累計(jì)搜索到的傳感器數(shù)量。
算法搜索流程如圖1所示。
圖1 算法搜索流程
批量搜索算法的具體步驟如下:
①設(shè)置末點(diǎn)位置為假想分支點(diǎn),清除傳感器數(shù)量累計(jì)寄存器。
②一個(gè)序列號(hào)搜索過(guò)程:
(a)分支點(diǎn)位置寄存器指向假想分支點(diǎn),發(fā)布序列號(hào)搜索命令。
(b)搜索過(guò)程中出現(xiàn)AiBi=11,終止搜索。
(c)搜索過(guò)程中出現(xiàn)分支點(diǎn),分支點(diǎn)與末點(diǎn)位置決定該分支點(diǎn)的取值:
◆分支點(diǎn)為末點(diǎn)位置,ai取1,變?yōu)闊o(wú)效分支點(diǎn)。
◆分支點(diǎn)在末點(diǎn)位置之前,ai取上一個(gè)報(bào)警序列號(hào)對(duì)應(yīng)的比特值。
◆分支點(diǎn)在末點(diǎn)位置之后,ai取0。
(d)僅取值0的分支點(diǎn)位置更新有效分支點(diǎn)位置寄存器。
③將分支點(diǎn)位置寄存器值更新末點(diǎn)寄存器,保存搜索到的序列號(hào),累計(jì)傳感器個(gè)數(shù)。
④末點(diǎn)指向假想分支點(diǎn),結(jié)束搜索。
⑤重復(fù)步驟②~④。
假想分支點(diǎn)在第0比特之前的第-1個(gè)比特位置上。第1步末點(diǎn)位置指向假想分支點(diǎn)是為了第一個(gè)序列號(hào)搜索出現(xiàn)的分支點(diǎn)都是有效分支點(diǎn),因?yàn)樗阉髦袥](méi)有分支點(diǎn)能指向假想分支點(diǎn)。如果總線上無(wú)傳感器,將出現(xiàn)AiBi=11終止搜索。第2步在一個(gè)序列號(hào)搜索之前,都設(shè)置有效分支點(diǎn)位置寄存器指向假想分支點(diǎn)。若只有一個(gè)傳感器,第一次搜索不會(huì)出現(xiàn)分支點(diǎn),搜索完該傳感器序列號(hào)后,末點(diǎn)仍指向假想分支點(diǎn),結(jié)束搜索。若總線上連接兩個(gè)傳感器,第一個(gè)序列號(hào)搜索僅出現(xiàn)一個(gè)分支點(diǎn),也是末點(diǎn);第二個(gè)序列號(hào)搜索末點(diǎn)另一個(gè)方向,獲得另一個(gè)序列號(hào)。末點(diǎn)變?yōu)闊o(wú)效發(fā)分支點(diǎn),搜索結(jié)束后,新未點(diǎn)指向假想分支點(diǎn),搜索結(jié)束。
對(duì)于總線上連接兩個(gè)以上的批量傳感器情況,第一個(gè)序列號(hào)搜索出現(xiàn)的分支點(diǎn)取值0,并逐步更新有效分支點(diǎn)位置寄存器,直到有效分支點(diǎn)位置寄存器指向最后一個(gè)分支點(diǎn),產(chǎn)生一個(gè)末點(diǎn)。末點(diǎn)表明,末點(diǎn)當(dāng)前的分支方向已搜索完畢,并獲得一個(gè)序列號(hào),否則不是最后分支點(diǎn)。第二個(gè)序列號(hào)按上一個(gè)序列號(hào)路徑搜索到末點(diǎn),在末點(diǎn)切換另一個(gè)方向(分支點(diǎn)取1)搜索,將出現(xiàn)兩種情況:
①第一種情況是后面沒(méi)有分支點(diǎn),得到一個(gè)序列號(hào)后,末點(diǎn)已被完全搜索。其取值1不更新有效分支點(diǎn)位置寄存器,新末點(diǎn)將指向前一個(gè)分支點(diǎn)。新末點(diǎn)當(dāng)前方向(分支點(diǎn)取0)已搜索完畢,以后不再搜索。
②第二種情況是后面有分支點(diǎn),新的末點(diǎn)將在舊的末點(diǎn)后面,該舊末點(diǎn)分支方向按第一種情況遞歸搜索,直到該方向完全搜索。在此過(guò)程中舊末點(diǎn)一直取值1,不會(huì)被當(dāng)作末點(diǎn)。舊末點(diǎn)該分支方向完全搜索后,下一個(gè)新末點(diǎn)將指向舊末點(diǎn)前一個(gè)分支點(diǎn)。以后的其他分支方向搜索方法相同。
批量搜索算法除第一個(gè)序列號(hào)搜索外,以后每搜索一個(gè)序列號(hào)都在末點(diǎn)改變搜索路徑,同時(shí)末點(diǎn)變?yōu)闊o(wú)效分支點(diǎn)(末點(diǎn)比特由0變?yōu)?)。末點(diǎn)每更換搜索方向后,后面的搜索遇到分支點(diǎn)都取值0,保證新出現(xiàn)分支點(diǎn)都是有效分支點(diǎn),搜索無(wú)遺漏。搜索過(guò)程中出現(xiàn)的分支點(diǎn)都僅被當(dāng)作一次末點(diǎn),每搜索到一個(gè)序列號(hào)都伴隨著一個(gè)分支點(diǎn)以末點(diǎn)的方式脫離搜索路徑,不會(huì)出現(xiàn)重復(fù)搜索。搜索次數(shù)和傳感器數(shù)量相同,比分支點(diǎn)數(shù)多1,有較高的搜索效率。
該算法還適用于總線上批量傳感器的報(bào)警搜索。將搜索算法中發(fā)布序列號(hào)搜索命令改為報(bào)警搜索命令(0xec),批量搜索算法將搜索到的是總線上產(chǎn)生報(bào)警傳感器序列號(hào)和報(bào)警傳感器的數(shù)量。在搜索過(guò)程中出現(xiàn)意外情況,搜索將會(huì)出現(xiàn)讀原碼和反碼的線與值為11的情況,算法終止搜索,系統(tǒng)不會(huì)進(jìn)入死循環(huán)狀態(tài)。
[1]Dallas Semiconductor Corporation1.DS18B20—Programmable Resolution 1-Wire Digital Thermometer,2002.
[2]劉海成,秦進(jìn)平,韓喜春.MCU-DSP型單片機(jī)原理與應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2006:187-197.
[3]劉曉陽(yáng),周炎濤.一線總線結(jié)構(gòu)的DS18B20的序列號(hào)搜索算法研究[J].計(jì)算機(jī)與自動(dòng)化,2010,29(1):38-42.
[4]陳文.DS18B20 ROM編碼的一種搜索算法[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2009(8):66-67.
[5]盛磊,葛照君.二叉樹(shù)算法在 DS18B20地址搜索中的運(yùn)用[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2010,19(2):143-146.
單片機(jī)與嵌入式系統(tǒng)應(yīng)用2011年9期