學會Zynq(24)UART控制器簡介

本文簡單介紹Zynq中的UART控制器,重點放在編程所需瞭解的知識。很多功能使用庫函數可以快速配置,因此沒必要仔細瞭解每個寄存器是幹什麼的這種問題,應把精力放在UART的特性、工作原理和可實現功能方面。


UART控制器

Zynq中的UART控制器是一個全雙工異步收發器,支持各種可編程的波特率和I/O信號格式,能夠自動生成奇偶校驗,支持多主檢測模式。

UART操作由配置和模式寄存器控制。採用獨立的Rx和Tx數據路徑,每個路徑包含一個64字節的FIFO。控制器對Tx和Rx FIFO中的數據進行串並轉換操作,還有一個模式開關,支持RxD和TxD信號的各種迴環配置。FIFO的中斷標誌支持輪詢處理或中斷驅動處理兩種方式。程序中我們通過Rx和Tx的數據端口寄存器來讀寫數據字節。

Zynq內部有兩個UART控制器,UART0和UART1,都支持如下特性:

  • 可編程波特率發生器;
  • 64字節的接收和發送FIFO;
  • 可編程的串口協議,6、7、8位的數據位;1、1.5、2位的停止位;奇校驗、偶校驗、無校驗等;
  • 奇偶校驗檢測、幀錯誤檢測、溢出錯誤檢測;
  • 生成換行符;
  • 生成中斷;
  • RxD和TxD模式,使用模式開關選擇Normal、echo或診斷迴環;
  • 將UART0和UART1迴環;
  • 調製解調控制信號CTS、RTS、DSR、DTR、RI和DCD,僅在EMIO接口上可用。

UART波特率發生器

UART的模塊框圖如下所示:
在這裏插入圖片描述
波特率發生器爲接收機和發射機提供波特率時鐘。下表給出了一些串口時鐘、波特率和錯誤率之間的關係。
在這裏插入圖片描述


發送FIFO與數據流

我們通過向TxFIFO寄存器寫值來把數據加載到TxFIFO中。TxFIFO有空標誌,FIFO中有數據時此標誌無效。當TxFIFO進入完全中斷狀態(TFULL)時,則表明FIFO已滿。此時再執行寫操作,會觸發溢出,數據不會加載到TxFIFO中。TxFIFO幾乎滿標誌(TNFULL)表示FIFO中只有一個字節的空閒空間。我們可以設置門限觸發器(TTRIG),當FIFO中的字節達到此值時會觸發TTRIG(圖示見下小節)。

傳輸模塊從TxFIFO中移出並行數據,將其加載到發射機移位寄存器中,實現串行化。在波特率時鐘的下降沿傳輸數據,先傳LSB,如下圖:
在這裏插入圖片描述


接收FIFO與數據捕獲

RxFIFO存儲接收器串行移位寄存器收到的數據。RxFIFO也有與TxFIFO功能類似的空標誌完全中斷狀態RFUL、門限觸發器RTRIG。幾種標誌和中斷的示意如下圖:
在這裏插入圖片描述
接收時,UART不斷地對RxD信號進行過採樣,當採樣檢測到一個由高到低的轉換時,便將其視作起始位的開始。在波特率時鐘週期的一半時,再進行三次採樣,如果仍然時低電平,則認爲這是一個有效的起始位。示意如下,下圖是16倍的過採樣:
在這裏插入圖片描述
確定了一個有效的起始位後,重新同步接收器的波特率時鐘,以便在每一位的中心位置對傳入的RxD信號進行採樣(防止滑碼),示意如下圖。如果您編寫過Verilog的UART收發程序,對這個處理方法應該不會感到陌生。
在這裏插入圖片描述
當確定了一個串行數據位的值後,將其轉移到接收移位寄存器中。當組裝好一個完整的字符後,移位寄存器中的內容被推送到RxFIFO中。


接收器錯誤檢測

UART控制器提供了四種錯誤檢測機制。

  1. 奇偶檢驗錯誤。每接收一個字符時,接收器根據UART計算接收數據位的奇偶校驗值,將它與接收到的奇偶檢驗位進行比較。如果值不同,則奇偶校驗錯誤標誌位置1,併產生中斷。
  2. 幀錯誤。當接收器在幀末沒有接收到有效的停止位時,幀錯誤標誌位置1,產生中斷。
  3. 溢出錯誤。當接收到一個字符時,UART控制器檢測RxFIFO是否有空間。如果有則將該字符寫入RxFIFO;如果RxFIFO已滿則等待;如果又檢測到了下一個數據的起始位,且RxFIFO仍然是滿的,那麼等待的數據將丟失,同時溢出標誌位置1,產生中斷。
  4. 超時機制。接收器有一個10位的遞減計數器,每當在RxD上收到一個新的起始位或者程序向專門的標誌位寫入1重置時,計數器都會重新加載並倒數。當計數器減到0時認定發生超時,相應標誌位置1(此時程序中應重置計數器),產生中斷。

上面介紹的4種中斷都不是必須的,我們可以屏蔽這些中斷,也可以禁用超時機制。


I/O模式選擇

模式開關控制着RxD和TxD信號在控制器內部的路由。有4種工作模式,如下圖所示:
在這裏插入圖片描述
下面簡單介紹下各模式的功能:

  • 正常模式:這是標準的UART工作模式,TxD和RxD有獨立的路徑。
  • 自動echo模式:Echo模式仍然會接收RxD上的數據,但模式開關將數據路由到接收器和TxD引腳,控制器不能用發射機來發射數據。
  • 本地迴環模式:這個模式內部信號不與RxD和TxD連接,發射的數據被迴環到接收器中。
  • 遠程迴環模式:此模式將RxD與TxD連接,控制器無法在TxD上發送任何內容,也不能在RxD上接收任何內容。

程序設計方法

如果我們的需求只是用串口打印一些調試信息,那麼直接使用printf或xil_printf函數就足夠了,無需對串口做任何配置。如果我們需要用UART完成某些特定功能,那麼就有必要細緻瞭解UART的程序設計方法。本文只簡單描述一下設計思路,後面的文章給出實例。

1. UART啓動

UART的啓動順序如下:

  1. 復位控制器;
  2. 配置I/O信號路由。Rx/Tx可以路由到MIO或EMIO,只有EMIO可以使用調製解調控制信號;
  3. 配置UART參考時鐘UART_Ref_Clk;
  4. 配置控制器功能;
  5. 配置中斷,我們可通過中斷來管理RxFIFO和TxFIFO;
  6. 配置調製解調控制(可選);
  7. 管理髮送和接收的數據,可以採用輪詢或中斷驅動處理兩種方式。

2. 配置控制器函數

控制器功能主要配置字符幀、波特率、FIFO觸發器等級、Rx超時機制,並啓用控制器。重置控制器後必須要
配置所有這些參數。步驟如下:

  1. 配置UART字符幀,數據位長度、校驗位、停止位、I/O模式等;
  2. 配置波特率;
  3. 設置RxFIFO觸發器等級,可以選擇啓用或禁用該功能;
  4. 使能控制器;
  5. 配置接收器的超時機制,可以選擇啓用或禁用該功能。

3. 發送數據

程序中我們可以使用輪詢和中斷兩種方式控制到TxFIFO和RxFIFO的數據流。這兩個FIFO大小爲64個字節,因此當TxFIFO的空標誌有效時,我們可以直接向其寫入64個字節,無需檢查TxFIFO的狀態。實際上當發送器處於活躍狀態時,可寫入的字節數要超過64個字節,因爲控制器同時也在移出數據,將其串行化轉移到TxD信號上。

使用輪詢方法的數據發送流程如下:

  1. 檢查TxFIFO是否爲空;
  2. 向TxFIFO寫入數據,可寫入64個字節;
  3. 寫入更多數據。我們可以等TxFIFO空了後再寫64個字節,即執行第2步;也可以檢測TxFIFO是否有空間,即不停的讀取TFUL標誌和寫單個字節的數據。

使用中斷方法的數據發送流程如下:

  1. 禁用TxFIFO空中斷;
  2. 向TxFIFO寫64個字節的數據;
  3. 檢測TxFIFO是否有空間,不停的讀取TFUL標誌和寫單個字節的數據;
  4. 重複步驟2-3,直到TxFIFO已滿;
  5. 使能TxFIFO空中斷;
  6. 等待,直到TxFIFO爲空,然後從步驟1重新開始;

4. 接收數據

使用輪詢方法的數據接收流程如下:

  1. 等待,直到RxFIFO中的數據數量達到觸發等級;
  2. 從RxFIFO中讀取數據;
  3. 重複步驟2直到FIFO空;
  4. 發生Rx超時中斷時將其重置。

使用中斷方法的數據接收流程如下:

  1. 使能中斷;
  2. 等待,直到RxFIFO中的數據數量達到觸發等級或者發生超時;
  3. 從RxFIFO中讀取數據;
  4. 重複步驟2-3直到FIFO空;
  5. 清除中斷標誌。

UART的I/O接口

UART的RxD和TxD信號可以路由到多組MIO管腳之一或EMIO接口。所有調製解調流控制信號只能路由到EMIO接口,再MIO管腳上不可用。下表給出了所有UART信號:
在這裏插入圖片描述
我們在Vivado中搭建硬件環境時,也要選擇使用UART0還是UART1,以及它們的信號路由到的MIO管腳。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章