異步串口通信
概述 S3C2410的UART提供3個(gè)獨(dú)立的異步串行通信端口,每個(gè)端口可以基于中斷或者DMA進(jìn)行操作。換句話說(shuō),UART控制器可以在CPU和UART之間產(chǎn)生一個(gè)中斷或者DMA請(qǐng)求來(lái)傳輸數(shù)據(jù)。UART在系統(tǒng)時(shí)鐘下運(yùn)行可支持高達(dá)230.4K的波特率,如果使用外部設(shè)備提供的UEXTCLK,UART的速度還可以更高。每個(gè)UART通道各含有兩個(gè)16位的接收和發(fā)送FIFO。 S3C2410的UART包括可編程的波特率,紅外 接收/發(fā)送,一個(gè)或兩個(gè)停止位插入,5-8位數(shù)據(jù)寬度和奇偶校驗(yàn)。 每個(gè)UART包括一個(gè)波特率發(fā)生器、一個(gè)發(fā)送器、一個(gè)接收器和一個(gè)控制單元,如圖11-1所示。波特率發(fā)生器的輸入可以是PCLK或者UEXTCLK。發(fā)送器和接收器包含16位的FIFO和移位寄存器,數(shù)據(jù)被送入FIFO,然后被復(fù)制到發(fā)送移位寄存器準(zhǔn)備發(fā)送,然后數(shù)據(jù)按位從發(fā)送數(shù)據(jù)引腳TxDn輸出。同時(shí),接收數(shù)據(jù)從接收數(shù)據(jù)引腳RxDn按位移入接收移位寄存器,并復(fù)制到FIFO。
特性 - RxD0, TxD0, RxD1, TxD1, RxD2, 和TxD2基于中斷或者DMA操作
- UART Ch 0, 1, 和 2 具有 IrDA 1.0 & 16 字節(jié) FIFO
- UART Ch 0 和 1 具有 nRTS0, nCTS0, nRTS1, 和 nCTS1
- 支持發(fā)生/接收握手
圖11-1 UART方框圖 串口操作 下述部分描述了UART的一些操作,包括數(shù)據(jù)發(fā)送、數(shù)據(jù)接收、中斷產(chǎn)生、波特率發(fā)生、loop-back模式、紅外模式和自動(dòng)流控制。
數(shù)據(jù)發(fā)送 發(fā)送數(shù)據(jù)的幀結(jié)構(gòu)是可編程的,它由1個(gè)起始位、5-8個(gè)數(shù)據(jù)位、1個(gè)可選的奇偶位和1-2個(gè)停止位組成,這些可以在線控制寄存器ULCONn中設(shè)定。接收器可以產(chǎn)生一個(gè)斷點(diǎn)條件——使串行輸出保持1幀發(fā)送時(shí)間的邏輯0狀態(tài)。當(dāng)前發(fā)送字被完全發(fā)送出去后,這個(gè)斷點(diǎn)信號(hào)隨后發(fā)送。斷點(diǎn)信號(hào)發(fā)送之后,繼續(xù)發(fā)送數(shù)據(jù)到Tx FIFO(如果沒(méi)有FIFO則發(fā)送到Tx保持寄存器)。
數(shù)據(jù)接收 與數(shù)據(jù)發(fā)送一樣,接收數(shù)據(jù)的幀格式也是可編程的。它由1個(gè)起始位、5-8個(gè)數(shù)據(jù)位、1個(gè)可選的奇偶位和1-2個(gè)停止位組成,這些可以在線控制寄存器ULCONn中設(shè)定。接收器可以探測(cè)到溢出錯(cuò)誤和幀錯(cuò)誤。 - 溢出錯(cuò)誤:在舊數(shù)據(jù)被讀出來(lái)之前新的數(shù)據(jù)覆蓋了舊的數(shù)據(jù)
- 幀錯(cuò)誤: 接收數(shù)據(jù)沒(méi)有有效的停止位
當(dāng)在3個(gè)字時(shí)間(與字長(zhǎng)度位的設(shè)置有關(guān))內(nèi)沒(méi)有接收到任何數(shù)據(jù)并且Rx FIFO非空時(shí),將會(huì)產(chǎn)生一個(gè)接收超時(shí)條件。
自動(dòng)流控制(AFC) UART0和UART1通過(guò)nRTS and nCTS信號(hào)支持自動(dòng)流控制,例如連接到外部UART時(shí)。如果用戶(hù)希望將UART連接到一個(gè)MODEM,可以在UMCONn寄存器中禁止自動(dòng)流控位,并且通過(guò)軟件控制nRTS信號(hào)。 在AFC時(shí), nRTS 由接收器的狀態(tài)決定,而nCTS信號(hào)控制發(fā)送器的操作。只有當(dāng)nCTS信號(hào)有效的時(shí)候(在AFC時(shí),nCTS意味著其它UART的FIFO準(zhǔn)備接收數(shù)據(jù))UART發(fā)送器才會(huì)發(fā)送FIFO中的數(shù)據(jù)。在UART接收數(shù)據(jù)之前,當(dāng)它的接收FIFO多于2字節(jié)的剩余空間時(shí)nRTS必須有效,當(dāng)它的接收FIFO少于1字節(jié)的剩余空間時(shí)nRTS必須無(wú)效(nRTS意味著它自己的接收FIFO開(kāi)始準(zhǔn)備接收數(shù)據(jù))。 圖11-2 UART AFC接口 注:UART2不支持AFC功能,因?yàn)镾3C2410沒(méi)有nRTS2 和 nCTS2。 無(wú)AFC的例子 通過(guò)FIFO操作Rx - 選擇接收模式(中斷還是DMA模式)。
- 檢查UFSTATn寄存器中Rx FIFO的值。如果值小于15,用戶(hù)必須將UMCONn[0]置1(nRTS生效),如果大于等于15,用戶(hù)必須將UMCONn[0]清0(nRTS無(wú)效)。
- 重復(fù)第2步。
通過(guò)FIFO操作Tx - 選擇發(fā)送模式(中斷還是DMA模式)。
- 檢查UMCONn[0]的值,如果為1,寫(xiě)數(shù)據(jù)到Tx FIFO
RS-232C接口 如果希望將UART連接到MODEM,nRTS, nCTS, nDSR, nDTR, DCD 和nRI信號(hào)是必須的。這種情況下用戶(hù)可以通過(guò)GPIO控制這些信號(hào)因?yàn)锳FC不支持RS-232C接口。
中斷/DMA請(qǐng)求的產(chǎn)生 每個(gè)UART有5個(gè)狀態(tài)(Tx/Rx/Error)信號(hào):溢出錯(cuò)誤、幀錯(cuò)誤、接收緩沖滿(mǎn)、發(fā)送緩沖空和發(fā)送移位寄存器空。這些狀態(tài)體現(xiàn)在UART狀態(tài)寄存器中的相關(guān)位(UTRSTATn/UERSTATn)。 溢出錯(cuò)誤和幀錯(cuò)誤與接收錯(cuò)誤狀態(tài)相關(guān),每個(gè)錯(cuò)誤可以產(chǎn)生一個(gè)接收錯(cuò)誤狀態(tài)中斷請(qǐng)求,如果控制寄存器UCONn中的receive-error-status-interrupt-enable位被置1的話。如果探測(cè)到一個(gè)receive-error-status-interrupt-enable位,通過(guò)讀UERSTSTn的值可以識(shí)別這一中斷請(qǐng)求。 控制寄存器UCONn的接收器模式為1(中斷或者循環(huán)檢測(cè)模式):當(dāng)接收器在FIFO模式下將一個(gè)數(shù)據(jù)從接收移位寄存器寫(xiě)入FIFO時(shí),如果接收到的數(shù)據(jù)到達(dá)了Rx FIFO的觸發(fā)條件,Rx中斷就產(chǎn)生了。在無(wú)FIFO模式下,每次接收器將數(shù)據(jù)從移位寄存器寫(xiě)入接收保持寄存器都將產(chǎn)生一個(gè)RX中斷請(qǐng)求。 如果控制寄存器的接收和發(fā)送模式選擇為DMAn請(qǐng)求模式,在上面的情況下則是DMAn請(qǐng)求發(fā)生而不是RX/Tx中斷請(qǐng)求產(chǎn)生。 UART錯(cuò)誤狀態(tài)FIFO UART除了Rx FIFO外還有錯(cuò)誤狀態(tài)FIFO。錯(cuò)誤狀態(tài)FIFO指示接收到的哪個(gè)數(shù)據(jù)有錯(cuò)誤。只有當(dāng)有錯(cuò)誤的數(shù)據(jù)準(zhǔn)備讀出的時(shí)候才會(huì)產(chǎn)生錯(cuò)誤中斷。要清除錯(cuò)誤狀態(tài)FIFO,URXHn和UERSTATn必須被讀出。 例如:假設(shè)UART Rx FIFO順序接收到ABCD4個(gè)字符,在接收B的時(shí)候發(fā)生了幀錯(cuò)誤。事實(shí)上UART接收錯(cuò)誤并未產(chǎn)生任務(wù)錯(cuò)誤中斷,因?yàn)殄e(cuò)誤的數(shù)據(jù)B還沒(méi)有被讀出,只有當(dāng)讀B字符的時(shí)候才會(huì)發(fā)生錯(cuò)誤中斷。圖11-3描述了這一例子。
波特率發(fā)生器 每個(gè)UART的波特率發(fā)生器提供串行時(shí)鐘給接收器和發(fā)送器。波特率發(fā)生器的時(shí)鐘源可以選擇呢不系統(tǒng)時(shí)鐘或者UEXTCLK。換句話說(shuō),通過(guò)設(shè)置UCONn的時(shí)鐘選擇被除數(shù)是可選的。波特率時(shí)鐘通過(guò)對(duì)時(shí)鐘源(PCLK OR UEXTCLK)進(jìn)行16分頻,然后進(jìn)行一個(gè)16位的除數(shù)分頻得到,這個(gè)分頻數(shù)由波特率除數(shù)寄存器UBRDIVn指定。UBRDIVn可由下式得出: UBRDIVn = (int)(PCLK/(bps * 16) ) -1 此除數(shù)應(yīng)該在1-(2的16方-1)之間。 為了UART的精確性,S3C2410還支持UEXTCLK作為被除數(shù)。 如果使用UEXTCLK(由外部UART設(shè)備或者系統(tǒng)提供),串行時(shí)鐘能夠精確地和UEXTCLK同步,因此用戶(hù)可以得到更精確的UART操作,UBRDIVn由下式?jīng)Q定: UBRDIVn = (int)(UEXTCLK / (bps x 16) ) –1 此除數(shù)應(yīng)該在1-(2的16方-1)之間,且UEXTCLK要比PCLK低。 例如,如果波特率為115200bps,而PCLK或者UEXTCLK為40MHz,則UBRDIVn為: UBRDIVn = (int)(40000000/(115200 x 16)) -1 = (int)(21.7) -1 = 21 -1 = 20
波特率錯(cuò)誤容差 UART的幀錯(cuò)誤應(yīng)該少于1.87%(3/160)。 UART Frame error should be less than 1.87%(3/160). tUPCLK = (UBRDIVn + 1) x 16 x 1Frame / PCLK tUPCLK : Real UART Clock tUEXACT = 1Frame / baud-rate tUEXACT : Ideal UART Clock UART error = (tUPCLK – tUEXACT) / tUEXACT x 100% 注意:1、1幀=起始位+數(shù)據(jù)位+奇偶位+停止位 2、在特定條件下,波特率上限可達(dá)921.6K,例如當(dāng)PCLK為60MHZ時(shí),可以使用921.6K的波特率而誤差為1.69%
loop-back模式 為了識(shí)別通訊連接中的故障,UART提供了一種叫l(wèi)oop-back模式的測(cè)試模式。這種模式結(jié)構(gòu)上使能了UART的TXD和RXD連接,因此發(fā)送數(shù)據(jù)被接收器通過(guò)RXD接收。這一特性允許處理器檢查每個(gè)SIO通道的內(nèi)部發(fā)送到接收的數(shù)據(jù)路徑?梢酝ㄟ^(guò)設(shè)置UART控制寄存器UCONn中的loopback位選擇這一模式。
紅外(IR)模式 UART支持紅外 (IR)接收和發(fā)送,可以通過(guò)設(shè)置UART線控制寄存器ULCONn的Infra-red-mode位來(lái)進(jìn)入這一模式。圖11-4闡述了如何實(shí)現(xiàn)IR模式。 在IR發(fā)送模式下,發(fā)送脈沖的比例是3/16——正常的發(fā)送比率(當(dāng)發(fā)送數(shù)據(jù)位為0的時(shí)候);在IR接收模式下,接收器必須檢測(cè)3/16的脈沖來(lái)識(shí)別0值(見(jiàn)圖11-6和11-7所示的幀時(shí)序)。
UART SFR UART線控制寄存器ULCONn 有3個(gè)UART線控制寄存器:ULCON0, ULCON1, and ULCON2
UART控制寄存器UCONn 有3個(gè)UART控制寄存器:UCON0, UCON1, and UCON2 注意:DMA接收有FIFO模式下,當(dāng)UART沒(méi)有達(dá)到FIFO觸發(fā)條件而且3個(gè)字時(shí)間沒(méi)有接收到數(shù)據(jù)時(shí),Rx中斷會(huì)產(chǎn)生,用戶(hù)應(yīng)該檢查FIFO的狀態(tài)并讀出其它數(shù)據(jù)。
UART FIFO控制寄存器UFCONn
波特率除數(shù)寄存器UBRDIVn 有3個(gè)波特率除數(shù)寄存器:UBRDIV0,UBRDIV1,UBRDIV2,存儲(chǔ)于里面的值用于設(shè)置串口波特率: UBRDIVn = (int)(PCLK / (bps x 16) ) –1 或 UBRDIVn = (int)(UEXTCLK / (bps x 16) ) –1 此除數(shù)應(yīng)該在1-(2的16方-1)之間,且UEXTCLK要比PCLK低。 例如,如果波特率為115200bps,而PCLK或者UEXTCLK為40MHz,則UBRDIVn為: UBRDIVn = (int)(40000000/(115200 x 16)) -1 = (int)(21.7) -1 = 21 -1 = 20 |