引 言
Dalias公司推出的數(shù)字化溫度傳感器I)S18820的獨(dú)特的“單線總線”,可以使用戶方便地使用多片I)S18820構(gòu)成多點(diǎn)溫度測(cè)量系統(tǒng),因此如何準(zhǔn)確、有效地對(duì)掛在同一條單線總線上的多片Dsl8820 ROM編碼進(jìn)行搜索與識(shí)別成為系統(tǒng)設(shè)計(jì)的一個(gè)核心問(wèn)題。用DSl8820的ROM操作命令Read ROM[33h]依次讀取單線總線上的唯一一個(gè)ROM編碼,然后存放在外部擴(kuò)展的EEPROM存儲(chǔ)器,再用MatchROM[55h]命令匹配識(shí)別可以解決這個(gè)問(wèn)題。這種方法的優(yōu)點(diǎn)在于簡(jiǎn)單、不需要復(fù)雜的算法,但是實(shí)際使用中不夠靈活,對(duì)于一個(gè)探測(cè)單元有多個(gè)不可分離的DS18820的ROM序列號(hào)的讀取更是無(wú)能為力。本文提出的一種搜索算法為這個(gè)問(wèn)題提供了一個(gè)理想而靈活的解決方案。
1 DS18820簡(jiǎn)介
作為一種數(shù)字化溫度傳感器,DSl8820測(cè)溫時(shí)無(wú)需任何外部元件,可直接輸出9~12 位(含符號(hào)位)的被測(cè)溫度值,測(cè)溫范圍為一55~+125℃;在一10~+85℃范圍內(nèi)測(cè)量精度為±O.5℃,輸出測(cè)量分辨率可調(diào),最高可達(dá)O.062 5℃;支持“單線總線”技術(shù),僅需要占用一個(gè)通用I/0端口即可完成與單片機(jī)的通信;現(xiàn)場(chǎng)溫度直接以“單線總線”的數(shù)字方式傳輸,大大提高了系統(tǒng)的抗干擾能力。每片DS18820內(nèi)含唯一的64位ROM編碼,因此可以對(duì)掛在總線上多片DSl8820進(jìn)行唯一尋址,只有被尋址的DSI 8820才能對(duì)后續(xù)操作命令作出響應(yīng)。
1.1 “單線總線”通信協(xié)議
“單線總線”是一種在一條總線(這條總線只有一條口線)具有單主機(jī)多從機(jī)的總線系統(tǒng),在“單線總線”可掛多個(gè)從機(jī)系統(tǒng)。為了不引起邏輯上的沖突,所有從機(jī)系統(tǒng)“單線總線”接口都是漏極開(kāi)路的,多個(gè)從機(jī)系統(tǒng)輸出信號(hào)在總線上實(shí)現(xiàn)線與,因此在使用時(shí)必須對(duì)總線外加上拉電阻。
為保證數(shù)據(jù)的完整性,所有的單線總線器件都要遵循嚴(yán)格的通信協(xié)議。“單線總線”通信協(xié)議定義了復(fù)位脈沖、應(yīng)答脈沖、寫(xiě)時(shí)序和讀時(shí)序等幾種信號(hào)類(lèi)型(具體的時(shí)序參考相關(guān)文獻(xiàn),這里不再做具體介紹)。所有的單總線命令序列(如初始化、ROM命令、RAM命令)都是由這些基本的信號(hào)類(lèi)型組成的。在這些信號(hào)中,除了應(yīng)答脈沖外,其他均由主機(jī)發(fā)出,并且發(fā)送的所有命令和數(shù)據(jù)都是字節(jié)的低位在前。
1.2 DSl8820的ROM編碼
每片DSl8820含有一個(gè)唯一的64位ROM編碼。頭8位是產(chǎn)品系列碼,接著的 48位是產(chǎn)品序列號(hào),最后8位是CRC(循環(huán)冗余校驗(yàn))碼。主機(jī)可以對(duì)總線上多片DS18820唯一尋址,因此多片DS18820能夠連在同一條數(shù)據(jù)線上而不會(huì)造成混亂,這為溫度的多點(diǎn)測(cè)量帶來(lái)了極大的方便。64位的ROM注冊(cè)碼如下:
1.3 DS18820 ROM搜索命令
當(dāng)單線總線上掛有多個(gè)DS18B20時(shí),系統(tǒng)對(duì)總線上器件的數(shù)量和每個(gè)器件的ROM的識(shí)別與搜索是通過(guò)DS18820 ROM搜索命令與算法配合來(lái)實(shí)現(xiàn)的。下面具體介紹ROM搜索命令的工作過(guò)程。對(duì)64位ROM編碼識(shí)別從最低位開(kāi)始,ROM編碼的每一位搜索過(guò)程可總結(jié)為 “兩讀一寫(xiě)”:讀一位,讀該位補(bǔ)碼;寫(xiě)一位??偩€主機(jī)在ROM編碼每一位上完成這三步就可以獲得一個(gè)器件的ROM編碼。
(1)兩 讀
總線主機(jī)發(fā)布ROM搜索命令后執(zhí)行一次讀,總線上所有器件就把它們各自ROM編碼的第一位放到總線來(lái)作出響應(yīng)。這次讀獲得的數(shù)據(jù)是所有器件放在總線上數(shù)據(jù)的“與”。再執(zhí)行一次讀,因?yàn)镽OM搜索命令正在執(zhí)行所以總線上所有器件把各自ROM編碼的第一位的補(bǔ)碼放在總線上,第二次讀獲得的數(shù)據(jù)也是所有器件放在總線上數(shù)據(jù)的“與”。對(duì)第一位的“兩讀”就此完成。之后主機(jī)再次進(jìn)行的“兩讀”則是針對(duì)ROM編碼的第二位,以此類(lèi)推。從“兩讀”獲得的數(shù)據(jù)有以下解釋?zhuān)绫?所列。
(2)- 寫(xiě)
對(duì)ROM編碼的某一位“兩讀”之后,對(duì)該位進(jìn)行“-寫(xiě)”操作。“-寫(xiě)”操作寫(xiě)的數(shù)據(jù)要根據(jù)“兩讀”獲得的數(shù)據(jù)來(lái)確定。如果“兩讀”數(shù)據(jù)為00,則表示總線上器件在該位上數(shù)據(jù)發(fā)生沖突,“-寫(xiě)”寫(xiě)的數(shù)據(jù)此種情況下具有“排除”的作用,如果器件ROM編碼在該位上的數(shù)據(jù)與“-寫(xiě)”寫(xiě)的數(shù)據(jù)相同,則繼續(xù)保持與總線的聯(lián)系。如果不相同則此器件從總線上“排除”,不再響應(yīng)主機(jī)發(fā)布的命令,直到主機(jī)進(jìn)行下一次復(fù)位。如果“兩讀”數(shù)據(jù)為01,則表示總線上所有器件在該位上均位0,為保持器件與總線的聯(lián)系,“-寫(xiě)”操作主機(jī)應(yīng)寫(xiě)0。同理,如“兩讀”數(shù)據(jù)為10,主機(jī)則應(yīng)寫(xiě)1。
2 DS18820 ROM編碼的搜索算法
在一條“單線總線”上掛有多片。DS18820的情況下,對(duì)ROM編碼的搜索與識(shí)別主要是通過(guò)“兩讀”數(shù)據(jù)為00時(shí)“-寫(xiě)”操作的“排除”作用來(lái)實(shí)現(xiàn)的。多次“排除”作用后,就可以使總線上只剩下唯一的一個(gè)器件仍與總線保持聯(lián)系。如何“排除”,這需要算法的配合。下面具體介紹DS18820 ROM編碼的搜索算法。
首先作如下幾個(gè)定義:對(duì)“兩讀”數(shù)據(jù)為00的ROM編碼位,之后“一寫(xiě)”操作要寫(xiě)的數(shù)據(jù)定義為“00寫(xiě)位”;所有00寫(xiě)位的集合定義為“00寫(xiě)位組”。那么搜索算法所要解決的問(wèn)題就是:確立一個(gè)00寫(xiě)位組,確保搜索命令能夠搜索到一個(gè)唯一的ROM編碼,并在完成一次搜索后對(duì)00寫(xiě)位組做出更新,以確保下次的搜索命令能夠搜索到一個(gè)唯一的ROM編碼并且不會(huì)搜索到已經(jīng)搜索到的ROM編碼,直到完成總線上所有器件的ROM編碼搜索。
在給出搜索算法規(guī)則前再作如下幾個(gè)定義:00寫(xiě)位組中最高ROM編碼位對(duì)應(yīng)的00寫(xiě)位定義為“最高00寫(xiě)位”;00寫(xiě)位組中鄰近最高00寫(xiě)位的00寫(xiě)位定義位“次高00寫(xiě)位”;如果更新后的00寫(xiě)位組不足以搜索到一個(gè)唯一的ROM編碼,則添加新的00寫(xiě)位,這個(gè)新的00寫(xiě)位定義為“新00寫(xiě)位”。
DS18820 ROM編碼的搜索算法規(guī)則:
①第一次搜索確立一個(gè)00寫(xiě)位組,其中所有00寫(xiě)位全部為0。
②每次搜索后更新00寫(xiě)位組并從最高00寫(xiě)位開(kāi)始更新。
③00寫(xiě)位組更新規(guī)則:如果最高00寫(xiě)位為0,則改最高00寫(xiě)位為1,更新完成;如果最高00寫(xiě)位為1,則棄去最高00寫(xiě)位并把次高00寫(xiě)位作為新的最高00寫(xiě)位。
④如果出現(xiàn)新00寫(xiě)位,新00寫(xiě)位一律為0并作為新的最高00寫(xiě)位。
⑤如果0寫(xiě)位組全為1,則搜索所有器件的ROM編碼,搜索結(jié)束。
3 算法的C51實(shí)現(xiàn)
對(duì)一條“單線總線”上多片DS18820的ROM編碼搜索與識(shí)別,具體由C51編寫(xiě)的函數(shù)uchar SearchRomID(uchar RomID[n][8])來(lái)實(shí)現(xiàn)。函數(shù)的返回值是總線上查找到的器件個(gè)數(shù),總線上所有器件的ROM編碼存入二維數(shù)組RomID[n][8]。其中n為總線上允許掛器件的最大值,這里取16。
首先對(duì)程序中的幾個(gè)重要變量做一些說(shuō)明:
_00wbit:一維數(shù)組,用來(lái)存儲(chǔ)00寫(xiě)位組全部?jī)?nèi)容。它的長(zhǎng)度由總線上允許掛接器件的最大值決定。每寫(xiě)一個(gè)00寫(xiě)位都可以“排除”至少一個(gè)總線上的器件,當(dāng)總線上器件數(shù)為n時(shí),_00wbit數(shù)組的長(zhǎng)度應(yīng)為n-1。當(dāng)然這是最壞情況下的取值,很多情況下_00wbit數(shù)組的長(zhǎng)度小于這個(gè)值,這時(shí)不用的 _00wbit數(shù)組位用2來(lái)填充。
Rom:一維數(shù)組,臨時(shí)存儲(chǔ)64位ROM編碼。
b:搜索結(jié)束標(biāo)志位。
R1、R2:“兩讀”數(shù)據(jù)位。
編者注:程序略。
結(jié) 語(yǔ)
本文提出了一種對(duì)掛接在同一條“單線總線”上的多片DS18B20 ROM編碼的搜索算法,并給出了具體的C51實(shí)現(xiàn)方法,經(jīng)驗(yàn)證完全可行。由于該算法可自動(dòng)識(shí)別總線上的器件個(gè)數(shù),因此實(shí)際運(yùn)用中,在總線上添加和刪除器件都十分靈活,這為多點(diǎn)測(cè)溫帶來(lái)了很大的方便。該算法也適用于其他“單線總線”器件。