原來(lái)rs-485這么簡(jiǎn)單?
▉ rs-485概述
rs-485和rs-232一樣,都是串行通信標(biāo)準(zhǔn),現(xiàn)在的標(biāo)準(zhǔn)名稱是tia485/eia-485-a,但是人們會(huì)習(xí)慣稱為rs-485標(biāo)準(zhǔn),rs-485常用在工業(yè)、自動(dòng)化、汽車和建筑物管理等領(lǐng)域。
rs-485總線彌補(bǔ)了rs-232通信距離短,速率低的缺點(diǎn),rs-485的速率可高達(dá)10mbit/s,理論通訊距離可達(dá)1200米;rs-485和rs-232的單端傳輸不一樣,是差分傳輸,使用一對(duì)雙絞線,其中一根線定義為a,另一個(gè)定義為b。
▉ rs-485物理層
rs-485的物理層負(fù)責(zé)在設(shè)備和物理傳輸介質(zhì)之間傳輸原始數(shù)據(jù)。它處理電信號(hào)到數(shù)字?jǐn)?shù)據(jù)的轉(zhuǎn)換,同時(shí)定義電壓、時(shí)序、數(shù)據(jù)速率等。
① 差分信號(hào)
長(zhǎng)距離布線會(huì)有信號(hào)衰減,而且引入噪聲和干擾的可能性更大,在線纜a和b上的表現(xiàn)就是電壓幅度的變化,但是,采用差分線的好處就是,差值相減就會(huì)忽略掉干擾依舊能輸出正常的信號(hào),把這種差分接收器忽略兩條信號(hào)線上相同電壓的能力稱為共模抑制。
標(biāo)準(zhǔn)規(guī)定了,邏輯1:+2v to +6v;邏輯0:-6v to -2v。
rs-485不需要使用特定的總線電壓,只看小差分電壓,在較長(zhǎng)的電纜長(zhǎng)度上,接收器接收到的電壓可能會(huì)降低到+/- 200 mv,這對(duì)于rs-485仍然是可以接受的,這也是rs-485的優(yōu)點(diǎn)之一。
很多收發(fā)器的標(biāo)準(zhǔn)達(dá)到甚至超過(guò)tia/eia-485a規(guī)范,在實(shí)際使用中,以器件的spec參數(shù)為主,如下某收發(fā)器的負(fù)輸入閾值小也是-200mv。
② 信號(hào)定義
現(xiàn)在很多的rs-485轉(zhuǎn)換器都是兼容rs-422的,所以看到很多轉(zhuǎn)換器上面的信號(hào)都是t/r+、t/r-,即對(duì)應(yīng)rs-485的a+和b-。
對(duì)于db9針型的母頭,rs-485有如下的接線定義示意,pin6~pin9為n/a不接。
③ 拓?fù)浣Y(jié)構(gòu)
rs485有兩線制和四線制兩種接線,四線制只能實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)的通信方式,現(xiàn)很少采用,多采用的是兩線制接線方式,這種接線方式為總線拓?fù)浣Y(jié)構(gòu),在同一總線上多可以掛接32個(gè)節(jié)點(diǎn)。
rs-485總線同i2c,也是主從模式,支持點(diǎn)對(duì)點(diǎn)單從機(jī)模式,也支持多從機(jī)模式,不支持多主機(jī)模式。
▉ rs-485收發(fā)器
rs-485是差分傳輸,如果用單片機(jī)控制rs-485接口的設(shè)備,需要用到收發(fā)器,這一點(diǎn)和can總線是類似的,如下是一個(gè)mcu控制一個(gè)rs-485的圖示。
收發(fā)器內(nèi)部是一個(gè)接收器(上半部分)加一個(gè)發(fā)送器(下半部分),下面簡(jiǎn)單說(shuō)說(shuō)收發(fā)器的原理,便于理解mcu是如何和485設(shè)備通信的。
其中:
a和b為總線;
r為接收器輸入;
re為接收器使能信號(hào);
de為發(fā)送器使能信號(hào);
d為發(fā)送器輸出;
對(duì)于使能信號(hào),字母上面加一橫的為低電平有效(如上圖re),不加的為高電平有效(如de)。
對(duì)于發(fā)送器,有如下的真值表:
1、當(dāng)驅(qū)動(dòng)器使能引腳de為邏輯高時(shí),差分輸出a和b遵循數(shù)據(jù)輸入d處的邏輯狀態(tài)。d處的邏輯高導(dǎo)致a轉(zhuǎn)為高,b轉(zhuǎn)為低。在這種情況下,定義為vod=va-vb的差分輸出電壓為正。當(dāng)d為低時(shí),輸出狀態(tài)反轉(zhuǎn),b變高,a變低,vod為負(fù)。
2、當(dāng)de低時(shí),兩個(gè)輸出都變成高阻抗。在這種情況下,與d處的邏輯狀態(tài)是不相關(guān)的。
對(duì)于接收器,有如下的真值表:
1、當(dāng)接收器使能引腳re邏輯低時(shí),接收器被激活。當(dāng)定義為vid=va–vb的差分輸入電壓為正且高于正輸入閾值vit+時(shí),接收機(jī)輸出r變高。當(dāng)vid為負(fù)且低于負(fù)輸入閾值vit-,接收機(jī)輸出r變低。如果vid在vit+和vit-之間,則輸出不確定。
2、當(dāng)re為邏輯高或懸空時(shí),接收機(jī)輸出為高阻抗,vid的大小和極性無(wú)關(guān)。
▉ rs-485數(shù)據(jù)鏈路
上面講到的rs-485收發(fā)器的工作原理,下面簡(jiǎn)單描述rs-485的數(shù)據(jù)鏈路,可以先看一下通俗易懂的uart協(xié)議幀格式
主機(jī)發(fā)送給從機(jī)或者從機(jī)發(fā)送給主機(jī),都會(huì)占用到a和b線,所以rs-485多用在半雙工模式。
主機(jī)的gpio會(huì)控制rs-485收發(fā)器的de管腳,設(shè)置發(fā)送模式,從uart txd線向rs-485收發(fā)器的數(shù)據(jù)(d或di)線發(fā)送一個(gè)字節(jié),收發(fā)器將在a和b線上將單端uart位流轉(zhuǎn)換為差分位流,數(shù)據(jù)離開(kāi)收發(fā)器后,主機(jī)立即將收發(fā)器的模式切換為接收模式。
從機(jī)和主機(jī)是類似的,從機(jī)控制rs-485收發(fā)器的/re管腳,設(shè)置為接收模式,接收主機(jī)發(fā)送的比特流,將其轉(zhuǎn)換為單端信號(hào),通過(guò)從機(jī)的uart rxd線接收,當(dāng)從機(jī)準(zhǔn)備好響應(yīng)時(shí),它按主機(jī)原來(lái)的方式進(jìn)行發(fā)送,而主機(jī)變?yōu)榻邮铡?br>▉ rs-232和rs-485轉(zhuǎn)換
rs-232和rs-485之間可以轉(zhuǎn)換,一個(gè)方法是rs-232轉(zhuǎn)換成ttl,再由ttl轉(zhuǎn)換為rs-485,當(dāng)然也有芯片支持將rs-232直接轉(zhuǎn)換成rs-485,網(wǎng)上有很多模塊。
▉ rs-485和can的區(qū)別
雖說(shuō)rs-485沒(méi)有標(biāo)準(zhǔn)的數(shù)據(jù)協(xié)議格式,但和can總線在很多地方是有相似的,比如a&b和canh&canl都是差分信號(hào),通信都需要收發(fā)器,都需要120歐姆的匹配電阻等等。
▉ rs-485常用電路
網(wǎng)上找的一個(gè)常用的rs-485電路,其中需要注意兩點(diǎn):
1、使能信號(hào)re和de可采用一個(gè)gpio控制,節(jié)省資源,gpio25輸出高電平,re=de=0v,進(jìn)入接收模式;gpio25輸出低電平,re=de=3.3v,進(jìn)入發(fā)送模式。
2、有一些電路中會(huì)在a上加上拉,b上加下拉電阻,主要原因是:rs-485總線在idle狀態(tài),電平是不固定的,即電平在-200mv~+200mv之間,收發(fā)器可能輸出高也可能輸出低,uart在空閑時(shí)需要保持高電平的,如果此時(shí)收發(fā)器輸出一個(gè)低電平,對(duì)uart來(lái)說(shuō)是一個(gè)start bit,會(huì)導(dǎo)致通信異常,關(guān)于ru和rd的阻值在這里不作過(guò)多贅述,后面有機(jī)會(huì)會(huì)詳細(xì)寫(xiě)一篇文章。
關(guān)于第二點(diǎn),需要注意:
① a上加上拉,b上加下拉,接反數(shù)據(jù)通信也可能出錯(cuò)。
② 某些收發(fā)器內(nèi)部集成上下拉電阻,則外部不需要再添加。