瞭解UART硬體通訊協定

作者 : Eric Peña、Mary Grace Legaspi,作者依序為ADI資深韌體工程師、韌體工程師

UART即通用非同步接收器/發送器,是最常用的裝置間通訊協定之一。本文將根據UART用於硬體通訊協定應遵循的標準步驟進行說明。

經由正確配置,UART可以配合許多不同類型的涉及發送和接收串列資料的串列協定工作。在串列通訊中,資料透過單條線路或導線逐位元傳輸。在雙向通訊中,使用兩根導線來進行連續的串列資料傳輸。根據應用和系統要求,串列通訊需要的電路和導線較少,可降低實現成本。

本文將討論使用UART的基本原則,重點是資料封包傳輸、標準幀協定(standard frame protocol)和客製幀協定(customized frame protocol);客製幀協議將是安全合規性方面的增值特性,尤其是在程式碼開發期間。在產品開發過程中,本文主要在分享一些基本步驟,以檢查資料表的實際使用。

最後,本文的目標是協助能更能理解和遵循UART標準,以便最大程度地發揮其能力和應用優勢,特別是在開發新產品時。

「溝通最大的問題在於,人們理所當然地認為已經溝通了。」

                                                                                              ——George Bernard Shaw

通訊協定在組織裝置之間的通訊時扮演著重要角色。它基於系統要求而以不同方式進行設計。此類協定具有特定的規則,為實現成功通訊,不同裝置都遵循該規則。嵌入式系統、微控制器和電腦大多將UART作為裝置間硬體通訊協定的一種形式。在可用通訊協定中,UART的發送和接收端僅使用兩條線。儘管它是一種廣泛使用的硬體通訊方法,但它並非在所有時候都是完全最佳化的。在微控制器內部使用UART模組時,通常會忽略幀協議的適當實現。根據定義,UART是一種硬體通訊協定,以可配置的速度使用非同步串列通訊;非同步表示沒有時脈訊號來同步從發送裝置進入接收端的輸出位元。

介面

每個UART裝置的兩個訊號分別命名為:

  • 發送器(Tx)
  • 接收器(Rx)

 

圖1:兩個UART彼此直接通訊。

 

 

每個裝置的發送器和接收器線的主要作用是用於串列通訊的串列資料的發送和接收。

 

圖2:具有資料匯流排的UART。

 

發送UART連接到以並列形式發送資料的控制資料匯流排。然後,資料將在傳輸線路上(導線)1位元1位元地序列傳輸到接收UART。反過來,對於接收裝置,串列資料會被轉換為並列資料。UART線用於發送和接收資料的通訊介質。請注意,UART裝置具有專門用於發送或接收的發送和接收接腳,對於UART和大多數串列通訊,發送和接收裝置需要將串列傳輸速率設定為相同的值。串列傳輸速率是指資訊傳輸到通道的速率,對於序列埠,設定的串列傳輸速率將用於每秒傳輸的最大位數。

表1總結了關於UART必須瞭解的幾點。

 

表1:UART概要。

 

UART介面不使用時脈訊號來同步發送器和接收器裝置,而是以非同步方式傳輸資料。發送器根據其時脈訊號產生的位元流取代了時脈訊號,接收器使用其內部時脈訊號對輸入資料進行採樣。同步點是透過兩個裝置的相同串列傳輸速率來管理,如果串列傳輸速率不同,發送和接收資料的時序可能會受影響,導致資料處理過程出現不一致。允許的串列傳輸速率差異最大值為10%,超過此值,位元的時序就會脫節。

資料傳輸

在UART中,傳輸模式為資料封包形式。連接發送器和接收器的機制包含串列資料封包的創建和物理硬體線路的控制,資料封包由起始位元、資料幀、同位檢查位元和停止位元組成。

 

圖3:UART資料封包。

 

起始位元

當不傳輸資料時,UART資料傳輸線通常保持高電壓位準。若要開始資料傳輸,發送UART會將傳輸線從高位準拉到低位準並保持1個時脈週期。當接收UART檢測到高到低電壓躍遷時,便開始以串列傳輸速率對應的頻率讀取資料幀中的位元。

 

圖4:起始位元。

 

數據幀

資料幀包含所傳輸的實際資料。如果使用同位檢查位元,資料幀長度可以是5位元到8位元。如果不使用同位檢查位元,資料幀長度可以是9位元。在大多數情況下,資料以最低有效位元優先方式發送。

 

圖5:數據幀。

 

同位

奇偶性描述數位是偶數還是奇數。透過同位檢查位元,接收UART判斷傳輸期間是否有資料發生改變。電磁輻射、不一致的串列傳輸速率或長距離資料傳輸都可能改變資料位元,接收UART讀取資料幀後,將計數值為1的位元,檢查總數是偶數還是奇數。如果同位檢查位元為0 (偶數同位),則資料幀中的1或邏輯高位總計應為偶數。如果同位檢查位元為1 (奇數同位),則資料幀中的1或邏輯高位總計應為奇數。當同位檢查位元與資料匹配時,UART認為傳輸未出錯,但是,如果同位檢查位元為0,而總和為奇數,或者同位檢查位元為1,而總和為偶數,則UART認為資料幀中的位元已改變。

 

圖6:同位檢查位元。

 

停止位元

為了表示資料封包結束,發送UART將資料傳輸線從低電壓驅動到高電壓並保持1~2位元時間。

 

圖7:停止位元。

 

UART傳輸步驟

第一步:發送UART從資料匯流排並列接收資料。

 

圖8:資料匯流排至發送UART。

 

第二步:發送UART將起始位元、同位檢查位元和停止位元增加到資料幀。

 

圖9:Tx側的UART數據幀。

 

第三步:從起始位元到結束位元,整個資料封包以串列方式從發送UART送至接收UART。接收UART以預配置的串列傳輸速率對資料線進行採樣。

 

圖10:UART傳輸。

 

第四步:接收UART丟棄資料幀中的起始位元、同位檢查位元和停止位元。

 

圖11:Rx側的UART數據幀。

 

第五步:接收UART將串列資料轉換回並列資料,並將其傳輸到接收端的資料匯流排。

 

圖12:接收UART至資料匯流排。

 

幀協議

UART的一個關鍵特性是幀協議的實現,但還沒有被充分使用。其主要用途和重要性是為每台裝置提供安全和保護方面的增值。例如,當兩個裝置使用相同的UART幀協議時,有可能在沒有檢查配置的情況下連接到同一個UART,裝置會連接到不同的接腳,這可能導致系統故障。

另一方面,實現幀協定可確保安全性,因為需要根據設計幀協定解析接收到的資訊。每個幀協議都經過專門設計,以確保唯一性和安全性。在設計幀協議時,設計人員可以給不同裝置設定期望的報頭和報尾(包括CRC)。在圖13中,2個位元組被設定為報頭的一部分。

 

圖13:UART幀協議示例。

 

根據示例,可以為裝置設置獨有的報頭、報尾和CRC。

報頭1 (H1為0xAB)和報頭2 (H2為0xCD)

報頭是確定您是否在與正確的裝置通訊的唯一識別碼。

指令5(CMD)選擇

指令將取決於用於創建兩個裝置之間通訊的指令清單。

每個命令的資料長度(DL)

資料長度將取決於所選的指令。可以根據所選的指令來使資料長度最大化,因此它會隨選擇而變化,在這種情況下,資料長度可以調整。

資料n (可變資料)

資料是要從裝置傳輸的有效載荷。

報尾1 (T1為0xE1)和報尾2 (T2為0xE2)

報尾是在傳輸結束後增加的資料。就像報頭一樣,報尾也可以唯一識別碼。

迴圈冗餘校驗(CRC公式)

CRC公式是一種附加的錯誤檢測模式,用於檢測原始資料是否發生意外更改。發送裝置的CRC值必須始終等於接收器端的CRC計算值。

建議為每個UART裝置實現幀協定來增加安全性,幀協定要求發送和接收裝置使用相同的配置。

UART工作原理

使用任何硬體通訊協定時,首先必須檢查資料手冊和硬體參考手冊。以下是要遵循的步驟:

第一步:檢查裝置的數據手冊介面。

 

圖14:微控制器數據手冊。

 

第二步:在記憶體映射下檢查UART位址。

 

圖15:微控制器記憶體映射。

 

第三步:檢查UART埠的具體資訊,例如工作模式、資料位元長度、同位檢查位元和停止位元。

數據手冊中的UART埠詳細資訊示例:

UART埠

示例MCU提供了一個全雙工UART埠,其與PC標準UART完全相容。UART埠提供一個簡化的UART介面用於連接其他周邊或主機,支援全雙工、DMA和非同步串列資料傳輸。UART埠支援5~8個資料位元,以及無校驗、偶校驗和奇數同位檢查。幀由一個半或兩個停止位終止。

第四步:檢查UART操作的詳細資訊,包括串列傳輸速率計算。串列傳輸速率透過以下示例公式進行配置。此公式隨微控制器而異。

UART操作的詳細資訊示例:

  • 5到8個數據位元
  • 1、2或1½個停止位元
  • 無、偶數或奇數同位
  • 可編程過取樣速率為4、8、16、32
  • 串列傳輸速率 = PCLK/((M + N/2048) × 2OSR + 2 × DIV

其中:

OSR(過取樣速率)——UART_LCR2.OSR = 0~3

DIV(串列傳輸速率分頻器) ——UART_DIV = 1至65535

M(DIVM小數串列傳輸速率M) ——UART_FBR.DIVM = 1至3

N(DIVM小數串列傳輸速率M) ——UART_FBR.DIVN = 0至2047

第五步:對於串列傳輸速率,務必檢查要使用的周邊時脈(PCLK)。此示例有26MHz PCLK和16MHz PCLK可用,請注意,OSR、DIV、DIVM和DIVN隨裝置而異。

 

表2:基於26 MHz PCLK的串列傳輸速率示例。

 

表3:基於16 MHz PCLK的串列傳輸速率示例。

 

第六步:下一部分是檢查UART配置的詳細暫存器。瞭解計算串列傳輸速率時的參數,例如UART_LCR2、UART_DIV和UART_FBR,表4列出所涉及的具體暫存器。

 

表4:UART暫存器描述。

 

第七步:檢查每個暫存器下的詳細資訊,代入值以計算串列傳輸速率,然後開始實現UART。

為何重要?

當開發穩健的、品質驅動的產品時,熟悉UART通訊協議非常有優勢。知道如何僅使用兩條線發送資料,以及如何傳輸整個資料封包或有效載荷,將有助於確保資料正確無誤地發送和接收。UART是最常用的硬體通訊協定,具備相關知識可以在將來的設計中實現設計靈活性。

使用案例

可以將UART用於許多應用,例如:

  • 偵錯:在開發過程中及早發現系統錯誤很重要。加入UART便可從系統取得消息,協助排除錯誤;
  • 製造功能級追蹤:日誌在製造業中非常重要。透過日誌可確定功能,提醒操作員生產線上正在發生的事情;
  • 客戶更新:軟體更新非常重要。完整的動態硬體和支援更新的軟體對於擁有完整系統至關重要;
  • 測試/驗證:在產品離開製造過程之前進行驗證有助於為客戶提供最優質的產品。

參考資料

1.「Basics of UART Communication」。Electronics Hub,2017年7月。

2.Campbell, Scott。「Basics of UART Communication」。電路基礎。

3.Keim, Robert。「Back to Basics: The Universal Asynchronous Receiver/ 4.Transmitter」。關於電路的一切,2016年12月。

5.「What Is UART Protocol? UART Communication Explained 」。Arrow。

 

 

 

 

 

加入LINE@,最新消息一手掌握!

發表評論