RS-485是差分傳輸,如果用單片機(jī)控制RS-485接口的設(shè)備,需要用到收發(fā)器,這一點(diǎn)和CAN總線是類似的,如下是一個(gè)MCU控制一個(gè)RS-485的圖示。
圖1
收發(fā)器內(nèi)部是一個(gè)接收器(上半部分)加一個(gè)發(fā)送器(下半部分),下面簡(jiǎn)單說(shuō)說(shuō)收發(fā)器的原理,便于理解MCU是如何和485設(shè)備通信的。
圖2 RS-485收發(fā)器內(nèi)部結(jié)構(gòu)
其中:
A和B為總線;
R為接收器輸入;
RE為接收器使能信號(hào);
DE為發(fā)送器使能信號(hào);
D為發(fā)送器輸出;
對(duì)于使能信號(hào),字母上面加一橫的為低電平有效(如上圖RE),不加的為高電平有效(如DE)。
對(duì)于發(fā)送器,有如下的真值表:
當(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ù)。
當(dāng)DE低時(shí),兩個(gè)輸出都變成高阻抗。在這種情況下,與D處的邏輯狀態(tài)是不相關(guān)的。
圖3 發(fā)送器真值表
對(duì)于接收器,有如下的真值表:
當(dāng)接收器使能引腳RE邏輯低時(shí),接收器被激活。當(dāng)定義為VID=VA–VB的差分輸入電壓為正且高于正輸入閾值VIT+時(shí),接收機(jī)輸出R變高。當(dāng)VID為負(fù)且低于負(fù)輸入閾值VIT-,接收機(jī)輸出R變低。如果VID在VIT+和VIT-之間,則輸出不確定。
當(dāng)RE為邏輯高或懸空時(shí),接收機(jī)輸出為高阻抗,VID的大小和極性無(wú)關(guān)。
圖4 接收器真值表
**2 **RS-485數(shù)據(jù)鏈路
上面講到的RS-485收發(fā)器的工作原理,下面簡(jiǎn)單描述RS-485的數(shù)據(jù)鏈路。
圖5
主機(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)榻邮铡?/p>
**3 **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)上有很多模塊。
RS232接口是一種用于近距離(最大30-60米)、慢速度、點(diǎn)對(duì)點(diǎn)通訊的通訊協(xié)議,在RS232中一個(gè)信號(hào)只用到一條信號(hào)線,采取與地電壓參考的方式,因而在長(zhǎng)距離傳輸后,發(fā)送端和接收端地電壓有出入,容易造成通訊出錯(cuò)或速度降低。
RS485/422接口采用不同的方式:每個(gè)信號(hào)都采用雙絞線(兩根信號(hào)線)傳送,兩條線間的電壓差用于表示數(shù)字信號(hào)。例如把雙絞線中的一根標(biāo)為 A(正),另一根標(biāo)為B(負(fù)),當(dāng)A為正電壓(通常為+5V),B為負(fù)電壓時(shí)(通常為0),表示信號(hào)“1”;反之,A為負(fù)電壓,B為正電壓時(shí)表示信號(hào) “0”。RS485/422允許通訊距離可達(dá)到1200米,采用合適的電路可達(dá)到2.5MB/s的傳輸速率。
RS422與RS485采用相同的通訊協(xié)議,但有所不同:它采用兩根雙絞線,數(shù)據(jù)可以同時(shí)雙向傳遞(全雙工)。 而RS485則采用一根雙絞線,輸入輸出信號(hào)不能同時(shí)進(jìn)行(半雙工),RS485可用于多點(diǎn)通訊,一條信號(hào)線上可連接多個(gè)設(shè)備,它通常采用主/從結(jié)構(gòu)。
在RS485(半雙工)通信中, 發(fā)送信號(hào)時(shí),由TXD輸出的TTL電平信號(hào)經(jīng)RS485轉(zhuǎn)換器轉(zhuǎn)換后,從發(fā)送器(A和B)輸出RS485信號(hào);接收信號(hào)時(shí),RS485信號(hào)經(jīng)接收器(A和B)接收后,然后RS485轉(zhuǎn)換器將信號(hào)轉(zhuǎn)換為T(mén)TL電平信號(hào),傳給RXD 。(注意: 2個(gè)需要通訊設(shè)備之間是各有一個(gè)RS485轉(zhuǎn)換器 , 并不是它們的信號(hào)只經(jīng)過(guò)了一個(gè)RS485轉(zhuǎn)換器就成功通訊了 )
圖7
在RS422(全雙工)通信中,因信號(hào)的輸入和輸出分開(kāi),所以需要兩根雙絞線來(lái)傳送輸入和輸出信號(hào),標(biāo)為A、B、Y、Z(A為輸入信號(hào)的正極,B為輸入信 號(hào)的負(fù)極,Y為輸出信號(hào)的正極,Z為輸出信號(hào)的負(fù)極)。發(fā)送信號(hào)時(shí),由TXD輸出的TTL電平信號(hào)經(jīng)RS422轉(zhuǎn)換器后,從發(fā)送器(Y和Z)輸出RS485/RS422 信號(hào);接收信號(hào)時(shí),RS485/RS422信號(hào)經(jīng)接收器(A和B)接收后,RS422轉(zhuǎn)換器將信號(hào)轉(zhuǎn)換為T(mén)TL電平信號(hào),傳給串口的RXD。
圖8:DM系列RS485/RS422接口轉(zhuǎn)換器原理圖(半雙工)
圖9:DM系列RS485/RS422接口轉(zhuǎn)換器原理圖(全雙工)
以上圖片只是貼出了一半的接線圖,這里給出一張多機(jī)通訊的RS485接線原理圖(半雙工)
圖10
典型接法
DM485的輸出端最多可以連接256個(gè)RS485接口,其典型接法如圖3(半雙工)和圖4(全雙工)所示。在最遠(yuǎn)的兩個(gè)終端上,輸入和輸出端之間各需接 上一個(gè)120歐姆的電阻。在RS485/RS422的接口連接時(shí),甲接口的輸出端接乙接口的輸入端,雙絞線的正極接正極,負(fù)極接負(fù)極;甲接口的輸入端接乙 接口的輸出端,雙絞線的正極接正極,負(fù)極接負(fù)極。
圖11
圖12
注意事項(xiàng)
1、在長(zhǎng)距離傳輸中,一定要使用用雙絞線
2、多終端傳輸時(shí),距離最遠(yuǎn)的兩個(gè)終端上,輸入和輸出端之間一定連接120歐姆的電阻。
補(bǔ)充:我不知道為什么那么多的資料都沒(méi)有說(shuō)明RS485通信發(fā)送和接收數(shù)據(jù)時(shí)的細(xì)節(jié),都只說(shuō)2根線就能發(fā)送和接收數(shù)據(jù)?注意:485芯片有個(gè)控制端,控制端高電平時(shí)候?yàn)榻邮諗?shù)據(jù),低電平時(shí)候?yàn)榘l(fā)送數(shù)據(jù)。而我們?cè)趯?shí)際項(xiàng)目開(kāi)發(fā)的時(shí)候,在使用RS485通信時(shí),如果自己的電路并沒(méi)有設(shè)計(jì)成RS485硬件自收發(fā)切換的電路,則需要自己控制485的收發(fā)使能引腳。即發(fā)送數(shù)據(jù)時(shí),需要拉低485芯片控制端的IO口;相反接收數(shù)據(jù)時(shí),需要拉高控制端的IO口。
需要自己控制收發(fā)的485芯片原理圖:
圖13
控制策略:UART_CON為低電平,485處于接收狀態(tài);UART_CON為高電平,485處于發(fā)送狀態(tài)。通過(guò)切換UART_CON的電平來(lái)達(dá)到485收發(fā)狀態(tài)的切換。
485芯片硬件自動(dòng)收發(fā)切換電路:
圖14
接收:默認(rèn)沒(méi)有數(shù)據(jù)時(shí),在接收數(shù)據(jù)的過(guò)程中,TXD引腳是一直保持高電平的,三極管導(dǎo)通,RE低電平使能,485芯片處于接收狀態(tài),然后485芯片的RO引腳(也就是接RXD的引腳)就會(huì)反應(yīng)AB傳輸過(guò)來(lái)的數(shù)據(jù)。
發(fā)送:發(fā)送數(shù)據(jù)時(shí),TX會(huì)先有一個(gè)下拉的電平(起始位-由高向低),表示開(kāi)始發(fā)送數(shù)據(jù),此時(shí)三極管截止,DE為高電平發(fā)送使能。當(dāng)發(fā)送數(shù)據(jù)“0”時(shí),由于DI接口相當(dāng)于接地,此時(shí)數(shù)據(jù)“0”就會(huì)傳輸?shù)紸B扣,A-B<0,則傳輸“0”,完成低電平傳輸,當(dāng)發(fā)送“1”時(shí),此時(shí)三極管導(dǎo)通,RE變?yōu)榈碗娖?,按理說(shuō)會(huì)讓接收使能,但是由于還處于發(fā)送數(shù)據(jù)中,這種狀態(tài)下MAX485處于高阻態(tài),此時(shí)的狀態(tài)通過(guò)A上拉電阻(R5),B下拉電阻(R4)決定,此時(shí)A-B>0傳輸“1”,完成高電平的傳輸。
注意:這里面有個(gè)疑惑,發(fā)送數(shù)據(jù)“1”,三極管RE低電平有效,應(yīng)該是接收使能,為什么芯片是高阻態(tài)呢?這是因?yàn)閁ART發(fā)送數(shù)據(jù)是有一定格式的,TX和RX數(shù)據(jù)均以“位”為最小單位進(jìn)行傳輸,在發(fā)送數(shù)據(jù)之前,UART之間要約定好數(shù)據(jù)傳輸速率,即波特率,數(shù)據(jù)傳輸格式(數(shù)據(jù)位,校驗(yàn),停止),平時(shí)數(shù)據(jù)線處于空閑狀態(tài)(1狀態(tài)),當(dāng)發(fā)送數(shù)據(jù)時(shí),TX由“1”變?yōu)椤?”維持1位的時(shí)間,這樣接收方檢測(cè)到開(kāi)始位后,再等待1.5位時(shí)間就開(kāi)始一位一位的進(jìn)行數(shù)據(jù)傳輸了,也就是說(shuō),已經(jīng)確定好發(fā)送狀態(tài),電路發(fā)送“1”時(shí)RE雖然有效,但是由于它處于發(fā)送階段,芯片也不會(huì)收,即芯片處于高阻狀態(tài)。
**5 **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歐姆的匹配電阻等等。
**6 **RS-485常用電路
網(wǎng)上找的一個(gè)常用的RS-485電路,其中需要注意兩點(diǎn):
圖15
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)致通信異常。
評(píng)論