UART应用笔记
目錄
- 簡介
- 數據傳輸
- 起始位
- 數據幀
- 奇偶校驗
- 停止位
- UART傳輸步驟
- 幀協議
- CRC校驗原理
- 介紹
- 原理
- 應用
- 參考文獻
簡介
根據定義,UART是一種硬件通信協議,以可配置的速度使用異步串行通信。異步意味著沒有時鐘信號來同步從發送設備進入接收端的輸出位。
每個UART設備的兩個信號分別命名為:
發送器(Tx)
接收器(Rx)
每個設備的發送器和接收器線的主要作用是用于串行通信的串行數據的發送和接收。
發送UART連接到以并行形式發送數據的控制數據總線。然后,數據將在傳輸線路(導線)上一位一位地串行傳輸到接收UART。反過來,對于接收設備,串行數據會被轉換為并行數據。
UART線用作發送和接收數據的通信介質。請注意,UART設備具有專門用于發送或接收的發送和接收引腳。
對于UART和大多數串行通信,發送和接收設備需要將波特率設置為相同的值。波特率是指信息傳輸到信道的速率。對于串行端口,設定的波特率將用作每秒傳輸的最大位數。
| 速度 | 9600,19200,38400,57600,115200,230400,460800,921600,1000000,1500000 |
| 傳輸方式 | 異步 |
| 最大主機數 | 1 |
| 最大從機數 | 1 |
UART接口不使用時鐘信號來同步發送器和接收器設備,而是以異步方式傳輸數據。發送器根據其時鐘信號生成的位流取代了時鐘信號,接收器使用其內部時鐘信號對輸入數據進行采樣。同步點是通過兩個設備的相同波特率來管理的。如果波特率不同,發送和接收數據的時序可能會受影響,導致數據處理過程出現不一致。允許的波特率差異最大值為10%,超過此值,位的時序就會脫節。
數據傳輸
在UART中,傳輸模式為數據包形式。連接發送器和接收器的機制包括串行數據包的創建和物理硬件線路的控制。數據包由起始位、數據幀、奇偶校驗位和停止位組成。
起始位
當不傳輸數據時,UART數據傳輸線通常保持高電壓電平。若要開始數據傳輸,發送UART會將傳輸線從高電平拉到低電平并保持1個時鐘周期。當接收UART檢測到高到低電壓躍遷時,便開始以波特率對應的頻率讀取數據幀中的位。
數據幀
數據幀包含所傳輸的實際數據。如果使用奇偶校驗位,數據幀長度可以是5位到8位。如果不使用奇偶校驗位,數據幀長度可以是9位。在大多數情況下,數據以最低有效位優先方式發送。
奇偶校驗
奇偶性描述數字是偶數還是奇數。通過奇偶校驗位,接收UART判斷傳輸期間是否有數據發生改變。電磁輻射、不一致的波特率或長距離數據傳輸都可能改變數據位。
接收UART讀取數據幀后,將計數值為1的位,檢查總數是偶數還是奇數。如果奇偶校驗位為0(偶數奇偶校驗),則數據幀中的1或邏輯高位總計應為偶數。如果奇偶校驗位為1(奇數奇偶校驗),則數據幀中的1或邏輯高位總計應為奇數。
當奇偶校驗位與數據匹配時,UART認為傳輸未出錯。但是,如果奇偶校驗位為0,而總和為奇數,或者奇偶校驗位為1,而總和為偶數,則UART認為數據幀中的位已改變。
停止位
為了表示數據包結束,發送UART將數據傳輸線從低電壓驅動到高電壓并保持1到2位時間。
UART傳輸步驟
第一步:發送UART從數據總線并行接收數據。
第二步:發送UART將起始位、奇偶校驗位和停止位添加到數據幀。
第三步:從起始位到結束位,整個數據包以串行方式從發送UART送至接收UART。接收UART以預配置的波特率對數據線進行采樣。
第四步:接收UART丟棄數據幀中的起始位、奇偶校驗位和停止位。
第五步:接收UART將串行數據轉換回并行數據,并將其傳輸到接收端的數據總線。
幀協議
UART的一個關鍵特性是幀協議的實現,但還沒有被充分使用。其主要用途和重要性是為每臺設備提供安全和保護方面的增值。
例如,當兩個設備使用相同的UART幀協議時,有可能在沒有檢查配置的情況下連接到同一個UART,設備會連接到不同的引腳,這可能導致系統故障。
另一方面,實現幀協議可確保安全性,因為需要根據設計幀協議解析接收到的信息。每個幀協議都經過專門設計,以確保唯一性和安全性。
在設計幀協議時,設計人員可以給不同設備設置期望的報頭和報尾(包括CRC)。在下圖中,2個字節被設置為報頭的一部分。
根據示例,您可以給您的設備設置獨有的報頭、報尾和CRC。
報頭1(H1為0xAB)和報頭2(H2為0xCD)
報頭是確定您是否在與正確的設備通信的唯一標識符。
命令(CMD)選擇
命令將取決于用于創建兩個設備之間通信的命令列表。
每個命令的數據長度(DL)
數據長度將取決于所選的命令。您可以根據所選的命令來使數據長度最大化,因此它會隨選擇而變化。在這種情況下,數據長度可以調整。
數據n(可變數據)
數據是要從設備傳輸的有效載荷。
報尾1(T1為0xE1)和報尾2(T2為0xE2)
報尾是在傳輸結束后添加的數據。就像報頭一樣,報尾也可以唯一標識符。
循環冗余校驗(CRC公式)
循環冗余校驗公式是一種附加的錯誤檢測模式,用于檢測原始數據是否發生意外更改。發送設備的CRC值必須始終等于接收器端的CRC計算值。
建議為每個UART設備實現幀協議來增加安全性。幀協議要求發送和接收設備使用相同的配置。
CRC校驗原理
介紹
CRC即循環冗余校驗碼(Cyclic Redundancy Check[1] ):是數據通信領域中最常用的一種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環冗余檢查(CRC)是一種數據傳輸檢錯功能,對數據進行多項式計算,并將得到的結果附在幀的后面,接收設備也執行類似的算法,以保證數據傳輸的正確性和完整性。
原理
其根本思想就是先在要發送的幀后面附加一個數(這個就是用來校驗的校驗碼,但要注意,這里的數也是二進制序列的,下同),生成一個新幀發送給接收端。當然,這個附加的數不是隨意的,它要使所生成的新幀能與發送端和接收端共同選定的某個特定數整除(注意,這里不是直接采用二進制除法,而是采用一種稱之為“模2除法”)。到達接收端后,再把接收到的新幀除以(同樣采用“模2除法”)這個選定的除數。因為在發送端發送數據幀之前就已通過附加一個數,做了“去余”處理(也就已經能整除了),所以結果應該是沒有余數。如果有余數,則表明該幀在傳輸過程中出現了差錯。
“模2除法”與“算術除法”類似,但它既不向上位借位,也不比較除數和被除數的相同位數值的大小,只要以相同位數進行相除即可。
模2加法運算為:1+1=0,0+1=1,0+0=0,無進位,也無借位;
模2減法運算為:1-1=0,0-1=1,1-0=1,0-0=0,也無進位,無借位。
相當于二進制中的邏輯異或運算。也就是比較后,兩者對應位相同則結果為“0”,不同則結果為“1”。
如100101除以1110,結果得到商為11,余數為1
具體實現步驟:
(1)先選擇(可以隨機選擇,也可按標準選擇,具體在后面介紹)一個用于在接收端進行校驗時,對接收的幀進行除法運算的除數(是二進制比較特串,通常是以多項方式表示,所以CRC又稱多項式編碼方法,這個多項式也稱之為“生成多項式”)。
(2)看所選定的除數二進制位數(假設為k位),然后在要發送的數據幀(假設為m位)后面加上k-1位“0”,然后以這個加了k-1個“0“的新幀(一共是m+k-1位)以“模2除法”方式除以上面這個除數,所得到的余數(也是二進制的比特串)就是該幀的CRC校驗碼,也稱之為FCS(幀校驗序列)。但要注意的是,余數R的位數一定要是比除數位數只能少一位,哪怕前面位是0,甚至是全為0(附帶好整除時)也都不能省略。
(3)再把這個校驗碼附加在原數據幀(就是m位的幀,注意不是在后面形成的m+k-1位的幀)后面,構建一個新幀發送到接收端;最后在接收端再把這個新幀以“模2除法”方式除以前面選擇的除數,如果沒有余數R,則表明該幀在傳輸過程中沒出錯,否則出現了差錯。
從上面可以看出,CRC校驗中有兩個關鍵點:
一是要預先確定一個發送端和接收端都用來作為除數的二進制比特串(或多項式);
二是把原始幀與上面選定的除進行二進
制除法運算,計算出FCS。
前者可以隨機選擇,也可按國際上通行的標準選擇,但最高位和最低位必須均為“1”,如在IBM的SDLC(同步數據鏈路控制)規程中使用的CRC-16(也就是這個除數一共是17位)生成多項式g(x)= x16 + x15 + x2 +1(對應二進制比特串為:11000000000000101);而在ISO HDLC(高級數據鏈路控制)規程、ITU的SDLC、X.25、V.34、V.41、V.42等中使用CCITT-16生成多項式g(x)= x16 + x15 + x5 +1(對應二進制比特串為:11000000000100001)。
總之,在接收端對收到的每一幀經過CRC檢驗后,有以下兩種情況:
1.若得出的余數R=0,則判定這個幀沒差錯,就接受。
2.若余數R!=0,則判定這個幀有差錯(但無法確定究竟是哪一位或哪幾位 ),則丟棄。
應用
下面以一個例子來具體說明整個過程。現假設選擇的CRC生成多項式為G(X) = X4 + X3 + 1,要求出二進制序列10110011的CRC校驗碼。下面是具體的計算過程:
(1)首先把生成多項式轉換成二進制數,由G(X) = X4 + X3 + 1可以知道(它一共是5位(總位數等于最高位的冪次加1,即4+1=5),然后根據多項式各項的含義(多項式只列出二進制值為1的位,也就是這個二進制的第4位、第3位、第0位的二進制均為1,其它位均為0)很快就可得到它的二進制比特串為11001。
(2)因為生成多項式的位數為5,根據前面的介紹,得知CRC校驗碼的位數為4(校驗碼的位數比生成多項式的位數少1)。因為原數據幀10110011,在它后面再加4個0,得到101100110000,然后把這個數以“模2除法”方式除以生成多項式,得到的余數(即CRC碼)為0100,如圖5-10所示。注意參考前面介紹的“模2除法”運算法則。
(3)把上步計算得到的CRC校驗0100替換原始幀101100110000后面的四個“0”,得到新幀101100110100。再把這個新幀發送到接收端。
(4)當以上新幀到達接收端后,接收端會把這個新幀再用上面選定的除數11001以“模2除法”方式去除,驗證余數是否為0,如果為0,則證明該幀數據在傳輸過程中沒有出現差錯,否則出現了差錯。
參考文獻
總結