• 正文
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

一文講透串行通信---UART基礎(chǔ)

05/26 12:00
414
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

通用異步收發(fā)傳輸器,也就是我們常說(shuō)的UART模塊,是一種串行通信外設(shè),它允許用戶將其與其他兼容UART的設(shè)備進(jìn)行連接。UART模塊具有高度的可編程性,它提供了諸如帶過(guò)采樣功能的可編程波特率發(fā)生器、可配置的數(shù)據(jù)位大?。?位、6位、7位或8位)等特性。對(duì)于單主多從總線方案,還實(shí)現(xiàn)了第9位。

其他特性,比如奇偶校驗(yàn)位的生成和檢測(cè)、線路中斷檢測(cè)以及硬件流量控制,在大多數(shù)微控制器的UART中都是標(biāo)準(zhǔn)配置。所有的UART都會(huì)有一個(gè)單獨(dú)的數(shù)據(jù)緩沖區(qū),用于發(fā)送和接收數(shù)據(jù)。有些UART可能會(huì)包含固定大小或可編程大小的先進(jìn)先出(FIFO)緩沖區(qū),以減輕CPU中斷服務(wù)的負(fù)載。

從功能層面來(lái)看,UART有三個(gè)主要特性,即發(fā)送器、接收器時(shí)鐘發(fā)生器。發(fā)送器有一個(gè)發(fā)送緩沖區(qū)和移位寄存器,用于執(zhí)行并行到串行的轉(zhuǎn)換。一個(gè)字節(jié)被加載到UART的發(fā)送緩沖區(qū)中,然后通過(guò)移位寄存器一位一位地進(jìn)行轉(zhuǎn)換和發(fā)送。

發(fā)送控制邏輯輸出串行比特流,根據(jù)控制寄存器中的程序配置,該比特流以起始位開頭,接著是數(shù)據(jù)位、奇偶校驗(yàn)位和停止位。當(dāng)發(fā)送緩沖區(qū)為空時(shí),發(fā)送邏輯也會(huì)通知CPU,并且至少會(huì)有一個(gè)發(fā)送數(shù)據(jù)緩沖寄存器。其他的可能會(huì)提供多個(gè)緩沖區(qū),帶有固定或可編程的閾值,也就是我們所說(shuō)的FIFO。這些FIFO緩沖區(qū)有助于減輕CPU中斷服務(wù)的負(fù)載。

接收器也有一個(gè)移位寄存器和一個(gè)接收緩沖區(qū),在接收器控制邏輯檢測(cè)到有效的起始位后,對(duì)接收到的比特流執(zhí)行串行到并行的轉(zhuǎn)換。溢出、奇偶校驗(yàn)、幀錯(cuò)誤檢查以及線路中斷檢測(cè)也由控制邏輯來(lái)執(zhí)行。在檢測(cè)到停止位后,這些位會(huì)被重新組合成一個(gè)數(shù)據(jù)字節(jié),并放入接收緩沖區(qū)中。當(dāng)接收到數(shù)據(jù)時(shí),控制邏輯會(huì)通知CPU。

發(fā)送和接收移位寄存器以及邏輯的時(shí)鐘定時(shí)由UART的時(shí)鐘發(fā)生器提供。時(shí)鐘發(fā)生器接收一個(gè)輸入的系統(tǒng)時(shí)鐘,并生成兩個(gè)輸出時(shí)鐘,一個(gè)時(shí)鐘用于發(fā)送部分,通常被稱為位時(shí)鐘或波特率時(shí)鐘,而一個(gè)更快的時(shí)鐘則被接收器用于位采樣。

發(fā)送器和接收器模塊也有控制邏輯,它為每個(gè)模塊以及UART所支持的各種協(xié)議提供狀態(tài)信息和控制,這里就不詳細(xì)介紹這些協(xié)議了。

UART的發(fā)送模塊負(fù)責(zé)將一個(gè)數(shù)據(jù)字節(jié)轉(zhuǎn)換為比特,并將每個(gè)比特從UART的發(fā)送數(shù)據(jù)引腳(TXD)串行發(fā)送出去。這一功能通過(guò)一個(gè)緩沖區(qū)、串行移位寄存器以及發(fā)送狀態(tài)和控制邏輯來(lái)實(shí)現(xiàn)。

UART的緩沖區(qū)大小可以是一個(gè)數(shù)據(jù)字節(jié),也可以是先進(jìn)先出(FIFO)隊(duì)列中的多個(gè)數(shù)據(jù)字節(jié),具體取決于UART本身。該緩沖區(qū)可減少CPU管理UART發(fā)送緩沖區(qū)所需的時(shí)間。發(fā)送控制邏輯負(fù)責(zé)管理每個(gè)數(shù)據(jù)字節(jié)向UART移位寄存器的移動(dòng)。數(shù)據(jù)的并行到串行轉(zhuǎn)換是通過(guò)將數(shù)據(jù)逐位從TXD引腳移出實(shí)現(xiàn)的。

要發(fā)送一個(gè)字節(jié),CPU會(huì)檢查發(fā)送緩沖區(qū)標(biāo)志,查看緩沖區(qū)是否為空。如果發(fā)送緩沖區(qū)為空,CPU會(huì)將一個(gè)字節(jié)寫入發(fā)送緩沖區(qū)。如果UART有多個(gè)緩沖區(qū)或采用FIFO結(jié)構(gòu),CPU可以持續(xù)加載額外的字節(jié),直至FIFO被填滿。

若移位寄存器為空,緩沖區(qū)中的第一個(gè)字節(jié)會(huì)立即從緩沖區(qū)轉(zhuǎn)移到移位寄存器中??刂七壿嫊?huì)啟用位時(shí)鐘,開始將比特從發(fā)送引腳輸出。當(dāng)移位寄存器中的最后一位被移出后,緩沖區(qū)或FIFO中的下一個(gè)字節(jié)會(huì)自動(dòng)轉(zhuǎn)移到移位寄存器中,如此循環(huán)往復(fù)。

和發(fā)送器一樣,UART的接收模塊也有一個(gè)串行移位寄存器、接收緩沖區(qū)和控制邏輯,其職責(zé)是將傳入的串行比特流組合成一個(gè)并行的數(shù)據(jù)字節(jié),以便CPU讀取。這個(gè)過(guò)程始于將傳入的比特移入移位寄存器。

由于UART的異步特性,接收模塊會(huì)對(duì)接收數(shù)據(jù)引腳(RXD)進(jìn)行采樣,以此判斷何時(shí)有比特到達(dá),并準(zhǔn)確判定該比特是0還是1。接收邏輯能夠通過(guò)檢測(cè)比特流中第一個(gè)比特(即起始位)的下降沿,與每個(gè)新比特流的起始同步。

當(dāng)移位寄存器被填滿時(shí),這些比特會(huì)被轉(zhuǎn)移到接收器的輸入緩沖區(qū)或FIFO中,同時(shí)設(shè)置一個(gè)標(biāo)志。CPU可以監(jiān)控接收緩沖區(qū)標(biāo)志,從而知曉何時(shí)從接收緩沖區(qū)讀取數(shù)據(jù)。

時(shí)鐘發(fā)生器的時(shí)鐘源通常來(lái)自系統(tǒng)時(shí)鐘。借助分頻器和過(guò)采樣特性,UART的時(shí)鐘發(fā)生器會(huì)生成兩個(gè)時(shí)鐘,一個(gè)供發(fā)送器使用,稱為比特率時(shí)鐘或波特時(shí)鐘;另一個(gè)供接收器使用,在文中,我們稱之為采樣時(shí)鐘。

雖然發(fā)送器以比特率時(shí)鐘頻率運(yùn)行,但接收器需要更高的時(shí)鐘頻率,通常是比特率時(shí)鐘頻率的數(shù)倍。接收器邏輯利用這個(gè)更高頻率的采樣時(shí)鐘,通過(guò)在每個(gè)比特周期內(nèi)多次采樣邏輯電平,來(lái)確定到達(dá)RXD引腳的每個(gè)比特的值。

如上圖所示,接收器需要一個(gè)高于發(fā)送時(shí)鐘頻率的時(shí)鐘頻率來(lái)生成采樣時(shí)鐘。這個(gè)采樣時(shí)鐘通常是發(fā)送時(shí)鐘的3倍、8倍或16倍。

這個(gè)更高頻率的采樣時(shí)鐘使接收器的移位寄存器和控制邏輯能夠在一個(gè)比特時(shí)鐘周期內(nèi)對(duì)RXD引腳上的輸入電壓電平進(jìn)行多次采樣。接收器利用這些采樣結(jié)果來(lái)判斷輸入的比特是有效的1還是0。

在此,我們給出一個(gè)時(shí)序圖示例,展示了16倍過(guò)采樣時(shí)鐘與以波特時(shí)鐘頻率到達(dá)RXD引腳的接收比特之間的關(guān)系。此示例中涉及的概念同樣適用于3倍和8倍過(guò)采樣情況。

在解釋時(shí)序之前,要明白對(duì)于每個(gè)發(fā)送的字節(jié),數(shù)據(jù)位之前總是有一個(gè)單獨(dú)的起始位。起始位表現(xiàn)為RXD引腳上的高到低的跳變,它標(biāo)志著一個(gè) UART數(shù)據(jù)包的開始。

在接收數(shù)據(jù)包的間隙,接收器會(huì)在每個(gè)采樣時(shí)鐘周期持續(xù)評(píng)估RXD引腳上的電壓電平,等待檢測(cè)起始位的下降沿。當(dāng)檢測(cè)到RXD引腳的下降沿時(shí),接收器的采樣時(shí)鐘就會(huì)與UART數(shù)據(jù)包同步。每次接收到數(shù)據(jù)包都會(huì)進(jìn)行這種同步,所以這為發(fā)送器和接收器的同步提供了一種簡(jiǎn)單的方法。

接下來(lái)的操作被稱為“多數(shù)原則”,不同的UART可能會(huì)有所不同。但通常情況下,接收器會(huì)在第7、第8和第9個(gè)采樣時(shí)鐘周期對(duì)RXD引腳進(jìn)行采樣。如果在這三次采樣中,RXD引腳都為低電平,那么這個(gè)比特就被判定為0。

另一方面,如果在這三次采樣中,RXD引腳都為高電平,那么這個(gè)比特就被判定為1。需要注意的是,在某些UART中,起始位可能會(huì)被采樣多次而非三次,并且可能會(huì)在比特周期的更早階段進(jìn)行采樣。

那么,使用哪種過(guò)采樣率最好呢?這取決于具體情況。不過(guò)要考慮到,使用16倍過(guò)采樣時(shí),功耗可能會(huì)比使用8倍或3倍過(guò)采樣時(shí)更高。使用16倍采樣時(shí)鐘時(shí),還有一個(gè)需要考慮的因素,即采樣部分的比特邊沿與實(shí)際接收到的邊沿之間存在1/16的時(shí)間差。這意味著在比特周期的1/16(即6%)處就可能已經(jīng)出現(xiàn)誤差了;而使用8倍采樣時(shí)鐘時(shí),這個(gè)誤差是1/8(即12.5%)。

一般來(lái)說(shuō),與使用8倍過(guò)采樣相比,使用16倍過(guò)采樣時(shí),不同UART之間的波特率頻率差異可以更寬松一些。使用8倍過(guò)采樣時(shí),不同UART之間的波特率差異必須控制得更嚴(yán)格。由于任意兩個(gè)UART的系統(tǒng)時(shí)鐘源存在差異,將UART配置為以相同的波特率頻率運(yùn)行并不能保證它們的頻率完全相同。

實(shí)際上,在大多數(shù)情況下,頻率永遠(yuǎn)不會(huì)完全相同,尤其是考慮到一個(gè)或兩個(gè)UART的頻率可能會(huì)隨溫度變化,或者可能會(huì)引入一些時(shí)鐘抖動(dòng)。如果這些差異較小,是很容易被容忍的,因?yàn)榻邮掌鲿?huì)在每個(gè)比特的中點(diǎn)附近進(jìn)行采樣。

在這部分內(nèi)容中,我們了解了如何配置UART的分頻器和過(guò)采樣特性,以實(shí)現(xiàn)所需的傳輸波特率和接收器采樣頻率。如前文所述,分頻器的目的是降低輸入時(shí)鐘頻率,以支持各種較低的發(fā)送波特率。

UART的分頻器通常由兩個(gè)除數(shù)組成。一個(gè)是整數(shù)除數(shù),我們稱之為整數(shù)波特率除數(shù)(IBRD);另一個(gè)是小數(shù)除數(shù),即小數(shù)波特率除數(shù)(FBRD)。它們共同構(gòu)成了UART的除數(shù),即波特率除數(shù)(BRD)。根據(jù)輸入頻率和除數(shù)的組合,通??梢赃_(dá)到所需的波特率。

某些輸入時(shí)鐘和除數(shù)的組合可能無(wú)法產(chǎn)生所需的確切波特率。除數(shù)的小數(shù)部分用于幫助實(shí)現(xiàn)非常精確的時(shí)鐘頻率,而僅使用整數(shù)除數(shù)是無(wú)法做到這一點(diǎn)的。

計(jì)算波特率除數(shù)很簡(jiǎn)單。將UART的輸入時(shí)鐘除以過(guò)采樣配置值(16、8或3)與目標(biāo)波特率的乘積。讓我們來(lái)看一個(gè)例子,假設(shè)我們希望以16倍過(guò)采樣、輸入時(shí)鐘頻率為20Mhz的條件實(shí)現(xiàn)19200bps。

根據(jù)所示的公式,計(jì)算出的波特率除數(shù)是65.104。因此,整數(shù)部分65就是IBRD的值。但小數(shù)部分0.104必須轉(zhuǎn)換為可以在FBRD中使用的格式。有關(guān)如何處理小數(shù)格式的詳細(xì)信息,請(qǐng)參考你所使用的UART的文檔。

在最后這部分內(nèi)容中,我們來(lái)看看UART通常是如何相互連接的。大多數(shù) UART應(yīng)用支持兩線接口。發(fā)送數(shù)據(jù)引腳(TXD)用于發(fā)送數(shù)據(jù),而接收數(shù)據(jù)引腳(RXD)用于接收數(shù)據(jù)。為了讓兩個(gè)UART進(jìn)行通信,兩個(gè)UART的TXD引腳都必須連接到另一個(gè)UART的RXD引腳,就像這里的圖示一樣。首先要檢查TXD和RXD引腳是否與通用輸入輸出(GPIO)引腳或其他功能復(fù)用,如果有必要,相應(yīng)地配置這些引腳。

在這種配置下,UART可以一次發(fā)送和接收一個(gè)數(shù)據(jù),這被稱為半雙工通信;也可以同時(shí)發(fā)送和接收數(shù)據(jù),這被稱為全雙工通信。兩個(gè)UART 必須使用相同的頻率或速率來(lái)發(fā)送和接收數(shù)據(jù),這個(gè)頻率或速率就稱為波特率。

一些UART還可以支持四線接口,通過(guò)另外兩個(gè)引腳 —— 請(qǐng)求發(fā)送引腳(RTS)和清除發(fā)送引腳(CTS)來(lái)進(jìn)行流量控制。RTS輸出信號(hào)表示 UART 已準(zhǔn)備好接收數(shù)據(jù),而CTS信號(hào)則控制來(lái)自發(fā)送UART的數(shù)據(jù)流。和TXD與RXD引腳一樣,UART的RTS和CTS引腳在兩個(gè)UART之間也是交叉連接的。

請(qǐng)注意,在許多微控制器(MCU)中,UART的引腳輸入和輸出并不總是在專用的輸入輸出引腳上。相反,UART的信號(hào)會(huì)與其他輸入和輸出功能復(fù)用,比如定時(shí)器輸出、模擬數(shù)字轉(zhuǎn)換器ADC)輸入以及通用輸入輸出功能。對(duì)于引腳數(shù)量較少的器件來(lái)說(shuō)尤其如此。如果是這種情況,請(qǐng)按照微控制器文檔中的建議配置輸入輸出引腳。

總結(jié):UART是一種串行通信外設(shè),具有高度可編程性,提供如可編程波特率發(fā)生器、可配置數(shù)據(jù)位大小等特性,支持單主多從總線方案。其功能模塊包括發(fā)送器、接收器和時(shí)鐘發(fā)生器,分別負(fù)責(zé)數(shù)據(jù)發(fā)送、接收和時(shí)鐘定時(shí)。發(fā)送器將數(shù)據(jù)字節(jié)轉(zhuǎn)為比特流,接收器將串行比特流組合為數(shù)據(jù)字節(jié)。UART時(shí)鐘發(fā)生器生成發(fā)送和接收時(shí)鐘,接收器利用更高頻率的采樣時(shí)鐘確定比特值。UART通過(guò)兩線或四線接口通信,支持半雙工或全雙工模式,且引腳常與其他功能復(fù)用,需按文檔配置。

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄