一文看懂单总线协议(1-wire)
文章目錄
- 一、什么是單總線協(xié)議?
- 1、單總線協(xié)議概念及特點(diǎn)
- 2、硬件結(jié)構(gòu)
- 3、單總線協(xié)議應(yīng)用
- 二、單總線協(xié)議時(shí)序(以DS18B20為例)
- 1、初始化(復(fù)位脈沖 + 存在脈沖)
- 2、讀/寫時(shí)序
- (1)寫時(shí)序
- (2)讀時(shí)序
- 三、DS18B20訪問(wèn)執(zhí)行步驟
- 1、初始化
- 2、ROM操作指令
- (1)Search ROM [F0h] (搜索 ROM 指令)
- (2)READ ROM [33h] (讀取 ROM 指令)
- (3)MATH ROM [55h] (匹配 ROM 指令)
- (4)SKIP ROM [CCh] (忽略 ROM 指令)
- (5)ALARM SEARCH [ECH] (報(bào)警搜索指令)
- 3、DS18B20功能指令
- (1)CONVERT T [44h] (溫度轉(zhuǎn)換指令)
- (2)WRITE SCRATCHPAD [4Eh] (寫暫存器指令)
- (3)READ SCRATCHPAD [BEh] (讀暫存器指令)
- (4)COPY SCRATCHPAD [48h] (拷貝暫存器指令)
- (5)RECALL E2 [B8H] (召回 EEPROM 指令)
- (6)READ POWER SUPPLY [B4h] (讀電源模式指令)
一、什么是單總線協(xié)議?
1、單總線協(xié)議概念及特點(diǎn)
單總線(1-wire)是美國(guó)DALLAS公司推出的外圍串行擴(kuò)展總線技術(shù)。與SPI、I2C串行數(shù)據(jù)通信方式不同,它采用單根信號(hào)線傳輸。 這種協(xié)議由一個(gè)總線主節(jié)點(diǎn)、或多個(gè)從節(jié)點(diǎn)組成系統(tǒng),通過(guò)根信號(hào)線對(duì)從芯片進(jìn)行數(shù)據(jù)的讀取。每一個(gè)符合單總線協(xié)議的從芯片都有一個(gè)唯一的地址,包括48位的序列號(hào)、8位的家族代碼和8位的CRC代碼。主芯片根據(jù)64位尋址對(duì)各個(gè)芯片進(jìn)行雙向通信,因此其協(xié)議對(duì)時(shí)序的要求較嚴(yán)格,初始化、寫bit或讀bit都有嚴(yán)格的時(shí)序要求,但是位于位之間沒(méi)有嚴(yán)格要求。
單總線的數(shù)據(jù)傳輸速率一般為16.3Kbit/s,最大可達(dá)142 Kbit/s,通常情況下采用100Kbit/s以下的速率傳輸數(shù)據(jù)。主設(shè)備I/O口可直接驅(qū)動(dòng)200m范圍內(nèi)的從設(shè)備,經(jīng)過(guò)擴(kuò)展后可達(dá)1km范圍。
這種傳輸方式信號(hào)線上既傳輸時(shí)鐘又傳輸數(shù)據(jù),而且數(shù)據(jù)傳輸是雙向的,具有節(jié)省I/O口線、資源結(jié)構(gòu)簡(jiǎn)單、成本低廉、便于總線擴(kuò)展和維護(hù)等諸多優(yōu)點(diǎn)。
2、硬件結(jié)構(gòu)
單總線只有一根數(shù)據(jù)線,設(shè)備(主機(jī)或從機(jī))通過(guò)一個(gè)漏極開(kāi)路或三態(tài)端口,連接至該數(shù)據(jù)線,這樣允許設(shè)備在不發(fā)送數(shù)據(jù)時(shí)釋放數(shù)據(jù)總線,以便總線被其它設(shè)各所使用。單總線端口為漏極開(kāi)路,其內(nèi)部等效電路下圖所示:
單總線電路外接一個(gè)約5K的上拉電阻,當(dāng)單總線處于空閑狀態(tài)時(shí)為高電平,如果總線保持低電平超過(guò)480us,總線上的所有器件將復(fù)位。另外,在寄生方式供電時(shí),為了保證單總線器件在某些工作狀態(tài)下(如溫度轉(zhuǎn)換期間、EEPROM寫入等)具有足夠的電源電流,必須在總線上提供強(qiáng)上拉。
3、單總線協(xié)議應(yīng)用
單總線器件主要有數(shù)字溫度傳感器(如DS18B20)、DHT11、A/D轉(zhuǎn)換器(如DS2450)、門標(biāo)、身份識(shí)別器(如DS1990A)、單總線控制器(如DS1WM)等。
二、單總線協(xié)議時(shí)序(以DS18B20為例)
DS18B20 需要嚴(yán)格的單總線協(xié)議以確保數(shù)據(jù)的完整性。協(xié)議包括集中單總線信號(hào)類型:復(fù)位脈沖、存在脈沖、寫 0、寫 1、讀 0 和讀 1。所有這些信號(hào),除存在脈沖外,都是由總線控制器發(fā)出的。
由于單總線是主從結(jié)構(gòu),只有主機(jī)呼叫從機(jī)時(shí),從機(jī)才能應(yīng)答,因此主機(jī)訪問(wèn)器件都必須嚴(yán)格遵循單總線命令序列,即初始化、ROM命令和功能命令。如果出現(xiàn)序列混亂,器件將不響應(yīng)主機(jī)(搜索ROM命令、報(bào)警搜索命令除外)。
1、初始化(復(fù)位脈沖 + 存在脈沖)
復(fù)位序列:復(fù)位脈沖和存在脈沖
在初始化序列期間,總線控制器拉低總線并保持 480us 以發(fā)出(TX)一個(gè)復(fù)位脈沖,然后釋放總線,進(jìn)入接收狀態(tài)(RX)。單總線由 5K 上拉電阻拉到高電平。當(dāng)DS18B20 探測(cè)到 I/O 引腳上的上升沿后,等待 15-60us,然后發(fā)出一個(gè)由 60-240us低電平信號(hào)構(gòu)成的存在脈沖。
2、讀/寫時(shí)序
(1)寫時(shí)序
寫時(shí)序分為寫 1 時(shí)序和寫 0 時(shí)序,總線控制器通過(guò)寫 1 時(shí)序?qū)戇壿?1 到
DS18B20,寫 0 時(shí)序?qū)戇壿?0 到 DS18B20。所有寫時(shí)序必須最少持續(xù) 60us,包括兩個(gè)寫周期之間至少 1us 的恢復(fù)時(shí)間。當(dāng)總線控制器把數(shù)據(jù)線從邏輯高電平拉到低電平的時(shí)候,寫時(shí)序開(kāi)始,如下圖所示:
總線控制器要生產(chǎn)一個(gè)寫時(shí)序,必須把數(shù)據(jù)線拉到低電平然后釋放,在寫時(shí)序開(kāi)始后的 15us 釋放總線。當(dāng)總線被釋放的時(shí)候,5K 的上拉電阻將拉高總線。總控制器要生成一個(gè)寫 0 時(shí)序,必須把數(shù)據(jù)線拉到低電平并持續(xù)保持(至少 60us)。
總線控制器初始化寫時(shí)序后,DS18B20 在一個(gè) 15us 到 60us 的窗口內(nèi)對(duì) I/O 線采樣。如果線上是高電平,就是寫 1。如果線上是低電平,就是寫 0。
(2)讀時(shí)序
總線控制器發(fā)起讀時(shí)序時(shí),DS18B20 僅被用來(lái)傳輸數(shù)據(jù)給控制器。因此,總線控制器在發(fā)出讀暫存器指令[BEh]或讀電源模式指令[B4H]后必須立刻開(kāi)始讀時(shí)序,DS18B20可以提供請(qǐng)求信息。除此之外,總線控制器在發(fā)出發(fā)送溫度轉(zhuǎn)換指令[44h]或召回 EEPROM 指令[B8h]之后讀時(shí)序。
所有讀時(shí)序必須最少 60us,包括兩個(gè)讀周期間至少 1us 的恢復(fù)時(shí)間。當(dāng)總線控制器把數(shù)據(jù)線從高電平拉到低電平時(shí),讀時(shí)序開(kāi)始,數(shù)據(jù)線必須至少保持 1us,然后總線被釋放。在總線控制器發(fā)出讀時(shí)序后,DS18B20 通過(guò)拉高或拉低總線上來(lái)傳輸 1 或 0。當(dāng)傳輸邏輯 0 結(jié)束后,總線將被釋放,通過(guò)上拉電阻回到上升沿狀態(tài)。從 DS18B20 輸出的數(shù)據(jù)在讀時(shí)序的下降沿出現(xiàn)后 15us 內(nèi)有效。因此,總線控制器在讀時(shí)序開(kāi)始后必須停止把 I/O 腳驅(qū)動(dòng)為低電平 15us,以讀取I/O 腳狀態(tài)。
三、DS18B20訪問(wèn)執(zhí)行步驟
每一次 DS18B20 的操作都必須滿足以下步驟,若是缺少步驟或是順序混亂,器件將不會(huì)返回值。例如這樣的順序:發(fā)起 ROM 搜索指令[F0h]和報(bào)警搜索指令[ECh]之后,總線控制器必須返回步驟 1。
1、初始化
通過(guò)單總線的所有執(zhí)行操作處理都從一個(gè)初始化序列開(kāi)始。初始化序列包括一個(gè)由總線控制器發(fā)出的復(fù)位脈沖和其后由從機(jī)發(fā)出的存在脈沖。存在脈沖讓總線控制器知道 DS18B20 在總線上且已準(zhǔn)備好操作。
2、ROM操作指令
一旦總線控制器探測(cè)到一個(gè)存在脈沖,它就發(fā)出一條 ROM 指令。如果總線上掛有多只 DS18B20,這些指令將基于器件獨(dú)有的 64 位 ROM 片序列碼使得總線控制器選出特定要進(jìn)行操作的器件。這些指令同樣也可以使總線控制器識(shí)別有多少只,什么型號(hào)的器件掛在總線上,同樣,它們也可以識(shí)別哪些器件已經(jīng)符合報(bào)警條件。ROM 指令有 5 條,都是 8 位長(zhǎng)度。總線控制器在發(fā)起一條 DS18B20 功能指令之前必須先發(fā)出一條 ROM 指令。ROM指令流程圖如下:
(1)Search ROM [F0h] (搜索 ROM 指令)
當(dāng)系統(tǒng)上電初始化的時(shí)候,總線控制器必須通過(guò)識(shí)別總線上所有 ROM 片序列碼去得到從機(jī)的數(shù)目和型號(hào)。總線控制器通過(guò)搜索 ROM 指令多次循環(huán)搜索 ROM 編碼,以確認(rèn)所有從機(jī)器件。如果總線上只有一只從機(jī),那么可以用較為簡(jiǎn)單的讀取ROM 指令代替搜索 ROM 指令。在每次搜索 ROM 指令之后,總線控制器必須返回步驟 1。
(2)READ ROM [33h] (讀取 ROM 指令)
只有在總線上存在單只 DS18B20 的時(shí)候才能使用這條命令。該命令允許總線控制器在不使用搜索 ROM 指令的情況下讀取從機(jī)的 64 位片序列碼。如果總線上有不止一只從機(jī),當(dāng)所有從機(jī)試圖同時(shí)傳送信號(hào)時(shí)就會(huì)發(fā)生數(shù)據(jù)沖突。
(3)MATH ROM [55h] (匹配 ROM 指令)
匹配 ROM 指令,后跟 64 位 ROM 編碼序列,讓總線控制器在多點(diǎn)總線上定位一只特定的 DS18B20。只有和 64 位 ROM 片序列碼完全匹配的 DS18B20 才能響應(yīng)隨后的存儲(chǔ)器操作指令;所有和 64 位 ROM 片序列碼不匹配的從機(jī)都將等待復(fù)位脈沖。
(4)SKIP ROM [CCh] (忽略 ROM 指令)
這條指令允許總線控制器不用提供 64 位 ROM 編碼就使用功能指令。例如,總線控制器可以先發(fā)出一條忽略 ROM 指令,然后發(fā)出溫度轉(zhuǎn)換指令[44h],從而完成溫度轉(zhuǎn)換操作。注意:當(dāng)只有一只從機(jī)在總線上時(shí),無(wú)論如何,忽略 ROM 指令之后只能跟著發(fā)出一條讀取暫存器指令[BEh]。在單點(diǎn)總線情況下使用該命令,器件無(wú)需發(fā)回 64 位 ROM 編碼,從而節(jié)省了時(shí)間。如果總線上有不止一只從機(jī),若發(fā)出忽略 ROM 指令,由于多只從機(jī)同時(shí)傳送信號(hào),總線上就會(huì)發(fā)生數(shù)據(jù)沖突。
(5)ALARM SEARCH [ECH] (報(bào)警搜索指令)
這條命令的流程和搜索 ROM 指令相同,然而,只有滿足報(bào)警條件的從機(jī)才對(duì)該命令作出響應(yīng)。只有在最近一次測(cè)溫后遇到符合報(bào)警條件的情,DS18B20 才會(huì)響應(yīng)這條命令。在每次報(bào)警搜索指令周期之后,總線控制器必須返回步驟 1。
3、DS18B20功能指令
在總線控制器發(fā)給欲連接的DS18B20一條ROM命令后,跟著可以發(fā)送一條DS18B20功能指令。這些命令允許總線控制器讀寫 DS18B20 的暫存器,發(fā)起溫度轉(zhuǎn)換和識(shí)別電源模式。功能指令流程圖如下:
(1)CONVERT T [44h] (溫度轉(zhuǎn)換指令)
這條命令用以啟動(dòng)一次溫度轉(zhuǎn)換。溫度轉(zhuǎn)換指令被執(zhí)行,產(chǎn)生的溫度轉(zhuǎn)換結(jié)果數(shù)據(jù)以 2 個(gè)字節(jié)的形式被存儲(chǔ)在高速暫存器中,而后 DS18B20 保持等待狀態(tài)。如果寄生電源模式下發(fā)出該命令后,在溫度轉(zhuǎn)換期間(tconv),必須在 10us(最多),內(nèi)給單總線一個(gè)強(qiáng)上拉,見(jiàn) DS18B20 供電節(jié)。如果DS18B20 以外部電源供電,總線控制器在發(fā)出該命令后跟著發(fā)出讀時(shí)序,DS18B20 如處于轉(zhuǎn)換中,將在總線上返回 0,若溫度轉(zhuǎn)換完成,則返回 1。
(2)WRITE SCRATCHPAD [4Eh] (寫暫存器指令)
這條命令向 DS18B20 的暫存器寫入數(shù)據(jù),開(kāi)始位置在 TH 寄存器(暫存器的第 2個(gè)字節(jié)),接下來(lái)寫入 TL 寄存器(暫存器的第 3 個(gè)字節(jié)),最后寫入配置寄存器(暫存器的第 4 個(gè)字節(jié))。數(shù)據(jù)以最低有效位開(kāi)始傳送。上述三個(gè)字節(jié)的寫入必須發(fā)生在總線控制器發(fā)出復(fù)位命令前,否則會(huì)中止寫入。
(3)READ SCRATCHPAD [BEh] (讀暫存器指令)
這條命令讀取暫存器的內(nèi)容。讀取將從字節(jié) 0 開(kāi)始,一只進(jìn)行下去,知道第 9 字節(jié)(字節(jié) 8,CRC)讀完,如果不想讀完所有字節(jié),控制器可以在任何時(shí)間發(fā)出復(fù)位命令來(lái)中止讀取。
(4)COPY SCRATCHPAD [48h] (拷貝暫存器指令)
這條命令把 TH,TL 和配置寄存器(第 2、3、4 字節(jié))的內(nèi)容拷貝到 EEPROM 中。如果使用寄生電源總線控制器必須在發(fā)出這條命令的 10us 內(nèi)啟動(dòng)強(qiáng)上拉并最少保持 10ms。
(5)RECALL E2 [B8H] (召回 EEPROM 指令)
這條命令把報(bào)警觸發(fā)器的值(TH 和 TL)以及配置數(shù)據(jù)從 EEPROM 拷回暫存器。總線控制器在發(fā)出該命令后讀時(shí)序,DS18B20 會(huì)輸出拷回標(biāo)識(shí):0 標(biāo)識(shí)正在拷回,1標(biāo)識(shí)拷回結(jié)束。這種拷回操作在 DS18B20 上電時(shí)自動(dòng)執(zhí)行,這樣器件一上電暫存器里馬上就存在有效的數(shù)據(jù)了。
(6)READ POWER SUPPLY [B4h] (讀電源模式指令)
總線控制器在這條命令發(fā)給 DS18B20 后發(fā)出讀時(shí)序,若是寄生電源模式,DS18B20將拉低總線,若是外部電源模式,DS18B20 將會(huì)把總線拉高。
注意:
1.對(duì)于寄生電源模式下的 DS18B20,在溫度轉(zhuǎn)換和拷貝數(shù)據(jù)到 EEPROM 期間,必須給單總線一個(gè)強(qiáng)上拉。總線上在這段時(shí)間內(nèi)不能有其它活動(dòng)。
2.總線控制器在任何時(shí)刻都可以通過(guò)發(fā)出復(fù)位信號(hào)中止數(shù)據(jù)傳輸。
總結(jié)
以上是生活随笔為你收集整理的一文看懂单总线协议(1-wire)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 无人机刚体动力学方程
- 下一篇: Universal adversaria