羅正生
(四川攀枝花學(xué)院,攀枝花 617000)
隨著微處理的高速發(fā)展,微處理系統(tǒng)外圍接口從原來的并行方式為主被串行方式代替。通常的串行擴展接口和串行擴展總線有:UART的移位寄存器方式,MOTOROLA公司的SPI,NS公司的Microwire,和Dallas公司的1-Wire總線等。而1-Wire總線是一種最簡單的總線形式,它通過單條連接線完成了全部的控制、通信和供電,節(jié)省了I/O口,降低了系統(tǒng)成本并簡化了設(shè)計。1-Wire 器件不僅解決了主機/配件之間的所有互聯(lián)問題,而且僅僅需要一個專用接點即可達到這一目的[1]。
1-Wire器件與微控制器的硬件配置比較簡單。作為主機的微控制器通過1根I/O口與1-Wire器件的數(shù)據(jù)線相連,外接一個4.7kΩ的上拉電阻;微控制器的地線與1-Wire器件的地線相連。在標(biāo)準(zhǔn)速率下,1-Wire總線的最大速率為16.3kbps.在高速模式下,速率可達142kbps[2]。
1-Wire器件的應(yīng)用關(guān)鍵在于軟件算法的實現(xiàn)。每片1-Wire器件都有唯一的64位序列碼,它存儲在只讀存儲器(ROM)中。在1-Wire網(wǎng)絡(luò)中,序列碼用于主機對從機器件進行逐一尋址。我們采用的搜索算法是二叉樹型結(jié)構(gòu),搜索過程沿各分節(jié)點進行,直到找到的ROM碼,即葉子為止。后續(xù)的搜索操作沿著節(jié)點上的其他路經(jīng)進行,按照同樣的方式直到找到總線上的所有器件代碼。搜索算法首先通過復(fù)位(Reset)和在線應(yīng)答脈沖(Presence Pulse)時隙將1-Wire總線上的所有器件復(fù)位;成功地執(zhí)行該操作后,發(fā)送1個字節(jié)的搜索命令;搜索命令使1-Wire器件準(zhǔn)備就緒、開始進行搜索操作。
搜索命令分為兩類:標(biāo)準(zhǔn)搜索命令(0FH)用來搜索連接到網(wǎng)絡(luò)中的所有器件;報警或有條件搜索命令(ECH)只用來收縮那些處于報警狀態(tài)下的期間,這種方式縮小了搜索范圍,可以快速查找到所需注意的器件。搜索命令發(fā)出之后,開始搜索。首先總線上的所有從機器件同時發(fā)送ROM碼(也叫注冊碼)中的第一位(最低有效位)。與所有的1-Wire通信一樣,無論是讀取數(shù)據(jù)還是向從機器件寫數(shù)據(jù),都由1-Wire主機啟動每一位操作。按照1-Wire的特點,當(dāng)所有從機器件同時應(yīng)答主機時,結(jié)果相當(dāng)于全發(fā)送數(shù)據(jù)位的邏輯AND;從機發(fā)送其ROM碼的第一位后,主機啟動下一位操作、接著從機發(fā)送第一位數(shù)據(jù)的補碼;從兩次讀到的數(shù)據(jù)位可以對ROM碼的第一位做出表2的判斷。
按照搜索算法的要求,1-Wire主機必須向總線上的從機發(fā)回一個指定位;如果從機器件中ROM碼的當(dāng)前位的值與該數(shù)據(jù)位匹配,則繼續(xù)參與搜索過程;若從機器件的當(dāng)前位與之不匹配,則該器件轉(zhuǎn)換到等待狀態(tài),并保持等待狀態(tài)直到下一個1-Wire復(fù)位信號到來。其余63位ROM碼的搜索依然按照這種“讀兩位”、“寫一位”的模式進行重復(fù)操作。表1為主機和從機的搜索過程。
表 1 1-Wire主機和從機的搜索過程
可以看出,如果所有總線上的器件在當(dāng)前位具有相同值,那么只有一條分支路徑可選??偩€上沒有器件相應(yīng)的情況是一種異常狀態(tài),可能是要查找的器件在搜索過程中與1-Wire總線脫離。如果當(dāng)前位既有0也有1,這種情況稱為位值差異,它對在后續(xù)搜索過程中查找器件起關(guān)鍵作用。搜索伏安法制定在第一輪查找中若出現(xiàn)差異(數(shù)據(jù)位/補碼 = 0/0),則選用“0”路徑。記錄最后一次值差異的位置提供下一次搜索使用,搜索算法計算還對最初8位過程中出現(xiàn)的最后一次位差異保持跟蹤;64位注冊碼的前8位是家族碼,在器件的搜索過程中可以按照其家族碼進行分類。記錄家族碼的最后一次差異可以用于有選擇性地跳過1-Wire器件的整個分組。如需進行選擇性地搜索,可參考關(guān)于高級變量搜索的詳細解釋。64位ROM碼中包括8位循環(huán)冗余校驗(CRC);CRC值用于校驗是否搜索到正確的ROM碼。
圖1 搜索算法流程圖
“FIRST”操作是搜索1-Wire縱向上的第一個從機器件。該操作是通過將LastDiscrepancy、LastFamilyDiscrepancy和LastDeviceFlag置零,然后進行搜索完成的。最后ROM碼從ROM_NO寄存器中讀出。若1-Wire總線上沒有器件,復(fù)位序列就檢測不到應(yīng)答脈沖,搜索過程中止。高級變量搜索有3種利用同一組狀態(tài)變量LastDescrepancy、LastFamilyDiscrepancy、LastDeviceFlag、ROM_NO實現(xiàn)的高級變化搜索可以得到三種高級變量搜索算法,這幾種高級搜索算法允許來指定作為搜索目標(biāo)的器件的類型(家族碼)或者是制定需要跳過或驗證某類型的器件是否在線。
“TARGET SETUP”操作就是用預(yù)置搜索狀態(tài)的方式首先查找一個特殊的家族類型,每個1-Wire都有一個字節(jié)的家族碼內(nèi)嵌在ROM碼中,逐級可以通過家族碼來識別器件按所具有的特性和功能。如1-Wire總線上有多片器件是,通常是將搜索目標(biāo)首先定位在需注意的器件類型上。為了將一個特殊的家族作為搜索目標(biāo),需要將所希望的家族碼字節(jié)方到ROM_NO寄存器的第一個字節(jié)中,并且將ROM_NO寄存器的復(fù)位狀態(tài)置零[3]。
有了上面的搜索算法以及高級變量搜索,利用1-Wire的通訊協(xié)議就可以很容易辨別在單總線上的多節(jié)點1-Wire器件。用搜索算法可以很容易找出在總線上某一家族碼的所有1-Wire器件,通過微機的串口可以向總線上具有某一特定的家族碼的1-Wire器件中寫入希望的內(nèi)容,圖1列出了對一個器件進行搜索的流程圖[4]。
圖中com_id_bit是id_bit的補碼,是搜索過程中所有應(yīng)答期間的id_bit_number位的補碼的邏輯AND;id_bit是在位搜索中第一次讀取的值,是搜索過程中所有應(yīng)答期間的id_bit_number位的邏輯AND;id_bit_number是記錄當(dāng)前搜索1到64位ROM中的哪一位的量;LastDeviceFlag是指明前一次搜索歸的已經(jīng)是最后一個器件的標(biāo)志位;LastDiscrepancy是位指針,指明下次搜索從哪一個差異值開始;last_zero是上次被寫入0的值差異位的位置;ROM_NO是記錄當(dāng)前正在查找的ROM注冊碼的8字節(jié)緩沖器;search_direction是位變量,其值用來指明方向,具有此數(shù)據(jù)位規(guī)定值的所在器件繼續(xù)響應(yīng)操作,其他器件轉(zhuǎn)入等待狀態(tài)直到下一次1-wire復(fù)位[4]。
由于1-Wire器件有節(jié)省線資源、結(jié)構(gòu)簡單等諸多優(yōu)點,所以其應(yīng)用也越來越廣泛,文章只介紹了1-Wire用于多節(jié)點操作系統(tǒng)的搜索算法和一個1-Wire器件燒寫器的簡單應(yīng)用,以拋磚引玉。
[1] 譚浩強.C 程序設(shè)計[M] .北京:清華大學(xué)出版社,1997.
[2] 胡漢才.單片機原理及其接口技術(shù)[M].北京:清華大學(xué)出版社,2001.
[3] DS2432 1kb Protected 1-Wire EEPROM with SHA-1.Engine.www.maximic.com.
[4] 謝洪波.嵌入式網(wǎng)絡(luò)數(shù)字監(jiān)控系統(tǒng)接口與網(wǎng)絡(luò)帶寬測量[D].成都.電子科技大學(xué),2005.