作者:Bird
上篇文章【Maker電子學】認識UART界面#2—通訊標準,我們聊了 UART 轉換到實體通訊界面 RS-232、RS-422 及 RS-485,這次我們來深入探究 RS-485 這個簡單易用且功能強大的通訊標準吧!
半雙工的 RS-485 網路 #
上次說過,RS-485 和 RS-422 在實體層都是使用差動訊號來傳遞訊息,不過兩者的訊號規格略有不同。
RS-422 的傳送器電壓定義是:
邏輯 1:VA-VB= +2 V ~ +6 V
邏輯 0:VA-VB= -2 V ~ -6 V
而 RS-485 的傳送器電壓定義則是:
邏輯 1:VA-VB = +1.5 V ~ +6 V
邏輯 0:VA-VB = -1.5 V ~ -6 V
兩者在最低電壓的要求差了 0.5 V,但在接收端,不管是 RS-422 還是 RS-485,都只需要 200 mV 的電壓,就能夠判定邏輯 0 或 1:
邏輯 1:VA-VB > 200 mV
邏輯 0:VA-VB < -200 mV
發射器和接收器之間電壓的差距,就是通訊標準所容許的實體層電氣損耗。典型的 RS-422 或 RS-485 只要搭配適當的纜線,可以將訊號傳輸至 400 英呎(130 公尺)之遠,靠的就是差動訊號耐干擾的特性以及其所容許的線上電氣損耗。
RS-485 是半雙工的通訊界面,它的傳送和接收共用同一對線路,典型的線路結構長這樣:

(圖片來源:Bird 提供)
在這個圖中,總共有四個 RS-485 的裝置接在同一個網路上,並共用同一對傳輸線路。電路上看來,所有裝置的 A 點都是接在一起的,B 點亦同,因此我們可以說,在 RS-485 網路上所有的裝置都是並聯在一起的。
上圖也可看出,線路的兩端各有一個電阻 RT 將 A 和 B 連接起來,這個電阻叫做「終端電阻」(terminator),它的用意是在纜線的尾端將訊號消耗掉,避免訊號反射回來,同時也作為傳送電路的負載,典型的 RS-485 終端電阻是 120 Ω。
這種網路有個特別的名字叫做「multi-drop network」,其實就是「有很多裝置的網路」。在這種網路上,一次只能有一個裝置進入傳送模式,其它裝置則在接收模式,這是因爲接收器的阻抗通常很高,不太會消耗訊號,因此一個傳送器可以同時驅動很多個接收器,讓大家收到一樣的東西。以 RS-485 的標準而言,它允許網路上最多可以有 32 個裝置。
如果同時有兩個裝置進入傳送模式,它們傳送的訊號就有可能會打架!比方說一個裝置傳送 0,另一個裝置傳送 1,那線路上的狀態到底是 0 還是 1 呢?這根本就是一個不正常的狀態,會讓其它正在接收的裝置無所適從,因此在這種多裝置的網路上,必需要有一些規則,像是「先舉手再發言」、「沒人說話時再發言」或是「按照固定的順序輪流發言」等,以維持網路上的秩序。
當我們要用 UART 界面來控制 RS-485 時,會遭遇一個問題。先前說過,UART 是個「idle high」的界面,也就是說當我們沒在使用它時,它會維持在 high 的狀態,或是邏輯 1 。還記得嗎?但如果我們直接將 UART 的 TX(也就是傳送訊號),接在 RS-485 的傳送器上,當我們沒有在傳送資料時,UART 的 TX 始終會在邏輯 1 的狀態,那麼傳送器就會一直傳送 RS-485 的「1」出去,而如果這時候網路上有其它的裝置要傳送訊號,這個很堅持的邏輯 1 就會跟它打架,導致訊號整個垮掉。
因此在 multi-drop 的網路上,傳送器除了邏輯 0 和邏輯 1 外,還需要第三種狀態,叫做「不傳送」。它既不是 0 也不是 1,就是一個不去干預網路、隨波逐流的狀態,你也可以將它想像成「這個傳送器沒有接在網路上,彷彿不存在」。在這種「不傳送」的狀態下,對網路上的其它裝置而言,這個傳送器有一個很高的輸出阻抗,我們把這個狀態稱為「high impedance」,或是「Hi-Z」(電路學中常用大寫字母 Z 來代表阻抗)。
爲了要控制這種「不傳送」的狀態,RS-485 的傳送器除了連接 UART 的 TX外,還多了一個 enable 訊號,以用來控制傳送器的工作。當 enable 訊號讓傳送器工作時,傳送器會忠實地反應來自 UART 的邏輯訊號, 1 就是 1,0 就是 0,而當傳送器在工作狀態時,理論上網路上不應該有其它裝置同時也處於傳送狀態,否則網路上的訊號就會打架;如果 enable 訊號讓傳送器處於不工作狀態,對於網路上的其它裝置來說,這個傳送器就好似人間蒸發,不存在這個網路上,因此不管 UART 送來的是 0 或 1,都不會有訊號跑到 RS-485 的網路上。
這種有 enable/disable 能力的收發器,我們稱之爲「三態」收發器,或是 tri-state transciever,因爲它在 0 與 1 之外,還有一個 Hi-Z 的狀態。
RS-485 收發器實戰 #
接著我們來說說 SN75176A 這顆 RS-485 收發器 IC。SN75176A 是 TI 在 1984 年推出的 RS-485 收發器 IC,歷史悠久,屹立不搖。
SN75176 只有八支接腳,比我們上回介紹的 RS-232 收發器 MAX232 還簡單。根據 RS-485 的規範,傳送側的驅動電壓最小只需要 2 V,因此 5 V 供電的 SN75176A 可以直接產生足夠的驅動電壓,不需要額外的 charge pump 輔助,若扣掉兩支電源接腳,SN75176A 的接腳功能如下:

(圖片來源:Bird 提供)
A 和 B 腳是連接到 RS-485 網路的接腳,其中 A 是正端、B 是負端(這在 RS-485 訊號的標準命名中有明確規範);D 是傳送用的資料接腳,通常連接到 UART 的 TX;R 是接收器出來的資料接腳,通常連接到 UART 的 RX。

(圖片來源:Bird 提供)
DE 是 driver enable 的意思,也就是前面提到的「讓傳送電路工作的接腳。它是正邏輯,因此 high 的時候就是工作,low 的時候就是不工作;RE 是 receiver enable 的意思,它的原理和 DE 一樣,不過因爲這個訊號上面有一條線,代表它是負邏輯,也就是說當 RE 是 high 時,接收器是不工作的,當 RE 是 low 時,接收器才工作(接收器不工作時,它的輸出腳 R 就會變成 Hi-Z 的狀態)。
我們來看看實際要將 SN75176A 連接上 MCU 的 UART 時,電路該怎麼設計。這邊以 Aruino UNO 的 MCU: ATmega328p 爲例來說明。

(圖片來源:Bird 提供)
將 SN75176A 連接到 UART 的電路其實非常簡單,TXD 接到 D、RXD 接到 R,大概就完成 80%了,但問題是我們該如何用 GPIO 接腳來控制 DE 和 RE 呢?圖中的接法是一種很典型的做法:將 DE、RE 接在一起,並用同一支 GPIO 接腳控制。
由於 DE、RE 一個是正邏輯、一個是負邏輯,當我們將它們接在一起時,就像個翹翹板一樣,driver 工作時,receiver 就不工作;receiver 工作時,driver 就不工作。以這個例子來說,它的工作狀態就是:

(圖片來源:Bird 提供)
這是一種很簡單的做法,因爲傳送的時候不接收,可以避免接收器收到自己送出去的資料,但這個特性有時候是個缺點,因爲有時候我們就是想要接收自己送出去的東西。
在什麼狀況下我們會需要接收自己送出去的資料呢?當我們需要「偵測碰撞」的時候。所謂「碰撞」就是網路上有兩個裝置同時傳送,導致線上的資料因爲狀態競爭而產生錯誤,就像前面說過的,如果一個裝置送 1、另一個裝置送 0,大家到底會收到 0 還是 1 就沒人說得準了。
因此,當我們需要硬體支援碰撞偵測時,可以這樣接:

(圖片來源:Bird 提供)
讓 DE 和 RE 分別由兩支 GPIO 個別控制,會產生四種狀態:

(圖片來源:Bird 提供)
當我們需要碰撞偵測功能時,可以將 PD3 設爲 high、PD4 設爲 low,要寫資料到 UART 的 TX 時,資料就會經過傳送器、接收器繞一圈回來,出現在 RX 上。我們可以比對 TX 和 RX 上的資料,如果兩者相同,就代表訊號成功發送出去了;如果 RX 收到的資料和 TX 送出去的不同,就代表線上可能同時有其它裝置在傳送,導致線上的狀態錯誤。
這個電路中有一個神祕的 10 KΩ 電阻 R1,將 R 腳拉到 5 V 電源,它是用來幹嘛的呢?前面提過,當 RE 爲 high 的時候,receiver 不工作,R 腳的狀態就是高阻抗,這對 UART 的 RX 而言,就是沒有接任何東西。
數位的輸入接腳空接是電路設計的大忌,因爲你不知道它會收到 0 還是收到 1,而且因爲 CMOS 電路高輸入阻抗的特性,只要一點點的風吹草動,就足以讓它在 0 與 1 之間搖擺,而讓 UART 收到一大堆莫名其妙、亂七八糟的東西,因此我們用一個相對來說較弱的 pull-up 電阻,在 R 腳進入 Hi-Z 狀態時,將它拉到 high,這就確保了當 receiver 不工作時,UART 的 RX 會被維持在 high,也就是 idle 的狀態,而當 receiver 在工作時,R 腳的輸出能力應該要足以輕易對抗這個 10 KΩ 的電阻,訊號就不會受到影響。
另外我們在 SN75176A 的電源接腳上用了稍大的旁路電容(C4 10 uF),這是因爲 RS-485 相對來說是一個電壓較低、電流較大的傳輸界面,而 driver 在驅動較長線路時會需要較大的電流,所以若加上稍大的電源旁路電容,可以改善電源的阻抗,同時也能降低它吃電時對其它電路的影響。
小結 #
除了 SN75176A 外,TI 也有新一代的 RS-485 傳送接收 IC—SN65HVD485E,它的輸入阻抗更高,最多可容許 64 個裝置在同一條線上,且有更好的 ESD 耐受性。
其實各家 IC 大廠也都有推出 RS-485 的傳送接收 IC,而且接腳都與 SN75176 相容(這個接腳的安排已經形成一種工業標準),像是 Maxim 的 MAX485、Linear Technology 的 LTC485、Renesas 的 ISL8485 等都是與 SN75176A 接腳相容的 RS-485 transceiver,在設計上也都是很好的選擇。
讀者們如果有什麼問題,或是對哪個主題有興趣想更深入探討,也歡迎留言,我會作爲之後寫作及安排題目的參考。
(責任編輯:賴佩萱)