一. UART原理
UART,Universal Asynchronous Receive Transmitter ,它用來傳輸串行數(shù)據(jù):發(fā)送數(shù)據(jù)時,CPU將并行數(shù)據(jù)寫入UART,UART按照一定的格式在一根電線上串行發(fā)出;接收數(shù)據(jù)時,UART檢測另一根電線上的信號,將串行收集放在緩沖區(qū)中,CPU即可讀取UART獲得這些數(shù)據(jù)。UART之間以全雙工方式傳輸數(shù)據(jù),最精簡的連線方式只有3根線,TxD用于發(fā)送數(shù)據(jù),RxD用于接收數(shù)據(jù),Gnd用于提供雙方參考電平。
UART使用標(biāo)準(zhǔn)的TTL/CMOS邏輯電平來表示數(shù)據(jù),為了增強(qiáng)數(shù)據(jù)的抗干擾能力,提高數(shù)據(jù)傳輸長度,通常將TTL/CMOS邏輯電平轉(zhuǎn)換為RS-232邏輯電平,3~12V表示0, -3~-12V表示1。
TxD,RxD數(shù)據(jù)線以“位”為最小單位傳輸數(shù)據(jù),幀(frame)由具有完整意義的,不可分割的若干位組成,它包含開始位,數(shù)據(jù)位,校驗位,停止位。發(fā)送數(shù)據(jù)前,UART之間需要約定好數(shù)據(jù)的傳輸速率(波特率=1/每位所占時間),數(shù)據(jù)的傳輸格式(即有多少個數(shù)據(jù)位,是否使用校驗位,是奇校驗還是偶校驗,有多少個停止位)。
數(shù)據(jù)傳輸流程:
(1) 平時數(shù)據(jù)線牌空閑狀態(tài)(1狀態(tài))。
(2) 當(dāng)要發(fā)送數(shù)據(jù)時,UART改變TxD數(shù)據(jù)線的狀態(tài)(1->0),并維持1位的時間,接收方在檢測到這一開始位的時候,再等待1.5位時間就開始一位一位地檢測數(shù)據(jù)線的狀態(tài)以得到數(shù)據(jù)。
(3) UART一幀中可以有5,6,7或者8位的數(shù)據(jù),發(fā)送方一位一位地改變數(shù)據(jù)線的狀態(tài),將它們發(fā)送出去,首先發(fā)送最低位。
(4) 如果使用校驗功能,UART在發(fā)送完數(shù)據(jù)位后,還要發(fā)送1個校驗位,有兩種校驗方法:奇校驗,偶校驗(數(shù)據(jù)線連同校驗位中“1”的個數(shù)等于奇數(shù)還是偶數(shù))。
(5) 最后發(fā)送停止位,數(shù)據(jù)線恢復(fù)到空閑狀態(tài)(1狀態(tài)),停止位的長度有3種:1位,1.5位,2.位。
二. S3C2440 UART的特性
S3C2440中的UART功能有3個通道,每個通道都可以工作于中斷模式或者DMA模式,即是UART可以發(fā)出中斷或者DMA請求以便在UART,CPU間傳輸數(shù)據(jù)。UART由波特率發(fā)生器,發(fā)送器,接收器和控制邏輯組成。
使用系統(tǒng)時鐘時,S3C2440的UART波特率可以達(dá)到115.2Kbit/s。如果使用UEXTCLK引腳提供的外部時鐘,則可以達(dá)到更高的波特率,波特率可以通過編程進(jìn)行控制。S3C2440的UART的FIFO深度為64,發(fā)送數(shù)據(jù)時,CPU先將數(shù)據(jù)寫入到發(fā)送FIFO中,然后 UART會自動將FIFO中的數(shù)據(jù)復(fù)制到“發(fā)送移位器(Transmit Shifter)”中,發(fā)送移位器將數(shù)據(jù)按照一定的格式插入相應(yīng)開始位,校驗位,停止位等,一位一位地發(fā)送到TxDn數(shù)據(jù)線上。接收時,接收移位器將RxDn數(shù)據(jù)線上的數(shù)據(jù)一位一位接收進(jìn)來,然后復(fù)制到接收FIFO中,CPU即可從中讀取數(shù)據(jù)。
S3C2440的UART的每個通道支持的停止位有1位,2位,數(shù)據(jù)位有5,6,7或者8位,支持校驗功能,另外還有紅外發(fā)送/接收功能。
三. S3C2440 UART的使用
在使用UART前,需要設(shè)置波特率,傳輸格式,設(shè)置管腳為UART功能,選擇UART通道的工作模式為中斷模式或者DMA模式,設(shè)置好之后,往某個寄存器中寫入數(shù)據(jù)即可發(fā)送,讀取某寄存器即可得到接收的數(shù)據(jù),可以通過查詢狀態(tài)寄存器或者設(shè)置中斷來獲知數(shù)據(jù)是否已經(jīng)發(fā)送完畢,是否已經(jīng)接收到數(shù)據(jù)。
1. 配置相應(yīng)I/O口的寄存器,將所涉及的UART通道管腳設(shè)置為UART功能。
比如UART通道0中,GPH2,GPH3分別用作TXD0,RXD0,要使用UART通道0時,先設(shè)置GPHCON寄存器將GPH2,GPH3引腳功能設(shè)置為TXD0,RXD0。
2. UBRDIVn寄存器,用于設(shè)置波特率。
3. ULCONn寄存器,設(shè)置傳輸格式。
4. UCONn寄存器,用于選擇UART的時鐘源,設(shè)置UART中斷方式等等。
5. UFCONn寄存器,UFSTATn寄存器。UFCONn寄存器,用于設(shè)置是否使用FIFO,設(shè)置各FIFO的觸發(fā)閾值,可以通過調(diào)協(xié)UFCONn寄存器來復(fù)位各個FIFO。讀取UFSTAT n寄存器可以知道各個FIFO是否已滿,其中有多少數(shù)據(jù)。如果不使用FIFO時,可以認(rèn)為FIFO的深度為1,如果使用FIFO時,S3C2440的FIFO深度為64。
6. UMCONn寄存器,UMSTATn寄存器,用于流量控制。
7. UTRSTATn寄存器用來表明數(shù)據(jù)是否已經(jīng)發(fā)送完畢,是否已經(jīng)接收到數(shù)據(jù)。
以上各個寄存的配置方法可以參考數(shù)據(jù)手冊。
8. USERSTATn寄存器,用于表示各種錯誤的發(fā)生。
9. UTXHn寄存器,CPU將數(shù)據(jù)寫入到這個寄存器,UART即會將它保存到緩沖區(qū)中,并自動發(fā)送出去。
10. URXHn寄存器,當(dāng)UART接收到數(shù)據(jù)時,CPU讀取這個寄存器,即可獲得數(shù)據(jù)。