3.18. UART 基礎

UART(Universal Asynchronous Receiver-Transmitter,通用非同步收發傳輸器)是在兩個微控制器之間,或微控制器與主機 PC 之間搬移位元組最古老也最簡單的方式。資料由兩條線路承載——每個方向各一條——再加上一條共用的接地線回送訊號。雙方都不執行共用的時脈;它們事先約定好一個 鮑率,並從資料線本身還原出位元的時序。

3.18.1. 框架(frame)

線路上的每個字元都被包裹在一個框架中:一個起始位元、若干資料位元、一個可選的同位位元,以及一個或兩個停止位元。

A UART frame waveform. The signal sits idle high on the left, falls low for one bit time (the start bit), then carries eight data bits in sequence, then returns high for one bit time (the stop bit) before returning to idle.

一個 UART 框架:一個起始位元、八個資料位元與一個停止位元,每個各佔一個位元週期(1 / baudrate 秒)的寬度。

線路閒置時維持高電位。接收端監看下降邊緣,這標示著一個新框架的開始。接著它在每個位元週期取樣一次資料線——通常是在每個位元的中間——並將這些位元重新組合成一個字元。停止位元使線路回到閒置狀態,以便偵測下一個起始位元。

3.18.2. 鮑率

位元週期——以及連結的速度——是由 鮑率 決定的,也就是每秒的位元數。9600192003840057600115200230400460800921600 是標準值;115200 是最常見的預設值。兩端對鮑率的認定必須一致到只差幾個百分比以內,否則接收端會在錯誤的點取樣位元,導致回傳的資料變得亂碼。

較高的鮑率每秒能搬移更多資料,但對纜線長度、電容,以及兩端時脈的精準度也更敏感。對於同一張工作桌上兩塊板子之間的短距離連結,115200921600 都能輕鬆運作。

3.18.3. 接線

一個 UART 連結使用三條線:

Two boards labelled A and B, connected by three wires. Board A's TX pin connects to board B's RX pin; board B's TX pin connects to board A's RX pin; and both boards' ground pins are tied together.

UART 接線:一塊板子上的 TX 接到另一塊板子的 RX,且兩端接地綁在一起。

  • TX → RX,雙向皆然。 每塊板子的傳送接腳就是另一塊板子的接收接腳。新手常犯的錯誤是把 TX → TX 接在一起——兩個輸出互相對抗,兩端的接收器都收不到任何資料。

  • 共用接地。 訊號電位是以接地為參考基準的,因此兩塊板子必須有共同的接地,否則接收端在線路上看到的會是錯誤的電壓。

3.18.4. 電壓電位與實體層

相機 UART 接腳上的訊號電位是 3.3 V CMOS:邏輯零為接地,邏輯一為 3.3 V。任何使用 3.3 V CMOS UART 的裝置——另一個微控制器、設定為 3.3 V 的 USB 轉序列轉接器、一個 3.3 V GPS 模組——都可以直接接線。

備註

5 V CMOS UART 裝置(較舊的微控制器、某些 GPS 模組、一些較舊的感測器轉接板)使用相同的 UART 框架,但採用 5 V 邏輯電位。將它們直接接到相機上是不安全的:5 V 的 TX 驅動相機的 RX,會超過不耐受 5 V 的相機其絕對最大輸入電壓,而且相機的 3.3 V TX 可能無法達到 5 V 裝置乾淨的邏輯一所需的高電位門檻。

在這兩種電壓之間轉換需要一個 主動式線路驅動器——一顆專用的雙向電位轉換 IC,在每條線路的兩側都有自己的驅動電晶體。電壓位準轉換 中那種被動式的 MOSFET 加上拉電阻的轉換器在這裡是不夠用的:它們的上升邊緣仰賴透過電阻為線路充電,這在開關速度下沒問題,但對 UART 而言遠遠太慢。在 115200 鮑率下每個位元約持續 8 µs,而被動式轉換器的 RC 變化率會把一個位元拖糊到下一個位元上。

主動式線路驅動器能在全速 UART 速率下於兩個方向產生乾淨的邊緣。選擇一個額定支援該連結將運行的鮑率的零件,把相機的 TX 與 RX 接到轉換器的 3.3 V 側,再把 5 V 裝置的 TX 與 RX 接到轉換器的 5 V 側。

有三種較舊的實體層使用相同的框架但採用不同的電壓,因此在它們與 3.3 V 微控制器之間需要一個電位轉換器:

  • RS-232。 用於桌上型 PC 的序列埠以及某些工業設備上。線路在大約 ±5 V±15 V 之間擺盪,閒置時位於負軌。相較於 CMOS,其極性反相且電壓較高;MAX232 / MAX3232 系列(或類似)的晶片可處理這種轉換。

  • RS-422。 一種用於點對點連結(一個驅動器,最多十個接收器)的差動訊號標準。驅動器在一對平衡的線路上傳送;接收器看的是兩者之間的 差值,並忽略沿途的共模雜訊。全雙工連結使用兩對線——每個方向各一對。RS-422 視鮑率而定可達到數十公尺到一公里,並由一顆 RS-422 收發器晶片位於相機的 TX / RX 與該平衡線對之間。

  • RS-485。 RS-422 的多點分接親戚——採用相同的差動訊號,但設計上可在一條匯流排上放置最多 32 個驅動器與接收器。大多數連結是在單一線對上以半雙工運作,每個節點的驅動器與接收器共用相同的線路,並由軟體仲裁誰來發話。用於纜線拉得很遠且雜訊嚴重的工業自動化匯流排(Modbus、DMX512、Profibus);一顆 RS-485 收發器晶片位於相機的 TX / RX 與該差動線對之間。

兩者在底層位元層級上仍然傳送 UART 框架。無論訊號在收發器另一側是由哪種實體層承載,相機的 machine.UART 設定(鮑率、位元數、同位、停止位元)都是相同的。