UART(Universal Asynchronous Receiver/Transmitter,通用異步收發器)是一種常用的串行通信協議,廣泛應用于單片機或各種嵌入式設備之間的通信。本文將詳細介紹UART通信的基本原理、工作模式、波特率計算以及常見使用方式,幫助有一定單片機開發能力的人群更好地理解和應用UART通信。
01
UART通信的異步通信機制
UART通信是一種異步串行通信方式,其基本原理是通過數據線上傳輸二進制數據位。UART通信系統主要由發送端和接收端兩部分組成,它們之間通過數據線進行數據傳輸。發送端將待發送的數據轉換為并行信號,然后通過驅動電路將并行信號轉換為串行信號,并通過發送電路將串行信號發送到數據線上。接收端則通過接收電路將數據線上的信號還原為并行信號,再通過解碼電路將并行信號轉換為原始數據位。
UART通信采用異步通信方式,即發送端和接收端之間通過數據線進行數據傳輸。在異步通信中,發送端和接收端不需要同時處于激活狀態,而是通過起始位和停止位來標識數據幀的開始和結束。具體來說,當發送端產生起始位后,發送一個數據位;然后等待接收端的起始位,如果接收到起始位,則繼續發送下一個數據位;如果沒有接收到起始位,則認為數據幀傳輸失敗。同樣,當接收端產生停止位后,發送一個校驗位;然后等待發送端的停止位,如果接收到停止位,則認為數據幀傳輸成功。
02
UART的波特率
波特率表示單位時間內通過線路傳輸的二進制數據的位數,通常用bps(bits per second)表示。例如,如果波特率為9600bps,則每秒鐘可以傳輸9600個比特位的數據。
串口傳輸數據的波特率是單片機的時鐘系統來產生的,因此它和單片機的系統時鐘存在算式關系。
波特率= (16 * 時鐘頻率) / (32 * 采樣時間) + (1 * 時鐘頻率) / (32 * 采樣時間) - (1 * 時鐘頻率) / (64* 采樣時間)
其中,采樣時間指從上一次起始位到本次起始位之間的時間間隔。例如,如果采樣時間為10ns,則波特率為9600bps。
常見的波特率有2400、4800、9600、19200、38400、57600、115200……它們都可是2400的整數倍,因此不同的波特率可以通過分頻器來產生。現在的單片機雖然都有著不同的頻率,常見的有32MHz、48MHz和144MHz,通常它們都會有一個外部系統時鐘為單片機的外圍設備提供基礎時鐘頻率(如1MHz),UART產生波特率也是從該時鐘產生時鐘信號。
需要注意的是,在實際使用中,時鐘頻率可能會受到一些因素的影響,如晶振漂移、電源噪聲等。因此,為了保證數據傳輸的正確性和可靠性,建議在設計UART通信系統時使用外部晶振或時鐘發生器,并對其進行校準和補償。
03
停止位和奇偶校驗
在UART異步通信中,停止位用于表示數據幀的結束。停止位可以是1個或2個比特位。當停止位為1個比特位時,每個數據字節的后面都添加一個額外的時間間隔,以補償時鐘抖動和其他因素引起的誤差。例如,如果波特率為9600bps,則每個字節的時間間隔為4ms,因此每個停止位的時間間隔為4ms / 8 = 0.5ms。
當停止位為2個比特位時,每個數據字節的后面都添加兩個額外的時間間隔,即每個字節的時間間隔為4ms / (8 + 4) = 0.3125ms。這種模式適用于需要更高精度的數據傳輸場景。
奇偶校驗是一種常用的錯誤檢測方法,可以檢測數據傳輸過程中的錯誤和丟失。在UART通信中,可以通過設置奇偶校驗位來提高數據傳輸的正確性和可靠性。
需要注意的是,奇偶校驗位只能檢測數據傳輸過程中的錯誤和丟失,而不能保證數據的完整性和正確性。因此,在使用UART通信時,還需要采取其他措施來確保數據傳輸的正確性和可靠性。
04
UART的輪詢收發和中斷收發
前面我們講過,UART通信就是把一個字節的數據拆分成若干bit位,然后一個bit一個bit的發送。當一個字節的數據被送進UART發送器后,這個字節被轉換成bit位,UART發送這個字節后還要產生停止位,此時UART發送器已經空閑,可以繼續發送下一個字節。通常UART發送器發送完一個字節后會產生一個空閑狀態,輪詢式發送就是等待這個空閑狀態并發送下一個字節。
UART接收也是如此,UART接收器收完一個字節并收到停止位信號時,就會向單片機的UART數據寄存器保存剛收到的數據,并產生一個收到標志位,輪詢該標志位就可以接收到該字節數據。
但是在單片機系統中經常不止UART收發應用,這時就要用到中斷收發。通常單片機的UART收發都有RX收到中斷和TX完畢中斷。中斷發送時,UART發送器是空閑狀態,此時往發送器里面寫入第一個字節,該字節傳輸完畢后產生TX完畢中斷,在TX完畢中斷的服務函數中再填入后續字節并產生下一個中斷,最后直到把需要傳輸的字節都傳完為止。中斷接收時,UART接收器收到字節后會產生RX收到中斷,在RX收到中斷服務函數中讀取收到的字節,每次中斷時都讀取收到的字節。
05
帶數據緩存的UART收發
在很多單片機系統中,都會提供UART Read和UART Write這樣的接口函數。一些高級的單片機甚至還有UART Read Callback和UART Write Callback這樣的回調函數來收發數據。通常很多單片機的數據處理能力相對UART通信來說要快得多,因此像采用上述接口函數的單片機系統都使用了數據緩存來輔助UART收發。常見的UART收發方式有這幾種:
數據隊列(Queue)收發
這種方式適合大多數單片機,只要有中斷就行。使用UART Write發送數據時,數據并不是直接寫入到UART發送器,而是放進了一個環形緩沖區中。然后在UART TX發送完畢中斷服務函數中讀取環形緩沖區并把讀到的字節送入UART發送器,然后等待TX發送完畢中斷服務函數再次執行時送入下一個字節,直到把環形緩沖區的數據送完為止。環形緩沖區通常有一個標記頭和尾的變量,只要頭和尾的變量值不相等就說明緩沖區有數據。使用UART Read接收數據時,也不是直接從UART接收器中獲取數據,而是從環形緩沖區中獲取數據。UART RX收到中斷服務函數中把UART接收器收到的字節送進環形緩沖區,單片機執行UART Read時獲取到的數據是環形緩沖區的數據,這樣可以保證單片機程序不用一直等待UART接收器。
這種設計的優點是可以有效地處理實時數據,避免了數據的丟失。但是,如果Queue的大小設置不當,可能會導致數據的溢出。因此,我們需要根據實際的應用場景來合理地設置Queue的大小。
帶硬件FIFO的UART收發
很多先進的單片機的UART收發用上了硬件FIFO。沒有硬件FIFO的單片機在收發數據時每收發一個字節就要執行一次中斷函數,在高波特率通信時單片機會頻繁進入中斷,從而影響單片機主任務的處理。而硬件FIFO則可以緩解這種矛盾。例如單片機的UART FIFO是16字節,單片機在發送數據時一次最多可以傳輸16字節數據,等16字節數據發送完畢后才產生UART TX發送完畢中斷。接收數據時通常是“半滿”中斷和“超時”中斷,即接收FIFO中的字節數超過8字節,或者接收FIFO不為空但是超過1字節的時間內沒有收到新的字節數據,產生一次UART RX接收中斷。通常帶硬件FIFO的UART會和數據隊列的方式相結合使用,在高波特率通信下傳輸效率更高。
帶DMA的UART收發
DMA(Direct Memory Access)是一種可以將計算機的某個存儲區域直接映射到內存地址空間的技術,從而實現對內存和其他外設的統一訪問。當UART接收到數據時,數據會被直接寫入到DMA控制的內存區域中,然后觸發中斷。在中斷服務程序中,我們可以從DMA控制的內存區域中取出數據,進行必要的處理,然后再通過UART發送出去。
DMA傳輸
使用DMA進行UART傳輸對連續多條數據的傳輸幫助特別大,例如前面提到的UART Read Callback和UART Write Callback回調函數的方式。連續發送多條數據流時,可以把數據流放在單片機的多個不同的緩沖區,然后DMA直接指向緩沖區地址,待DMA傳輸完畢后產生UART Write Callback,然后在UART Write Callback中把DMA指向下一個緩沖區地址。接收數據時也可以預約一個接收緩沖區,DMA傳輸的數據傳輸到該緩沖區,傳輸滿了后產生UART Read Callback再指向下一個接收緩沖區,同時可以讓單片機主程序處理已收滿數據的緩沖區的內容。
本文詳細介紹了UART通信的基本原理、波特率計算、工作模式以及常見的使用方式,幫助有一定單片機開發能力的人群更好地理解和應用UART通信。掌握UART通信技術,可以為單片機控制系統的設計和應用帶來很大的便利。
-
單片機
+關注
關注
6039文章
44579瀏覽量
636436 -
收發器
+關注
關注
10文章
3438瀏覽量
106067 -
通信
+關注
關注
18文章
6042瀏覽量
136140 -
uart
+關注
關注
22文章
1240瀏覽量
101490
發布評論請先 登錄
相關推薦
評論