UART,即通用異步接收器/發(fā)送器,是最常用的設備間通信協(xié)議之一,正確配置后,UART可以配合許多不同類型的涉及發(fā)送和接收串行數(shù)據(jù)的串行協(xié)議工作。在串行通信中,數(shù)據(jù)通過單條線路或?qū)Ь€逐位傳輸。在雙向通信中,我們使用兩根導線來進行連續(xù)的串行數(shù)據(jù)傳輸。根據(jù)應用和系統(tǒng)要求,串行通信需要的電路和導線較少,可降低實現(xiàn)成本。
本文將UART用作硬件通信協(xié)議應遵循的標準步驟進行說明,討論使用UART的基本原則,重點是數(shù)據(jù)包傳輸、標準幀協(xié)議和定制幀協(xié)議;定制幀協(xié)議將是安全合規(guī)性方面的增值特性,尤其是在代碼開發(fā)期間。在產(chǎn)品開發(fā)過程中,本文還將分享一些基本步驟,以檢查數(shù)據(jù)表的實際使用,目標是幫助更好地理解和遵循UART標準,以便最大程度地發(fā)揮其能力和應用優(yōu)勢,特別是在開發(fā)新產(chǎn)品時。
通信協(xié)議
通信協(xié)議在組織設備之間的通信時扮演著重要角色。它基于系統(tǒng)要求而以不同方式進行設計。此類協(xié)議具有特定的規(guī)則,為實現(xiàn)成功通信,不同設備都遵循該規(guī)則。
根據(jù)定義,UART是一種硬件通信協(xié)議,以可配置的速度使用異步串行通信。異步意味著沒有時鐘信號來同步從發(fā)送設備進入接收端的輸出位。
嵌入式系統(tǒng)、微控制器和計算機大多將UART作為設備間硬件通信協(xié)議的一種形式。在可用通信協(xié)議中,UART的發(fā)送和接收端僅使用兩條線。盡管它是一種廣泛使用的硬件通信方法,但它并非在所有時候都是完全優(yōu)化的。在微控制器內(nèi)部使用UART模塊時,通常會忽略幀協(xié)議的適當實現(xiàn)。
UART(Universal Asynchronous Receiver/Transmitter,通用異步收發(fā)器)是一種常用的串行通信協(xié)議,廣泛應用于單片機或各種嵌入式設備之間的通信。本文將詳細介紹UART通信的基本原理、工作模式、波特率計算以及常見使用方式,幫助有一定單片機開發(fā)能力的人群更好地理解和應用UART通信。
一、UART通信的異步通信機制
UART通信是一種異步串行通信方式,其基本原理是通過數(shù)據(jù)線上傳輸二進制數(shù)據(jù)位。UART通信系統(tǒng)主要由發(fā)送端和接收端兩部分組成,它們之間通過數(shù)據(jù)線進行數(shù)據(jù)傳輸。發(fā)送端將待發(fā)送的數(shù)據(jù)轉換為并行信號,然后通過驅(qū)動電路將并行信號轉換為串行信號,并通過發(fā)送電路將串行信號發(fā)送到數(shù)據(jù)線上。接收端則通過接收電路將數(shù)據(jù)線上的信號還原為并行信號,再通過解碼電路將并行信號轉換為原始數(shù)據(jù)位。
UART通信采用異步通信方式,即發(fā)送端和接收端之間通過數(shù)據(jù)線進行數(shù)據(jù)傳輸。在異步通信中,發(fā)送端和接收端不需要同時處于激活狀態(tài),而是通過起始位和停止位來標識數(shù)據(jù)幀的開始和結束。具體來說,當發(fā)送端產(chǎn)生起始位后,發(fā)送一個數(shù)據(jù)位;然后等待接收端的起始位,如果接收到起始位,則繼續(xù)發(fā)送下一個數(shù)據(jù)位;如果沒有接收到起始位,則認為數(shù)據(jù)幀傳輸失敗。同樣,當接收端產(chǎn)生停止位后,發(fā)送一個校驗位;然后等待發(fā)送端的停止位,如果接收到停止位,則認為數(shù)據(jù)幀傳輸成功。
二、UART的波特率
波特率表示單位時間內(nèi)通過線路傳輸?shù)亩M制數(shù)據(jù)的位數(shù),通常用bps(bits per second)表示。例如,如果波特率為9600bps,則每秒鐘可以傳輸9600個比特位的數(shù)據(jù)。
串口傳輸數(shù)據(jù)的波特率是單片機的時鐘系統(tǒng)來產(chǎn)生的,因此它和單片機的系統(tǒng)時鐘存在算式關系。
波特率= (16 * 時鐘頻率) / (32 * 采樣時間) + (1 * 時鐘頻率) / (32 * 采樣時間) - (1 * 時鐘頻率) / (64 * 采樣時間)
其中,采樣時間指從上一次起始位到本次起始位之間的時間間隔。例如,如果采樣時間為10ns,則波特率為9600bps。
常見的波特率有2400、4800、9600、19200、38400、57600、115200……它們都可是2400的整數(shù)倍,因此不同的波特率可以通過分頻器來產(chǎn)生?,F(xiàn)在的單片機雖然都有著不同的頻率,常見的有32MHz、48MHz和144MHz,通常它們都會有一個外部系統(tǒng)時鐘為單片機的外圍設備提供基礎時鐘頻率(如1MHz),UART產(chǎn)生波特率也是從該時鐘產(chǎn)生時鐘信號。
需要注意的是,在實際使用中,時鐘頻率可能會受到一些因素的影響,如晶振漂移、電源噪聲等。因此,為了保證數(shù)據(jù)傳輸?shù)恼_性和可靠性,建議在設計UART通信系統(tǒng)時使用外部晶振或時鐘發(fā)生器,并對其進行校準和補償。
三、停止位和奇偶校驗
在UART異步通信中,停止位用于表示數(shù)據(jù)幀的結束。停止位可以是1個或2個比特位。當停止位為1個比特位時,每個數(shù)據(jù)字節(jié)的后面都添加一個額外的時間間隔,以補償時鐘抖動和其他因素引起的誤差。例如,如果波特率為9600bps,則每個字節(jié)的時間間隔為4ms,因此每個停止位的時間間隔為4ms / 8 = 0.5ms。
當停止位為2個比特位時,每個數(shù)據(jù)字節(jié)的后面都添加兩個額外的時間間隔,即每個字節(jié)的時間間隔為4ms / (8 + 4) = 0.3125ms。這種模式適用于需要更高精度的數(shù)據(jù)傳輸場景。
奇偶校驗是一種常用的錯誤檢測方法,可以檢測數(shù)據(jù)傳輸過程中的錯誤和丟失。在UART通信中,可以通過設置奇偶校驗位來提高數(shù)據(jù)傳輸?shù)恼_性和可靠性。
需要注意的是,奇偶校驗位只能檢測數(shù)據(jù)傳輸過程中的錯誤和丟失,而不能保證數(shù)據(jù)的完整性和正確性。因此,在使用UART通信時,還需要采取其他措施來確保數(shù)據(jù)傳輸?shù)恼_性和可靠性。
四、UART的輪詢收發(fā)和中斷收發(fā)
前面我們講過,UART通信就是把一個字節(jié)的數(shù)據(jù)拆分成若干bit位,然后一個bit一個bit的發(fā)送。當一個字節(jié)的數(shù)據(jù)被送進UART發(fā)送器后,這個字節(jié)被轉換成bit位,UART發(fā)送這個字節(jié)后還要產(chǎn)生停止位,此時UART發(fā)送器已經(jīng)空閑,可以繼續(xù)發(fā)送下一個字節(jié)。通常UART發(fā)送器發(fā)送完一個字節(jié)后會產(chǎn)生一個空閑狀態(tài),輪詢式發(fā)送就是等待這個空閑狀態(tài)并發(fā)送下一個字節(jié)。UART接收也是如此,UART接收器收完一個字節(jié)并收到停止位信號時,就會向單片機的UART數(shù)據(jù)寄存器保存剛收到的數(shù)據(jù),并產(chǎn)生一個收到標志位,輪詢該標志位就可以接收到該字節(jié)數(shù)據(jù)。
但是在單片機系統(tǒng)中經(jīng)常不止UART收發(fā)應用,這時就要用到中斷收發(fā)。通常單片機的UART收發(fā)都有RX收到中斷和TX完畢中斷。中斷發(fā)送時,UART發(fā)送器是空閑狀態(tài),此時往發(fā)送器里面寫入第一個字節(jié),該字節(jié)傳輸完畢后產(chǎn)生TX完畢中斷,在TX完畢中斷的服務函數(shù)中再填入后續(xù)字節(jié)并產(chǎn)生下一個中斷,最后直到把需要傳輸?shù)淖止?jié)都傳完為止。中斷接收時,UART接收器收到字節(jié)后會產(chǎn)生RX收到中斷,在RX收到中斷服務函數(shù)中讀取收到的字節(jié),每次中斷時都讀取收到的字節(jié)。
五、帶數(shù)據(jù)緩存的UART收發(fā)
在很多單片機系統(tǒng)中,都會提供UART Read和UART Write這樣的接口函數(shù)。一些高級的單片機甚至還有UART Read Callback和UART Write Callback這樣的回調(diào)函數(shù)來收發(fā)數(shù)據(jù)。通常很多單片機的數(shù)據(jù)處理能力相對UART通信來說要快得多,因此像采用上述接口函數(shù)的單片機系統(tǒng)都使用了數(shù)據(jù)緩存來輔助UART收發(fā)。常見的UART收發(fā)方式有這幾種: