歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

S3C2410中文芯片手冊-11.串口

11 UART

Overview

S3C2410x 提供3個獨立的異步串行I/O接口,每一個都可以工作在中斷或是 DMA 模式。UART 最高可以支持230.

4K bps波特率,通過使用系統時鐘。如果有外部設備給 UART 提供 UCLK, 那麼 UART 可以達到更高的速度。每個 UART 通道包含2個16個字節的 FIFO 用於接收和發送數據。

S3C2410 的 UART 包括 可編程波特率,infra-red 發送/接收, 1~2個停止位, 5~8位數據位和奇偶校驗。

每個 UART 由波特率發生器、發送器、接收器和控制單元組成,如圖11-1所示。波特率發生器可以由 PCLK 或是 UCLK 提供時鐘。數據發送器和接收器包含16字節的 FIFO 和數據緩沖器。數據首先被寫入 FIFO 中,然後在發送前被拷貝到發送數據緩沖器中。這些數據之後被數據發送引腳(TxDn)發送。同時從接收引腳接收數據,然後將數據從緩沖器復制到 FIFO。

Featrues

  • RxD0, TxD0, RxD1, TxD1, RxD2 和 TxD2 帶有 DMA 和中斷操作。
  • UART 通道 0,1和2,帶有 IrDA 1.0 & 16-byte FIFO
  • UART 通道 0和1,帶有 nRTS0,nCTS0,nRTS1 和 nCTS1
  • 支持硬件握手發送/接收

UART Operation

接下來的章節描述了 UART 的操作,包括數據發送、數據接收、中斷產生、波特率產生,回環模式,紅外模式和自動流控制。

Data Transmission

傳送的數據結構是可編程的。它包括一位起始位、5~8位數據位、一位可選的奇偶校驗位和1~2位停止位,這些都可以通過線性控制寄存器(ULCONn)來指定。發送器也可以通過強制串行口在一幀發送數據時間裡輸出邏輯0來產生中止條件。這塊發送中止信號出現在發送字發送完之後。在發送中止信號之後,將繼續發送數據到 Tx 的 FIFO 中(Tx 將保持寄存器對於 Non-FIFO 模式來說)。

Data Reception

與發送一樣,接收到的數據結構同樣是可編程的。它包括一位起始位、5~8位數據位、一位可選的奇偶校驗位和1~2位停止位在線性控制寄存器中(ULCONn)。接收器可以探測 overrun error,parity error,frame error和break condition,每種錯誤都有相應的錯誤標志位。

  • overrun error 代表在舊數據被讀取前新數據已經將舊數據重寫。
  • parity error 代表接收器已經探測到不期望的奇偶校驗值。
  • frame error 代表接收到的數據沒有默認的停止位。
  • break condition 代表 RxDn 輸入保持在邏輯0的時間比一幀發送數據的時間長

當在3個字長時間內沒有接收到任何數據並且 Rx FIFO 在 FIFO 模式下非空,將會產生接收超時(Receive time-out condition)。

Auto Flow Control(AFC)

S3C2410X 的串口0和串口1支持自動流控制,並帶有 nRTS 和 nCTS信號。如果用戶想連接串口到終端,那麼需要在 UMCONn 寄存器中取消自動流控制位並且用軟件控制 nRTS 信號。

在 AFC 模式中, nRTS 根據接收器的狀態和 nCTS 信號來控制發送器的操作。當 nCTS 信號被激活時(在 AFC 中,nCTS 代表其他串口的 FIFO 已經准備好接收數據),串口的發送器發送 FIFO 中的數據。在接收數據前,如果接收器的 FIFO 有超過兩個字節的空閒,那麼 nRTS 信號將被激活;如果接收器的 FIFO 中空閒少於一個字節時, nRTS 信號將停止激活(在 AFC 模式中, nRTS 代表它本身的接收FIFO 已經准備好接收數據)。

NOTE: 串口2不支持 AFC 功能,因為 S3C2410X 沒有 nRTS2 和 nCTS2。

Example of Non Auto-Flow control(controlling nRTS and nCTS by software)

Rx operation with FIFO

  1. 選擇接收模式(Interrupt or DMA mode)。
  2. 在 UFSTATn 寄存器中檢查 Rx FIFO 中當前的字節數。如果數值少於15,用戶需要將 UMCONna[0] 的值設為1(激活 nRTS);如果大於等於15,用戶應把值設為0(取消 nRTS)。
  3. 重復執行第二步。

Tx operation with FIFO

  1. 選擇發送模式(Interrupt or DMA mode)。
  2. 檢查 UMSTATn[0] 的值。如果值為1(激活 nCTS),用戶可以將數據寫到 Tx FIFO 寄存器中。

RS-232C interface

如果用戶想把串口連接到終端上, nRTS, nCTS, nDSR, nDTR, DCD 和 nRI 信號是必須的。由於 AFC 不支持 RS-232C 接口,如果用戶要使用這種接口,需要通過軟件控制通用 I/O 接口來控制這些信號。

Interrupt/DMA Request Genration

S3C2410X 的每個串口有7種狀態:Overrun error, Parity error, Frame error, Break, Receive buffer data ready, Transmit buffer empty 和 Transmit shifter empty。所有這些狀態都通過相應的串口狀態寄存器(UTRSTATn/UERSTATn)表現出來。

Overrun error, parity error, frame error 和 break condition 是接收錯誤狀態,它們都能引發接收錯誤狀態中斷請求,如果接收錯誤狀態中斷使能位(receive-error-status-interrupt-enable)被設置成1在 UCONn 中。當接收錯誤狀態中斷請求(receive-error-status-interrupt-request)被檢測到,導致請求的信號可以通過讀取 UERSTSTn 的值來被識別。

如果在接收模式下控制寄存器(UCONn)中的值被設為1(Interrupt request or polling mode),在 FIFO 模式下,當接收器將接收緩沖器中的數據發送到接收 FIFO 中並且接收到的數據量達到 Rx FIFO 的觸發等級,Rx 中斷將會產生。
在 Non-FIFO 模式中,如果設置為 Interrupt request and polling 模式,當把接收緩沖器中的數據發送到接收保持寄存器將會引起 Rx 中斷。

如果在發送模式下控制寄存器被設置為 Interrupt request or polling 模式,當發送器將發送 FIFO 中的數據發送到發送緩沖器並且發送 FIFO 中剩余的數據量達到 Tx FIFO 的觸發等級, Tx 中斷將會產生。
在 Non-FIFO 模式中,如果設置為 Interrupt request and polling 模式,當把發送保持寄存器中的數據發送到發送緩沖器時將會引起 Tx 中斷。

如果控制寄存器被設為 DMAn request 模式,那麼在上面提到的發送模式和接收模式中,DMAn 請求將會取代 Rx 或 Tx 中斷。

UART Error Status FIFO

除了 Rx FIFO 寄存器,串口還有錯誤狀態隊列(error status FIFO)。這個錯誤狀態隊列記錄了 FIFO 寄存器中接收到的哪個數據是錯誤的。當帶有錯誤的數據准備被讀出時,錯誤中斷將會產生。為了清除錯誤狀態隊列(error status FIFO),需要讀取 URXHn 和 UERSTATn 寄存器。

For example

假設 UART Rx FIFO 連續地收到了 A,B,C,D 和 E 五個字符,並且當接收到 ‘B’ 時發生 frame error,接收到 ‘D’ 時發生 parity error。

實際上串口接收到錯誤將不會產生任何錯誤中斷,因為收到的錯誤字符還沒有被讀出來。當錯誤字符被讀出時發生錯誤中斷。

Figure 11-3 shows the UART receiving the five characters including the two errors.

TimeSequence FlowError InterruptNote #0 When no character is read out - - #1 A,B,C,D,and E is received - - #2 After A is read out The frame error (in B) interrupt occurs. The 'B' has to be read out #3 After B is read out - - #4 After C is read out The parity error (in D) interrupt occurs. The 'D' has to be read out #5 After D is read out - - #6 After E is read out - -

Baud-Rate Generation

每個串口的波特率發生器給發送器和接收器提供串行時鐘。波特率發生器的時鐘源可以選擇 S3C2410S 的內部系統時鐘或 UCLK。換句話說,分頻因子是可以選擇的通過設置 UCONn 中的時鐘選項。波特率時鐘是通過在串口波特率分頻因子寄存器(UART baud-rate divisor register) UBRDIVn 中設置16位的分頻因子來分頻時鐘源(PCLK or UCLK)。 UBRDIVn 可以通過下面的公式確定:

UBRDIVn = (int)(PCLK/(bps * 16)) - 1

 

分頻因子的范圍1~(2^16^-1)。

為了准確地操作串口,S3C2410X 還支持使用 UCLK 作為分頻源。
如果 S3C2410X 使用外部串口設備或系統提供的額 UCLK,那麼串口的串行時鐘將和 UCLK 同步。因此用戶可以更加准確的操作串口。UBRDIVn 可以通過下面公式確定:

UBRDIVn = (int)(UCLK/(bps * 16)) - 1

 

分頻因子的范圍1~(2^16^-1),並且 UCLK 應該比 PCLK 小。

For example:如果波特率是115200 bps 並且 PCLK 和 UCLK 是 40 MHz, UBRDIVn 如下確定:

UBRDIVn = (int)(40000000/(115200 * 16)) - 1
        = (int)(21.7) - 1
        = 21 - 1 = 20

UART baud-rate generator error tolerance

串口10位數據的時間錯誤(time error)應該小於 1.87%(3/160)

	tUPCLK = (UBRDIVn + 1) * 16 * 10 / PCLK
        tUPCLK:Real UART 10-bit time

	tUEXACT = 10 / baud-rate
        tUEXACT:Ideal UART 10-bit time

	UART error = (tUPCLK - tUEXACT) / tUEXACT * 100%

Loopback Mode

S3C2410X 的串口提供了一個測試模式能夠幫助隔離通信線路中的錯誤,叫做回環模式。這個模式能開啟串口中 RXD 和 TXD 的連接。因此在這個模式中,發送的數據能夠經過自身的 RXD 接收到接收器中。這個特性可以允許處理器檢驗內部發送和接收數據的頻道路徑。這個模式可以在串口控制寄存器(UCONn)中回環位(loopback bit)進行設置。

Break Condition

Break 信號被定義為一幀發送數據時間內輸出的發送數據中連續的低電平信號。

Infra-Red(IR) Mode

S3C2410X 的串口模塊可以通過設置串口線性控制器(ULCONn)的紅外模式位(Infra-red-mode bit)來支持紅外發送和接收。 Figure 11-4 舉例說明如何執行 IR 模式。

在 IR 發送模式中,發送脈沖發出正常的串行發送率 3/16;在 IR 接收模式中,接收器一定要在 3/16 脈沖期間去識別出 0 值。




UART SPECIAL REGISTERS

UART LINE CONTROL REGISTER

在串口模塊中有3個串口線性控制寄存器,分別是 ULCON0,ULCON1 和 ULCON2。

UART CONTROL REGISTER

在串口模塊中有3個串口控制寄存器,分別是 UCON0,UCON1 和 UCON2。

UART CONTROL REGISTER(CONTINUED)

NOTE: 在帶有 FIFO 的 DMA 模式下,當串口沒有達到 FIFO 的觸發等級並且在3個字的時間內(接收超時)沒有收到數據, Rx 中斷將會產生同時用戶應該檢查 FIFO 的狀態並把剩下的數據讀完。

UART FIFO CONTROL REGISTER

在串口模塊中有3個串口 FIFO 控制寄存器,分別是 UFCON0,UFCON1 和 UFCON2。

NOTE: 在帶有 FIFO 的 DMA 模式下,當串口沒有達到 FIFO 的觸發等級並且在3個字的時間內(接收超時)沒有收到數據, Rx 中斷將會產生同時用戶應該檢查 FIFO 的狀態並把剩下的數據讀完。

UART MODEM CONTROL REGISTER

在串口模塊中有2個串口終端控制寄存器,分別是 UMCON0 和 UMCON1。

NOTE:串口2不支持 AFC 功能,因為 S3C2410X 沒有 nRTS2 和 nCTS2。

UART TX/RX STATUS REGISTER

在串口模塊中有3個串口 TX/RX 狀態寄存器,分別是 UTRSTAT0,UTRSTAT1 和 UTRSTAT2。

UART ERROR STATUS REGISTER

在串口模塊中有3個串口 Rx 錯誤狀態寄存器,分別是 UERSTAT0,UERSTAT1 和 UERSTAT2。

NOTE:當串口錯誤狀態寄存器被讀過之後,這些位將會自動被清0。

UART FIFO STATUS REGISTER

在串口模塊中有3個串口 FIFO 狀態寄存器,分別是 UFSTAT0,UFSTAT1 和 UFSTAT2。

UART MODEM STATUS REGISTER

在串口模塊中有2個串口終端狀態寄存器,分別是 UMSTAT0 和 UMSTAT1。

UART TRANSMIT BUFFER REGISTER(HOLDING REGISTER & FIFO REGISTER)

在串口模塊中有3個串口發送緩沖寄存器,分別是 UTXH0,UTXH1 和 UTXH2。
UTXHn 有8位發送數據。

NOTE:(L):The endian mode is Little endian.
     (B):The endian mode is Big endian.

UART RECEIVE BUFFER REGISTER(HOLDING REGISTER & FIFO REGISTER)

在串口模塊中有3個串口接收緩沖寄存器,分別是 URXH0,URXH1 和 URXH2。
URXHn 有8位接收數據。

NOTE:當發生 overrun error 時,需要讀取 URXHn 寄存器。否則,即使清空 UERSTATn 中的 overrun 標志位,當再次接收到數據時同樣將產生 overrun error。

UART BAUD RATE DIVISOR REGISTER

在串口模塊中有3個串口波特率分頻寄存器,分別是 UBRDIV0,UBRDIB1 和 UBRDIV2。
存儲在波特率分頻寄存器(UBRDIVn)中的值如下確定串行 Tx/Rx 的時鐘頻率:

     UBRDIVn = (int)(PCLK / (bps * 16)) - 1
     or
     UBRDIVn = (int)(UCLK / (bps * 16)) - 1

分頻因子的范圍1~(2^16^-1),並且 UCLK 應該比 PCLK 小。

For example:如果波特率是115200 bps 並且 PCLK 和 UCLK 是 40 MHz, UBRDIVn 如下確定:

UBRDIVn = (int)(40000000/(115200 * 16)) - 1
        = (int)(21.7) - 1
        = 21 - 1 = 20

   
Copyright © Linux教程網 All Rights Reserved