DS18B20時(shí)序(上)
DS18B20的時(shí)序是其單總線(1-Wire)通信協(xié)議的核心,決定了傳感器與微控制器(MCU)之間數(shù)據(jù)交互的準(zhǔn)確性與可靠性。作為一款通過單根信號(hào)線實(shí)現(xiàn)雙向通信的數(shù)字溫度傳感器,DS18B20的所有操作——從初始化到命令傳輸,再到數(shù)據(jù)讀寫——都依賴于嚴(yán)格定義的時(shí)序規(guī)則,任何微小的時(shí)序偏差都可能導(dǎo)致通信失敗或數(shù)據(jù)錯(cuò)誤。理解這些時(shí)序細(xì)節(jié),不僅是正確驅(qū)動(dòng)DS18B20的基礎(chǔ),也是排查通信故障的關(guān)鍵,其設(shè)計(jì)的嚴(yán)謹(jǐn)性體現(xiàn)了單總線協(xié)議在簡(jiǎn)化硬件的同時(shí),對(duì)軟件時(shí)序控制的極致要求。
初始化時(shí)序是DS18B20通信的起點(diǎn),其作用是建立主機(jī)(MCU)與從機(jī)(傳感器)之間的同步,并確認(rèn)從機(jī)是否在線。整個(gè)過程分為主機(jī)發(fā)送復(fù)位脈沖和從機(jī)返回應(yīng)答脈沖兩個(gè)階段。首先,主機(jī)通過將單總線(DQ線)拉低至少480μs來發(fā)送復(fù)位脈沖,這一持續(xù)時(shí)間必須足夠長(zhǎng),以確保從機(jī)能夠檢測(cè)到復(fù)位信號(hào)并進(jìn)入初始化狀態(tài)。隨后,主機(jī)釋放總線,此時(shí)總線通過外部上拉電阻(通常為4.7kΩ)恢復(fù)至高電平,主機(jī)進(jìn)入等待狀態(tài)。從機(jī)在檢測(cè)到總線釋放后,會(huì)在15~60μs內(nèi)做出響應(yīng):將DQ線拉低60~240μs,發(fā)送應(yīng)答脈沖。主機(jī)需要在釋放總線后的15~60μs窗口內(nèi)檢測(cè)總線電平,若檢測(cè)到低電平,則說明從機(jī)已正確響應(yīng),初始化成功;若未檢測(cè)到低電平,則可能是傳感器未連接、總線短路或時(shí)序錯(cuò)誤,需重新嘗試初始化。這一時(shí)序的關(guān)鍵在于復(fù)位脈沖的最小時(shí)長(zhǎng)(480μs)和應(yīng)答檢測(cè)的時(shí)間窗口,若復(fù)位脈沖過短,從機(jī)可能無(wú)法識(shí)別;若主機(jī)檢測(cè)應(yīng)答的時(shí)間過早或過晚,都會(huì)錯(cuò)過從機(jī)的應(yīng)答信號(hào),導(dǎo)致初始化失敗。
初始化完成后,主機(jī)需向從機(jī)發(fā)送ROM命令(用于多節(jié)點(diǎn)識(shí)別)和功能命令(用于控制傳感器操作),這兩類命令的傳輸依賴于寫時(shí)隙(Write Time Slot)時(shí)序。寫時(shí)隙是主機(jī)向從機(jī)傳輸單個(gè)二進(jìn)制位(0或1)的基本單位,每個(gè)寫時(shí)隙的時(shí)長(zhǎng)至少為60μs,且相鄰兩個(gè)寫時(shí)隙之間需有至少1μs的恢復(fù)時(shí)間。寫“1”時(shí),主機(jī)先將DQ線拉低1~15μs,隨后釋放總線,使總線在寫時(shí)隙剩余時(shí)間內(nèi)保持高電平;從機(jī)在寫時(shí)隙開始后的15~60μs內(nèi)采樣總線電平,此時(shí)檢測(cè)到高電平,即識(shí)別為“1”。寫“0”時(shí),主機(jī)需將DQ線持續(xù)拉低至少60μs,確保從機(jī)在采樣窗口內(nèi)檢測(cè)到低電平;若拉低時(shí)間不足,從機(jī)可能誤判為“1”。寫命令的過程本質(zhì)是連續(xù)發(fā)送8個(gè)寫時(shí)隙,每個(gè)時(shí)隙對(duì)應(yīng)命令字節(jié)的一位(從最低位開始),因此發(fā)送一個(gè)8位命令的總時(shí)長(zhǎng)至少為8×60μs + 7×1μs = 487μs,實(shí)際應(yīng)用中為保證可靠性,通常會(huì)適當(dāng)延長(zhǎng)時(shí)隙間隔。
當(dāng)主機(jī)需要讀取從機(jī)返回的數(shù)據(jù)(如溫度測(cè)量結(jié)果)時(shí),需遵循讀時(shí)隙(Read Time Slot)時(shí)序。讀時(shí)隙由主機(jī)發(fā)起,每個(gè)讀時(shí)隙的時(shí)長(zhǎng)至少為60μs,且相鄰讀時(shí)隙之間需有至少1μs的恢復(fù)時(shí)間。讀操作開始時(shí),主機(jī)先將DQ線拉低1~15μs,隨后釋放總線,為從機(jī)輸出數(shù)據(jù)做準(zhǔn)備。從機(jī)在檢測(cè)到總線釋放后,會(huì)根據(jù)要發(fā)送的位值控制DQ線電平:若發(fā)送“1”,則保持總線為高電平;若發(fā)送“0”,則將總線拉低,且這一電平狀態(tài)會(huì)持續(xù)15μs左右(從主機(jī)釋放總線開始計(jì)算)。主機(jī)必須在釋放總線后的15μs內(nèi)完成采樣,否則從機(jī)可能已釋放總線,導(dǎo)致采樣錯(cuò)誤。與寫命令類似,讀數(shù)據(jù)時(shí)需連續(xù)發(fā)起8個(gè)讀時(shí)隙,依次讀取字節(jié)的每一位(從最低位開始),因此讀取一個(gè)8位數(shù)據(jù)的總時(shí)長(zhǎng)與寫命令相當(dāng),且需嚴(yán)格控制每個(gè)采樣點(diǎn)的時(shí)間,確保在從機(jī)輸出有效的15μs窗口內(nèi)完成讀數(shù)。





