串口通訊協議簡介
串口通訊 (Serial Communication) 是一種設備間極為常用的串行通訊方式,目前多存在于工控機及部分通信設備中。
對于通訊協議,以分層的方式來理解,可以把它分為物理層和協議層。
物理層規定通訊系統中具有機械、電子功能部分的特性,確保原始數據在物理媒體的傳輸。
協議層主要規定通訊邏輯,統一收發雙方的數據打包、解包標準。簡單來說物理層規定我們用嘴巴還是用肢體來交流,協議層則規定我們用中文還是英文來交流。
串口通訊的物理層
串口通訊的物理層有很多標準及變種,串口通訊的物理層的主要標準是RS-232標準,其規定了信號的用途、通訊接口及信號的電平標準,其通訊結構如下:
在上面的通訊方式中,兩個通訊設備的“DB9接口”之間通過串口信號線建立起連接,串口信號線中使用“RS-232標準”傳輸數據信號。由于RS-232電平標準的信號不能直接被控制器直接識別,所以這些信號會經過一個“電平轉換芯片”轉換成控制器能識別的“TTL 標準”的電平信號,才能實現通訊。
1、信號的電平標準
在設備內部信號是以TTL電平標準傳輸的,設備之間是通過RS-232電平標準傳輸的,而且TTL電平需要經過電平轉換芯片才能轉化為RS-232電平,RS-232電平轉TTL電平也是如此。如圖是TTL電平標準與RS-232電平標準。
電子電路中常使用 TTL 的電平標準,理想狀態下,使用 5V 表示二進制邏輯 1, 使用 0V 表示邏輯 0;
為了增加串口通訊的遠距離傳輸及抗干擾能力,所以RS-232信號線,理想狀態下,使用-15V 表示邏輯 1, +15V 表示邏輯 0。
2、RS-232 信號線
在最初的應用中,RS-232 串口標準常用于計算機、路由與調制調解器 (MODEN,俗稱“貓”) 之間的通訊,在這種通訊系統中,設備被分為數據終端設備 DTE(計算機、路由) 和數據通訊設備DCE(調制調解器)。在舊式的臺式計算機中一般會有 RS-232 標準的 COM 口 (也稱 DB9 接口),下圖就是電腦主板上的 COM 口及串口線 。
其中接線口以針式引出信號線的稱為公頭,以孔式引出信號線的稱為母頭。在計算機中一般引出公頭接口,而在調制調解器設備中引出的一般為母頭,使用上圖中的串口線即可把它與計算機連接起來。通訊時,串口線中傳輸的信號就是使用前面講解的 RS-232 標準調制的。
DB9 接口中的公頭及母頭的各個引腳的標準信號線接法如下圖。
上表中的是計算機端的 DB9 公頭標準接法,由于兩個通訊設備之間的收發信號 (RXD 與 TXD) 應交叉相連,所以調制調解器端的 DB9 母頭的收發信號接法一般與公頭的相反。
串口線中的 RTS、CTS、DSR、DTR 及 DCD 信號,使用邏輯 1 表示信號有效,邏輯 0 表示信號無效。
例如,當計算機端控制 DTR 信號線表示為邏輯 1 時,它是為了告知遠端的調制調解器,本機已準備好接收數據,0 則表示還沒準備就緒。
在目前的其它工業控制使用的串口通訊中,一般只使用 RXD、TXD 以及 GND 三條信號線,直接傳輸數據信號,而 RTS、CTS、DSR、DTR 及 DCD 信號都被裁剪掉了。
串口通訊的協議層
1、數據包
串口通訊的數據包由發送設備通過自身的 TXD 接口傳輸到接收設備的 RXD 接口。
在串口通訊的協議層中,規定了數據包的內容,它由啟始位、主體數據、校驗位以及停止位組成,通訊雙方的數據包格式要約定一致才能正常收發數據。
2、波特率
由于異步通信中沒有時鐘信號,所以接收雙方要約定好波特率,即每秒傳輸的碼元個數,以便對信號進行解碼,常見的波特率有4800、9600、115200等。STM32中波特率的設置通過串口初始化結構體來實現。
3、起始和停止信號
數據包的首尾分別是起始位和停止位,數據包的起始信號由一個邏輯0的數據位表示,停止位信號可由0.5、1、1.5、2個邏輯1的數據位表示,雙方需約定一致。STM32中起始和停止信號的設置也是通過串口初始化結構體來實現。
4、有效數據
在數據包的起始位之后緊接著的就是要傳輸的主體數據內容,也稱為有效數據,有效數據的長度常被約定為 5、6、7 或 8 位長。
5、數據校驗
在有效數據之后,有一個可選的數據校驗位。由于數據通信相對更容易受到外部干擾導致傳輸數據出現偏差,可以在傳輸過程加上校驗位來解決這個問題。
校驗方法有奇校驗 (odd)、偶校驗 (even)、0 校驗 (space)、1 校驗 (mark) 以及無校驗 (noparity)。
奇校驗要求有效數據和校驗位中“1”之和的個數為奇數,比如一個 8 位長的有效數據為:01101001, 此時總共有 4 個“1”,為達到奇校驗效果,校驗位為“1”,最后傳輸的數據將是 8 位的有效數據加上 1 位的校驗位總共 9 位。
偶校驗與奇校驗要求剛好相反,要求幀數據和校驗位中“1”之和的個數為偶數,比如數據幀:11001010, 此時數據幀“1”的個數為 4 個,所以偶校驗位為“0”。
0 校驗是不管有效數據中的內容是什么,校驗位總為“0”。
1 校驗是不管有效數據中的內容是什么,校驗位總為“1”。
STM32 的 USART 簡介
通用同步異步收發器 (Universal Synchronous Asynchronous Receiver and Transmitter) 是一個串行通信設備,可以靈活地與外部設備進行全雙工數據交換。
UART(Universal Asynchronous Receiver and Transmitter)跟 USART不一樣的是:它是在 USART 基礎上裁剪掉了同步通信功能,只有異步通信。簡單區分同步和異步就是看通信時需不需要對外提供時鐘輸出,我們平時用的串口通信基本都是UART。
串行通信一般是以幀格式傳輸數據,即是一幀一幀的傳輸,每幀包含有起始信號、數據信息、停止信號,可能還有校驗信息。USART 就是對這些傳輸參數有具體規定,當然也不是只有唯一一 個參數值,很多參數值都可以自定義設置,只是增強它的兼容性。
USART 滿足外部設備對工業標準 NRZ 異步串行數據格式的要求,并且使用了小數波特率發生器,可以提供多種波特率,使得它的應用更加廣泛。
USART不僅支持同步單向通信和半雙工單線通信,也支持LIN(局部互連網),智能卡協議和IrDA(紅外數據組織)SIR ENDEC規范,以及調制解調器(CTS/RTS)操作。它還允許多處理器通信。USART 支持使用 DMA,可實現高速數據通信。
STM32在硬件設計時一般都會預留一個 USART 通信接口連接電腦,用于在調試程序是可以把一些調試信息“打印”在電腦端的串口調試助手工具上,從而來用串口調試助手來驗證自己的程序是否出了問題。
USART功能概述
接口通過三個引腳與其他設備連接在一起USART框圖。任何USART雙向通信至少需要兩個腳:接收數據輸入(RX)和發送數據輸出(TX)。
RX:接收數據串行輸入。通過過采樣技術來區別數據和噪音,從而恢復數據。
TX:發送數據輸出。當發送器被禁止時,輸出引腳恢復到它的I/O端口配置。當發送器被激活,并且不發送數據時,TX引腳處于高電平。在單線和智能卡模式里,此I/O口被同時用于數據的發送和接收。
● 總線在發送或接收前應處于空閑狀態
● 一個起始位
● 一個數據字(8或9位),最低有效位在前
● 0.5,1.5,2個的停止位,由此表明數據幀的結束
● 使用分數波特率發生器 —— 12位整數和4位小數的表示方法。
● 一個狀態寄存器(USART_SR)
● 數據寄存器(USART_DR)
● 一個波特率寄存器(USART_BRR),12位的整數和4位小數
● 一個智能卡模式下的保護時間寄存器(USART_GTPR)
USART框圖
功能引腳
TX:發送數據輸出引腳。
RX:接收數據輸入引腳。
SW_RX:數據接收引腳,只用于單線和智能卡模式,屬于內部引腳,沒有具體外部引腳。
nRTS:請求以發送 (Request To Send),n 表示低電平有效。如果使能 RTS 流控制,當 USART 接收器準備好接收新數據時就會將 nRTS 變成低電平;當接收寄存器已滿時,nRTS 將被設置為高電平。該引腳只適用于硬件流控制。
nCTS:清除以發送 (Clear To Send),n 表示低電平有效。如果使能 CTS 流控制,發送器在發送下一幀數據之前會檢測 nCTS 引腳,如果為低電平,表示可以發送數據,如果為高電平則在發送完當前數據幀之后停止發送。該引腳只適用于硬件流控制。
SCLK:發送器時鐘輸出引腳。這個引腳僅適用于同步模式。
STM32F103ZET6 系統控制器有三個 USART 和兩個 UART,其中 USART1 和時鐘來源于 APB2 總線時鐘,其最大頻率為 72MHz,其他四個的時鐘來源于 APB1 總線時鐘,其最大頻率為 36MHz。UART 只是異步傳輸功能,所以沒有 SCLK、nCTS 和 nRTS 功能引腳。
與USART有關的寄存器
USART寄存器地址映像
USART寄存器描述
1、USART狀態控制器(USART_SR)
2、數據寄存器(USART_DR)
3、波特比率寄存器(USART_BRR)
4、控制寄存器 1(USART_CR1)
5、控制寄存器 2(USART_CR2)
6、控制寄存器 3(USART_CR3)
使用寄存器來配置USART
數據寄存器
USART 數據寄存器 (USART_DR) 只有低 9 位有效,并且第 9 位數據是否有效要取決于 USART 控制寄存器 1(USART_CR1) 的 M 位設置,當 M 位為 0 時表示 8 位數據字長,當 M 位為 1 表示 9 位 數據字長,我們一般使用 8 位數據字長。USART_DR 包含了已發送的數據或者接收到的數據。USART_DR 實際是包含了兩個寄存器,一 個是專門用于發送的可寫 TDR,另一個是專門用于接收的可讀 RDR。當進行發送操作時,往USART_DR 寫入數據會自動存儲在 TDR 內;當進行讀取操作時,向 USART_DR 讀取數據會自動提取 RDR 數據。
TDR 和 RDR 都是介于系統總線和移位寄存器之間。串行通信是一個位緊接著一個位傳輸的。
發送時把 TDR 內容轉移到發送移位寄存器,然后把移位寄存器數據每一位發送出去;接收時把
接收到的 每一位順序保存在接收移位寄存器內然后才轉移到 RDR。
USART 支持 DMA 傳輸,可以實現高速數據傳輸。
控制器
USART 有專門控制發送的發送器、控制接收的接收器,還有喚醒單元、中斷控制等等。使用 USART 之前需要向 USART_CR1 寄存器的 UE 位置 1 使能 USART,UE 位用來開啟供給給串口 的時鐘。發送或者接收數據字長可選 8 位或 9 位,由 USART_CR1 的 M 位控制。
發送器
當 USART_CR1 寄存器的發送使能位 TE 置 1 時,啟動數據發送,發送移位寄存器的數據會在 TX 引腳輸出,低位在前,高位在后。如果是同步模式 SCLK 也輸出時鐘信號。
一個字符幀發送需要三個部分:起始位 + 數據幀 + 停止位。起始位是一個位周期的低電平,位周期就是每一位占用的時間;數據幀就是我們要發送的 8 位或 9 位數據,數據是從最低位開始傳輸的;停止位是一定時間周期的高電平。
停止位時間長短是可以通過 USART 控制寄存器 2(USART_CR2) 的 STOP[1:0] 位控制,可選 0.5 個、1 個、1.5 個和 2 個停止位。默認使用 1 個停止位。2 個停止位適用于正常 USART 模式、單線模式和調制解調器模式。0.5 個和 1.5 個停止位用于智能卡模式。當選擇 8 位字長,使用 1 個停止位時,具體發送字符時序圖見圖字符發送時序圖 。
例如:當選擇 8 位字長,使用 1 個停止位時,具體發送字符時序圖見圖字符發送時序圖 。
當發送使能位 TE 置 1 之后,發送器開始會先發送一個空閑幀 (一個數據幀長度的高電平),接下來就可以往 USART_DR 寄存器寫入要發送的數據。在寫入最后一個數據后,需要等待 USART 狀態寄存器 (USART_SR) 的 TC 位為 1,表示數據傳輸完成,如果 USART_CR1 寄存器的 TCIE 位置 1,將產生中斷。
在發送數據時,編程的時候有幾個比較重要的標志位我們來總結下。
接收器
如果將 USART_CR1 寄存器的 RE 位置 1,使能 USART 接收,使得接收器在 RX 線開始搜索起始位。在確定到起始位后就根據 RX 線電平狀態把數據存放在接收移位寄存器內。接收完成后就把接收移位寄存器數據移到 RDR 內,并把 USART_SR 寄存器的 RXNE 位置 1,同時如果 USART_CR2 寄存器的 RXNEIE 置 1 的話可以產生中斷。
在接收數據時,編程的時候有幾個比較重要的標志位我們來總結下。
USARTDIV的計算
波特率指數據信號對載波的調制速率,它用單位時間內載波調制狀態改變次數來表示,單位為比特。比特率指單位時間內傳輸的比特數,單位 bit/s(bps)。對于 USART 波特率與比特率相等,所以可以將波特率和比特率作為同一個概念。波特率越大,傳輸速率越快。 USART 的發送器和接收器需要使用相同的波特率。
計算公式如下:
其中,fPLCK為 USART 時鐘,USARTDIV 是一個存放在波特率寄存器 (USART_BRR) 的一個無符號定點數。其中 DIV_Mantissa[11:0] 位定義 USARTDIV 的整數部分,DIV_Fraction[3:0] 位定義USARTDIV 的小數部分。
例如:DIV_Mantissa=24(0x18),DIV_Fraction=10(0x0A),此時 USART_BRR 值為 0x18A;那么 USARTDIV 的小數位 10/16=0.625;整數位 24,最終 USARTDIV 的值為 24.625。
如果知道 USARTDIV 值為 27.68,那么 DIV_Fraction=16*0.68=10.88,最接近的正整數為 11,所以 DIV_Fraction[3:0] 為 0xB;DIV_Mantissa= 整數 (27.68)=27,即為 0x1B。
波特率的常用值有 2400、9600、19200、115200。下面以實例講解如何設定寄存器值得到波特率的值。
我們知道 USART1 使用 APB2 總線時鐘,最高可達 72MHz,其他 USART 的最高頻率為 36MHz。
我們選取 USART1 作為實例講解,即fPLCK=72MHz。為得到 115200bps 的波特率,此時:
115200=72000000/16*USARTDIV
解得USARTDIV=39.0625,可算得 DIV_Fraction=0.0625*16=1=0x01,DIV_Mantissa=39=0x27,即應該設置 USART_BRR 的值為 0x271。
-
物理層
+關注
關注
1文章
148瀏覽量
34288 -
串口通訊
+關注
關注
1文章
258瀏覽量
24857 -
串行通訊
+關注
關注
2文章
77瀏覽量
16356
發布評論請先 登錄
相關推薦
評論