麥?zhǔn)迨歉?a target="_blank">嵌入式的,最近項(xiàng)目delay,他和我說(shuō)用UART驅(qū)動(dòng)1-Wire設(shè)備總是出現(xiàn)問(wèn)題,故寫(xiě)此文來(lái)拯救他。
作者之前寫(xiě)過(guò)UART(點(diǎn)我),也寫(xiě)過(guò)1-Wire(點(diǎn)我),本文介紹如何用主機(jī)的UART驅(qū)動(dòng)1-Wire從機(jī)設(shè)備,建議先看看以上兩篇文章,再閱讀本文,效果更佳。
硬件電路
1-Wire結(jié)構(gòu)簡(jiǎn)單,一根線就可以通信,常見(jiàn)的18B20用的就是1-Wire結(jié)構(gòu)。單片機(jī)的串口UART(多是TTL電平),如何用單片機(jī)控制通用的1-Wire設(shè)備呢?如果MCU和從設(shè)備的電平不一致如何解決?軟件協(xié)議又是如何控制的呢?本文主要解決這兩個(gè)問(wèn)題。
主機(jī)或從機(jī)將數(shù)據(jù)線拉低到GND表示數(shù)據(jù)0,將數(shù)據(jù)線釋放為高表示數(shù)據(jù)1,高電平由上拉電阻(一般是4.7K)提供。
當(dāng)MCU發(fā)送邏輯1時(shí),經(jīng)過(guò)反相器,總線呈現(xiàn)邏輯0,邏輯0經(jīng)過(guò)1-WIRE器件的反相器,即會(huì)收到邏輯1;
當(dāng)MCU發(fā)送邏輯0時(shí),經(jīng)過(guò)反向器,總線呈現(xiàn)邏輯1,邏輯1經(jīng)過(guò)1-WIRE 器件的反相器,即會(huì)收到邏輯0;
當(dāng)1WIRE 器件發(fā)送邏輯1時(shí),Tx處有NMOS會(huì)導(dǎo)通,總線呈現(xiàn)邏輯0,經(jīng)過(guò)MCU Rx 處的反相器,MCU會(huì)收到邏輯1;
當(dāng)1WIRE器件發(fā)送邏輯0時(shí),NMOS截止,總線呈現(xiàn)邏輯1,MCU會(huì)收到邏輯0;

主機(jī)端(BUS MASTER)多為MCU,因?yàn)镸CU的TXD不是漏極開(kāi)路,因此通常需要一個(gè)外部漏極開(kāi)路緩沖電路,該電路可以由分立元件構(gòu)成。
用兩個(gè)NMOS管2N7002,原理很簡(jiǎn)單:
TXD輸出高電平時(shí),左邊的2N7002導(dǎo)通,右邊的截止,DQ被4.7K電阻上拉至Vpullup高電平;
TXD輸出低電平時(shí),左邊的2N7002截止,右邊的導(dǎo)通,DQ被拉低至低電平0;

用分立器件搭建的緩沖電路
也可以用集成芯片NC7WZ07,如下圖所示,TXD輸出高,DQ=Vpullup,TXD輸出低,DQ=0;

用集成芯片搭建的緩沖電路
解決了硬件電路,我們?cè)賮?lái)看軟件協(xié)議部分,1-Wire的協(xié)議可以分為復(fù)位/應(yīng)答、寫(xiě)0/寫(xiě)1時(shí)隙、讀0/讀1時(shí)隙。
軟件協(xié)議
復(fù)位/應(yīng)答
如下圖,上面部分是1-Wire的復(fù)位/應(yīng)答時(shí)序,下面是UART的時(shí)序。

復(fù)位/應(yīng)答信號(hào)時(shí)序
原理:
主機(jī)以9600的波特率發(fā)送數(shù)據(jù)0XF0,因?yàn)長(zhǎng)SB在前,0XF0=00001111,加上最前面的Start Bit和最后面的Stop Bit,完整的數(shù)據(jù)為:0000011111,代表主機(jī)先發(fā)了5位的0,然后發(fā)了5位的1;9600波特率,一位傳輸時(shí)間是1/9600=104.2us,所以低電平持續(xù)時(shí)間為104.2*5=521us,滿(mǎn)足480~960us復(fù)位總線的時(shí)序要求。
那主機(jī)收到什么數(shù)據(jù)代表從機(jī)應(yīng)答呢?
首先主機(jī)如果發(fā)送F0后收到還是F0,說(shuō)明從機(jī)沒(méi)有應(yīng)答,從機(jī)應(yīng)答總線數(shù)據(jù)會(huì)改變,可以簡(jiǎn)單的判斷收到的數(shù)據(jù)為非F0即代表從機(jī)應(yīng)答。
根據(jù)1-Wire的時(shí)序波形,也可以進(jìn)行推算,從上圖看,Data0~Data3均為0,因?yàn)?-Wire時(shí)序是有一定時(shí)間范圍,并不是固定的脈寬,如TPDH為15~60us,TPDL為60~240us,所以Data4~Data7是有一定的組合,返回0X10(00001000) to 0X90(00001001)都代表從機(jī)應(yīng)答。

寫(xiě)0/寫(xiě)1時(shí)隙
主機(jī)寫(xiě)0就是0X00,也可以加入回讀,回讀值即為寫(xiě)的值。

寫(xiě)0時(shí)隙
寫(xiě)1就是0XFF,回讀值即為寫(xiě)的值。

寫(xiě)1時(shí)隙圖
讀0/讀1時(shí)隙
關(guān)于讀時(shí)隙,可以先看主機(jī)讀1時(shí),主機(jī)先拉低總線,一般時(shí)間1us左右,UART的Start Bit會(huì)占1/115200=8.7us的脈寬(大于1us),所以從Data0開(kāi)始,后面的數(shù)據(jù)都為1,即讀到的數(shù)據(jù)為11111111(0XFF)代表讀到的是1。

讀1時(shí)隙圖
那讀0也就很簡(jiǎn)單,讀到的數(shù)據(jù)不為0XFF即為0。

讀0時(shí)隙圖
小結(jié)一下
實(shí)際代碼里面的判斷,可以簡(jiǎn)單處理,復(fù)位/應(yīng)答:發(fā)送F0,返回不為F0,即代表從機(jī)應(yīng)答;讀0/讀1時(shí)隙:主機(jī)讀到0XFF即為1,讀到非0XFF即為0;簡(jiǎn)單又可靠,麥?zhǔn)暹€不會(huì)。
今天的文章到這里就結(jié)束了,希望對(duì)你有幫助,我們下一期見(jiàn)。
責(zé)任編輯:haq
-
芯片
+關(guān)注
關(guān)注
463文章
54007瀏覽量
465929 -
電路
+關(guān)注
關(guān)注
173文章
6075瀏覽量
178376 -
單片機(jī)
+關(guān)注
關(guān)注
6076文章
45494瀏覽量
670262
發(fā)布評(píng)論請(qǐng)先 登錄
多協(xié)議可編程USB接口適配器
分享1-Wire接口數(shù)字溫度傳感器IC型號(hào)
多路UART數(shù)據(jù)轉(zhuǎn)發(fā)芯片 支持1主4從UART接口 UART擴(kuò)展芯片
怎么通過(guò)UART1對(duì)指紋識(shí)別模塊的控制
使用設(shè)備驅(qū)動(dòng)uart數(shù)據(jù)丟幀怎么解決?
求助,關(guān)于串口設(shè)備驅(qū)動(dòng)fifo問(wèn)題
DS28E01-100 1Kb、保護(hù)型1-Wire EEPROM,帶有SHA-1引擎技術(shù)手冊(cè)
DS28E10 1-Wire SHA-1認(rèn)證器技術(shù)手冊(cè)
DS28E02 1-Wire SHA-1認(rèn)證器,具有1Kb EEPROM,工作在1.8V技術(shù)手冊(cè)
DS2465 DeepCover安全認(rèn)證器具有SHA-256協(xié)處理器和1-Wire主機(jī)功能技術(shù)手冊(cè)
DS28E15內(nèi)置1-Wire SHA-256和512位用戶(hù)EEPROM的DeepCover安全認(rèn)證方案
DS28EL15 DeepCover安全認(rèn)證器,帶有1-Wire SHA-256和512位用戶(hù)EEPROM技術(shù)手冊(cè)
DS24L65 DeepCover安全認(rèn)證器,具有SHA-256協(xié)處理器和1-Wire主機(jī)功能技術(shù)手冊(cè)
DS2475帶1-Wire主機(jī)的DeepCover ECDSA協(xié)處理器技術(shù)手冊(cè)
DS28E16 1-Wire SHA-3安全認(rèn)證器技術(shù)手冊(cè)
為什么UART驅(qū)動(dòng)1-Wire設(shè)備總是出現(xiàn)問(wèn)題?
評(píng)論