關(guān)于RS-485總線,這篇很詳細(xì)
前世今生
RS-485,RS是什么意思呢?是Recommended Standard的縮寫,就是推薦標(biāo)準(zhǔn)的意思。485是標(biāo)準(zhǔn)標(biāo)識(shí)號(hào),至于為什么定這個(gè)標(biāo)識(shí)號(hào),則無(wú)需深究。RS-485又稱為ANSI/TIA/EIA-485,這幾個(gè)前綴是標(biāo)準(zhǔn)協(xié)會(huì)的名稱縮寫,比如EIA就是電子工業(yè)協(xié)會(huì) (Electronics Industries Association EIA)的縮寫。1983年,RS-485通訊接口被電子工業(yè)協(xié)會(huì) (Electronics Industries Association EIA)批準(zhǔn)為一種通訊接口標(biāo)準(zhǔn)。即便在現(xiàn)在IOT火熱的今天,RS-485仍然有大量的應(yīng)用。很多協(xié)議使用RS-485作為物理層,比如常用標(biāo)準(zhǔn)協(xié)議使用RS-485作為物理層的有哪些呢?比如:- 工業(yè)HART總線
- modbus協(xié)議
- Profibus DP
- .......
電氣特性
信號(hào)采樣差模傳輸,差模是相對(duì)于共模而言的,差模也稱為差分,那么什么樣的傳輸是差模呢?一圖勝千言,看下面兩個(gè)圖就明白了:共模傳輸
采用共模傳輸方式時(shí),共模噪聲將會(huì)疊加在最終的輸出信號(hào)上面,污染了原始的信號(hào)。差模傳輸
而采用差模傳輸方式,則源端發(fā)出的信號(hào) 與信號(hào)-相位是相反的,而對(duì)于共模噪聲而言在 /-兩條線上都會(huì)存在,理想情況是等幅同相的,而接收端,相當(dāng)于一個(gè)減法器,有用信號(hào)由于相位相反則經(jīng)過減法器仍然保留,而噪聲則會(huì)被抵消。而實(shí)際電路中,則會(huì)大幅度削弱。由此可見,差模傳輸相對(duì)于共模傳輸方式,優(yōu)勢(shì)在于差模方式可以有效抵消共模干擾。差模方式在有的地方又稱為平衡模式,而共模模式也稱為非平衡模式。對(duì)于這個(gè)干擾,我們來(lái)實(shí)際抓個(gè)波形看看:在A/B信號(hào)的邊緣處,波形都略微有些變形,但是你看A-B做差(紅色的為示波器的MATH減功能,為A-B),邊沿則變得非常的干凈!這例子就可以很好地說明差模傳輸可以有效的抵抗共模干擾。
電氣參數(shù)
RS-485的電氣參數(shù)為:- 共模電壓范圍為-7~ 12V
- 可支持32個(gè)多點(diǎn)拓?fù)溥B接,見下面的網(wǎng)絡(luò)拓?fù)鋱D
- 使用40英尺線纜時(shí),傳輸速率可達(dá)10Mbps,1英尺相當(dāng)于30.48cm,這里Mbps是兆bit/s的意思
- 使用4000英尺線纜時(shí),傳輸速率可達(dá)到100kbps
- 半雙工通信
- 最小差分電壓容限:200mV,也就是說接收端在差分電壓低于200mV時(shí)就無(wú)法正確識(shí)別0/1了。這句話應(yīng)該怎么理解呢?
:對(duì)于接收電路是判決A線共模電壓與B線共模電壓之差:這里的參數(shù),應(yīng)該是在一定特征阻抗線纜時(shí)的理論值,實(shí)際工程使用的時(shí)候需要做相應(yīng)的調(diào)整以及現(xiàn)場(chǎng)測(cè)試。一般以不超出這個(gè)理論極限為好。說到電氣特性參數(shù),首先來(lái)看看一般的接口電路:從這樣一個(gè)接口電路來(lái)看,有這么些要點(diǎn):簡(jiǎn)單說就是,A線的絕對(duì)電壓值比B線的至少大于200mV則識(shí)別為邏輯1,或者A線的絕對(duì)電壓值比B線的至少小200mV,才識(shí)別為邏輯0
- 如果 ,則接收電路R識(shí)別為邏輯 1
- 如果 ,則接收電路R識(shí)別為邏輯0
- RS-485通信從單片機(jī)/DSP/處理器接口而言,是利用UART接口與RS-485收發(fā)器接口。當(dāng)然你說我用FPGA難道不行么?肯定是可以的,用FPGA實(shí)現(xiàn)一個(gè)串口收發(fā)的IP模塊,當(dāng)然也是可以的。甚至你想說,我拿GPIO去模擬一下 UART 是不是就不行?也是能辦得到的,只不過這么干意義不大,需要占用CPU資源實(shí)現(xiàn)底層BIT的收發(fā)。
- 前面說到半雙工,有半雙工就有全雙工。什么是半雙工呢?首先半雙工以及全雙工,所界定的對(duì)象一定是點(diǎn)對(duì)點(diǎn)而言的,這里說點(diǎn)對(duì)點(diǎn)就是指在同一時(shí)刻而言,所謂半雙工,就是設(shè)備在同一時(shí)刻要么處于收數(shù)據(jù)狀態(tài), 要么處于發(fā)數(shù)據(jù)狀態(tài), 不允許同時(shí)收發(fā)數(shù)據(jù)。?全雙工則剛好相反,允許同時(shí)收發(fā)。比如 I2C 總線就是半雙工總線,4線制 SPI 是全雙工,而三線制SPI則是半雙工總線;又譬如RS-422或者RS-232 是全雙工接口;而CAN總線則是半雙工總線。RS-485就是一種半雙工總線:
- 當(dāng)Host發(fā)送數(shù)據(jù)時(shí),數(shù)據(jù)沿著紅色的線經(jīng)由雙絞線,傳輸至Slave的差分接收電路,當(dāng)slave應(yīng)答時(shí),數(shù)據(jù)沿著蘭色的方向傳輸至Host的接收電路,但是傳輸介質(zhì)是一對(duì)雙絞線,所以一方在傳輸數(shù)據(jù)的時(shí)候,另一方是無(wú)法傳輸信號(hào)的,從收發(fā)器的控制角度來(lái)看:控制芯片側(cè),用一個(gè)GPIO腳來(lái)控制收發(fā)使能,來(lái)一張芯片內(nèi)部原理框圖,就很容易理解了:
- 當(dāng)DIR=0時(shí),接收電路使能,發(fā)送電路禁止DE=0,對(duì)總線而言相當(dāng)于高阻;當(dāng) DIR=1 時(shí),接收電路使能?,發(fā)送電路禁止DE=1,對(duì)總線A/B信號(hào)取決于DI的信號(hào)。這里有兩個(gè)問題:1.為什么芯片要把設(shè)計(jì)成相反的有效邏輯呢?這樣其實(shí)也是方便用一個(gè)GPIO同時(shí)控制收發(fā)電路的考慮。2.那收發(fā)器芯片收發(fā)使能為什么不做成一個(gè)腳呢?比如就叫DIR?做成兩個(gè)腳收/發(fā)也可以用兩個(gè)腳單獨(dú)控制,比如:
- 甚至可以在DE=1的時(shí)候,將設(shè)置為0,這樣是不是就可以自環(huán)了?產(chǎn)品中也可以就這樣設(shè)計(jì),可以實(shí)現(xiàn)收發(fā)器以及布線的自診斷,通過接收到的報(bào)文與發(fā)送出去的報(bào)文比較,可以診斷出芯片焊接,收發(fā)器是否損壞或者斷路,以及布線是否存在短路故障。或許你會(huì)說,瞎扯!你前面才說RS-485不能同時(shí)收發(fā),這里又說能同時(shí)收發(fā),豈不是自相矛盾嗎?不矛盾,前面所說的不能同時(shí)收發(fā),是指發(fā)的同時(shí)不能收來(lái)自其他設(shè)備的發(fā)送報(bào)文,這里收的是自身發(fā)出的報(bào)文。
所以半雙工的本質(zhì),是通訊介質(zhì)不存在雙向通道,在向總線發(fā)送數(shù)據(jù)的時(shí)候,介質(zhì)被占用,即便想發(fā)送也是無(wú)法正確的將信號(hào)發(fā)送到介質(zhì)上的,如果強(qiáng)行發(fā)送,數(shù)據(jù)將會(huì)錯(cuò)亂,甚至收發(fā)器芯片有可能損壞。
- : Receiver Output Enable,接收器使能,
- DE:Driver Output Enable,驅(qū)動(dòng)輸出使能
- 圖中的DIR腳就是控制當(dāng)前RS-485是處于“收”還是處于“發(fā)”模式。
如果想看差分信號(hào),就可以利用雙通道示波器加MATH減功能觀測(cè)?;蛟S有的示波器沒有MATH功能,那么這里還可以使用一個(gè)技巧:將B通道,或者說差分信號(hào)的負(fù)端反相,然后將B通道上移至空閑電平重合,這樣是不是也就比較直觀的可以看出A-B了?通過這個(gè)圖,能發(fā)現(xiàn)哪些有價(jià)值的信號(hào)特征呢?
- 信號(hào)A在空閑時(shí)候?yàn)楦唠娖?;信?hào)B在空閑時(shí)為低電平。所以你會(huì)看到有設(shè)備上會(huì)標(biāo)識(shí)485_A ,485_B-。
- 每個(gè)通道的共模電壓值都在標(biāo)準(zhǔn)要求的-7~12V之內(nèi),信號(hào)A為4V,信號(hào)B為5V:
這里抓的數(shù)據(jù)是一個(gè)MODBUS-RTU主端發(fā)送給從設(shè)備的報(bào)文,其內(nèi)容前面兩個(gè)字節(jié)是0x01 0x03,UART模式為1個(gè)起始位,8個(gè)數(shù)據(jù)位,1個(gè)停止位,無(wú)校驗(yàn)位,低位在前,此例中UART的通訊格式為先根據(jù)UART通訊模式,來(lái)計(jì)算一下幾個(gè)參數(shù),每bit占用時(shí)間,每字節(jié)占用時(shí)間:這個(gè)圖就是起始位,寬度正好是104us。
對(duì)于解析這種異步串行時(shí)序波形而言,最重要就是根據(jù)通信格式計(jì)算位時(shí)間,字節(jié)時(shí)間,進(jìn)而可以直接解析波形數(shù)據(jù)。從這一點(diǎn)思考,假設(shè)要利用FPGA來(lái)實(shí)現(xiàn)一個(gè)UART協(xié)議邏輯分析儀,這就是最為核心的指標(biāo),通過檢測(cè)到起始位邊沿,進(jìn)而通過時(shí)間軸將數(shù)據(jù)解析出來(lái)。這里我來(lái)充當(dāng)一個(gè)肉眼UART邏輯分析儀吧:8bit數(shù)據(jù)的時(shí)間寬度剛好是832us,由于格式是低位在前,所以要反過來(lái)看,與實(shí)際發(fā)送的數(shù)據(jù)0x01 0x03是吻合的。這里在調(diào)試底層的時(shí)候遇到問題,就可以通過這種方式可以檢查軟件是否正確的驅(qū)動(dòng)了硬件,譬如在調(diào)試I2C/SPI等等其他底層接口的時(shí)候,都可以類似的去檢查硬件波形,唯一不一樣的是,I2C/SPI屬于同步通信,所謂同步通信,是指其通信底層有同步時(shí)鐘信號(hào),I2C的SCL,SPI的SCK都屬于同步時(shí)鐘。
驅(qū)動(dòng)能力
電氣參數(shù)里總結(jié)說RS-485最大電氣驅(qū)動(dòng)能力,在多點(diǎn)網(wǎng)絡(luò)拓?fù)?/strong>結(jié)構(gòu)下,可最大驅(qū)動(dòng)32個(gè)站點(diǎn)。那么怎么去解讀這一指標(biāo)呢?首先來(lái)考察一個(gè)站點(diǎn)收發(fā)電路特性,收發(fā)器的接收電路其標(biāo)準(zhǔn)等效輸入阻抗為12k?,比如MAX 485數(shù)據(jù)手冊(cè)為例:至于為什么是32個(gè)呢?主要是由于前面200mV最小驅(qū)動(dòng)能力的規(guī)定。也可以這樣理解一下,每一個(gè)接收電路輸入阻抗并非理想的高阻,而是12k?,那么比如其中一個(gè)站點(diǎn)發(fā)送,就相當(dāng)于有32個(gè)站點(diǎn)的輸入阻抗并聯(lián),為什么是32個(gè)呢?別忘了發(fā)送站點(diǎn)自身也有接收電路,所以在不考慮端接電阻以及線路阻抗的情況下,對(duì)于發(fā)送電路接了一個(gè)等效負(fù)載:,而發(fā)送電路驅(qū)動(dòng)能力肯定是有限的,這樣就好理解了。下面這個(gè)圖就是所謂的多點(diǎn)網(wǎng)絡(luò)拓?fù)?/strong>,所有的站點(diǎn)都是沿著雙絞線的排布并接在總線上的。所以,你有可能會(huì)在一些地方看到所謂的一個(gè)單位RS-485負(fù)載的說法,這里所謂的單位負(fù)載就是指12k?標(biāo)準(zhǔn)輸入阻抗,這個(gè)12k?就是EIA-485標(biāo)準(zhǔn)定義的。從而看到比如?單位負(fù)載之類的說法,就是源于此處。數(shù)據(jù)監(jiān)控
比如一個(gè)基于RS-485的Modbus-RTU多點(diǎn)網(wǎng)絡(luò)中,在做協(xié)議編程或者實(shí)際多站點(diǎn)總線調(diào)試的時(shí)候,有可能需要監(jiān)控總線上所有的報(bào)文。甚至還有可能就像實(shí)現(xiàn)一個(gè)總線報(bào)文的的記錄器,將總線上所有的報(bào)文都記錄下來(lái)。應(yīng)該怎么實(shí)現(xiàn)呢?買一根USB轉(zhuǎn)RS-485的轉(zhuǎn)換線或者自己做一個(gè)也可以。將A/B線并接在總線上,USB 插入電腦。使用串口監(jiān)控終端或者自己寫一個(gè)串口接收小軟件,就可以監(jiān)控所有總線上的報(bào)文了。比如這個(gè)AccessPort串口工具就比較好用:應(yīng)用設(shè)計(jì)
作為應(yīng)用設(shè)計(jì)而言,需要考慮這些維度:- 端接設(shè)計(jì)
- 接口芯片
- 隔離設(shè)計(jì)
端接設(shè)計(jì)
首先為什么要端接?這是由于RS-485采用雙絞線傳輸,標(biāo)準(zhǔn)規(guī)定的雙絞線的差分特征阻抗在100Ω至150Ω之間。RS-485標(biāo)準(zhǔn)制定者選擇120Ω作為標(biāo)稱特征阻抗。假定信號(hào)自左邊站點(diǎn)發(fā)出,如果沒有端接,信號(hào)在線路上傳輸其阻抗是連續(xù)的,但是到達(dá)右側(cè)的時(shí)候則,等效阻抗變成了接收電路的輸入阻抗,比如是12kΩ,阻抗不連續(xù)了,阻抗突變!信號(hào)的一部分能量就會(huì)按照原路徑返回,如返回回去的信號(hào)由于容抗及感抗,就會(huì)產(chǎn)生相差。反射回去的信號(hào)與原信號(hào)疊加在一起。這樣就會(huì)造成通信發(fā)生錯(cuò)誤,嚴(yán)重的時(shí)候,通信就無(wú)法正確進(jìn)行。要想更深入的了解背后的原理,可以去學(xué)習(xí)一下傳輸線理論。或許做過Profibus DP(物理層也是采用的RS-485)的朋友會(huì)說,你看profibus DP為什么推薦的終端匹配電路是下面這樣的呢?其實(shí)是因?yàn)镻rofibus DP采用的通信介質(zhì)其標(biāo)稱特征阻抗不一樣。所以實(shí)際工程應(yīng)用的時(shí)候則會(huì)有小的差異。在TI的資料上看到這樣一個(gè)端接接法:在噪聲比較嚴(yán)重的場(chǎng)合,建議使用右邊的端接方案,利用兩個(gè)60Ω電阻以及220pF電容形成低通濾波器,將增加線路的抗噪聲能力。在實(shí)際工程布線的時(shí)候,如果遇到噪聲比較嚴(yán)重的時(shí)候,一方面可以利用示波器查看總線信號(hào)質(zhì)量,在將端接方式做一些小的調(diào)整。
接口設(shè)計(jì)
RS-485收發(fā)器芯片很多芯片公司都提供,比如TI,Microchip 等廠家都有,選擇接口芯片的時(shí)候需要考慮,芯片的供電電壓輸入邏輯是否與使用的單片機(jī)/DSP的電平兼容,另外就是前面提到的其接收電路的阻抗是否是符合RS-485標(biāo)準(zhǔn)輸入阻抗的。如果不是的,那么在考慮網(wǎng)絡(luò)部署的時(shí)候,所能帶的負(fù)載數(shù)量就有可能需要做調(diào)整。另外注意一下,有的新設(shè)計(jì)RS-485收發(fā)器具備fail-safe功能。另外,前面說到標(biāo)準(zhǔn)收發(fā)器可以驅(qū)動(dòng)32個(gè)標(biāo)準(zhǔn)收發(fā)器負(fù)載設(shè)備,也即是(12kΩ)標(biāo)準(zhǔn)單位輸入阻抗。在做具體接口電路設(shè)計(jì)的時(shí)候還需要考慮EMC要求,在一些設(shè)備現(xiàn)場(chǎng)真的有很強(qiáng)的干擾,比如電網(wǎng)上有大的電機(jī)等感性設(shè)備運(yùn)行,有時(shí)候就會(huì)干擾設(shè)備;另外也有可能有空間輻射干擾,這時(shí)候可以考慮采用帶屏蔽雙絞線,屏蔽層接大地,抗干擾方面我了解的不是很深入,僅整理一下。在這里看到一個(gè)防雷接口電路的設(shè)計(jì)方案,可以參考一下:https://www.programmersought.com/article/95833359295/前面說通常標(biāo)準(zhǔn)RS-485可以容納32個(gè)標(biāo)準(zhǔn)接收阻抗收發(fā)設(shè)備。實(shí)際系統(tǒng)中就是想接入超過32個(gè)站點(diǎn)設(shè)備,怎么辦呢?可以設(shè)計(jì)一個(gè)中繼設(shè)備。想當(dāng)于將兩個(gè)網(wǎng)段利用中繼給銜接起來(lái),以解決驅(qū)動(dòng)能力不足的問題。當(dāng)然也有這樣的現(xiàn)成產(chǎn)品。隔離設(shè)計(jì)
為什么要隔離,是為了降低接地噪聲。在很多現(xiàn)場(chǎng)可能有大電流開關(guān)設(shè)備,電機(jī)感性設(shè)備等,噪聲很有可能通過通訊的接地耦合進(jìn)設(shè)備。尤其在工業(yè)設(shè)備中,一般都會(huì)設(shè)計(jì)成帶隔離的接口電路。要設(shè)計(jì)隔離接口,可以考慮選擇具有隔離功能的芯片,比如ADI的 iCoupler技術(shù)產(chǎn)品ADM2481,ADM2485。當(dāng)然也可以采用光耦 普通RS-485收發(fā)器的方式。唯一需要注意的是需要設(shè)計(jì)一個(gè)帶隔離的電源,給隔離兩側(cè)電路分別供電。
上面這個(gè)圖來(lái)自TI的《The RS-485 Design Guide》,這份資料感覺很不錯(cuò),本文很多地方也參考這份文檔整理的。如對(duì)這份資料有興趣,關(guān)注下方公眾號(hào):我要嵌入式,后臺(tái)回復(fù):485,自動(dòng)領(lǐng)取。