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