Mini2440裸機開發之串列埠UART
一、S3C2440上的UART
1.1 串列埠概述
串列埠的使用位於S3C2440晶片手冊的第11章。S3C2440A 的通用非同步收發器(UART)配有3 個獨立非同步序列I/O埠,每個都可以是基於中斷或基於DMA 模式的操作。換句話說,UART 可以通過產生中斷或DMA 請求來進行CPU和UART之間的資料傳輸。 UART 通過使用系統時鐘可以支援最高115.2Kbps 的位元率。如果是外部器件提供UEXTCLK 的UART,則UART 可以執行在更高的速度。每個UART 通道包含兩個的64 位元組的FIFO 給傳送和接收。
S3C2440A 的UART 包括了可程式設計波特率,紅外(IR)傳送/接收,插入1 個或2 個停止位,5 位、6 位、7 位 或8 位的資料寬度以及奇偶校驗。
1.2 特性
- 基於DMA 或基於中斷操作的RxD0,TxD0,RxD1,TxD1,RxD2 和TxD2;
- UART 通道0,1 和2 帶IrDA 1.0 和64 位元組FIFO;
- UART 通道0 和1 帶nRTS0,nCTS0,nRTS1 和nCTS1;
- 支援握手傳送/接收;
1.3 串列埠結構
每個UART 包含一個波特率發生器、傳送器、接收器和一個控制單元。波特率發生器可以由 PCLK、FCLK/n 或UEXTCLK(外部輸入時鐘)時鐘驅動。傳送器和接收器包含了64 位元組FIFO 和資料移位器。 將資料寫入到FIFO 接著在傳送前複製到傳送移位器中。隨後將在傳送資料引腳(TxDn)移出資料。與此同時從接收資料引腳(RxDn)移入收到的資料,接著從移位器複製到FIFO。
1.4 串列埠資料傳送
可程式設計傳送資料幀。由1 個起始位、5 至8 位資料位、1 個可選奇偶校驗位以及1 至2 個停止位組成,是由行控制暫存器(ULCONn)指定。
傳送器也可以產生單幀傳送期間強制序列輸出為邏輯0狀態的斷點狀態。此模組在完成傳送當前傳送字後傳送斷點訊號。在發出斷點訊號後,其不斷髮送資料到Tx FIFO(非FIFO 模式情況下Tx 保持暫存器)中。
1.5 串列埠資料接收
與傳送類似,接收資料幀也是可程式設計的。由1個起始位、5至8位資料位、1 個可選奇偶校驗位以及1至2個停止位組成,是由行控制暫存器(ULCONn)指定。
接收器能夠檢測出溢位(overrun)錯誤、奇偶校驗錯誤、幀錯誤和斷點狀態,每個都可以設定一個錯誤標誌。
- 溢位錯誤表明新資料在讀出舊資料前覆蓋了舊資料;
- 奇偶校驗錯誤表明接收器檢測出一個非預期奇偶校驗欄位;
- 幀錯誤表明接收到的資料沒有有效的結束位;
- 斷點狀態表明RxDn 的輸入保持為邏輯0 狀態的時間長於單幀傳輸時間。 當其在3 字時間期間(此間隔在字寬位的設定隨後)並且在FIFO 模式中Rx FIFO 為非空時不接收任何資料時 發生接收超時狀態。
1.6 串列埠波特率
每個UART 的波特率發生器為傳送器和接受器提供序列時鐘。波特率發生器的源時鐘可以選擇S3C2440A 的 內部系統時鐘或UEXTCLK。換句話說,分頻由設定UCONn 的時鐘選項選擇。
波特率時鐘是通過16 和由UART波特率分頻暫存器(UBRDIVn)指定的16 位分頻係數來分頻源時鐘(PCLK,FCLK/n 或UEXTCLK)產生的。 UBRDIVn 由下列表達式決定:
$$UBRDIVn=(int)\frac{UART時鐘}{波特率 \times 16} - 1$$
其中UART時鐘:PCLK、FCLK/n或UEXTCLK.
例如:如果波特率位115200bps,並且UART時鐘位40MHz,則UBRDIVn為:
$$UBRDIVn=(int)\frac{40000000}{115200 \times 16} - 1 = 21$$
二、UART相關暫存器
2.1 UART線路控制暫存器ULCONx
在UART 模組中包含了ULCON0、ULCON1 和ULCON2,設定資料長度,開始位,停止位,奇偶校驗相關。
暫存器 | 地址 | R/W | 描述 | 復位值 |
ULCON0 | 0x50000000 | R/W | UART0線路控制暫存器 | 0x00 |
ULCON1 | 0x50004000 | R/W | UART1線路控制暫存器 | 0x00 |
ULCON2 | 0x50008000 | R/W | UART2線路控制暫存器 | 0x00 |
暫存器位資訊:
ULCONn | 位 | 描述 | 初始狀態 |
保留 | [7] | - | 0 |
紅外模式 | [6] |
決定是否使用紅外模式 0:普通模式 1:紅外Tx/Rx模式 |
0 |
奇偶校驗模式 | [5:3] |
指定在UART 傳送和接收操作期間奇偶校驗產生和檢查的型別 0xx:無奇偶校驗位 100:奇校驗 101:偶校驗 110:固定/檢查奇偶校驗為1 111:固定/檢查奇偶校驗為0 |
000 |
停止位數 | [2] |
指定用於結束幀訊號的停止位的個數 0:每幀1個停止位 1:每幀2個停止位 |
0 |
字長度 | [1:0] |
指出每幀用於傳送或接收的資料位的個數 00:5位 01:6位 10:7位 11:8位 |
00 |
2.2UART控制暫存器UCONx
在UART 模組中包含了UCON0、UCON1 和UCON2,選擇設定UART時鐘,中斷型別,FIFO狀態等。
暫存器 | 地址 | R/W | 描述 | 復位值 |
UCON0 | 0x50000004 | R/W | UART0控制暫存器 | 0x00 |
UCON1 | 0x50004004 | R/W | UART1控制暫存器 | 0x00 |
UCON2 | 0x50008004 | R/W | UART2控制暫存器 | 0x00 |
暫存器位資訊:
UCONn | 位 | 描述 | 初始狀態 |
FCLK分頻器 | [15:12] |
當UART 時鐘源選擇了FCLK/n 時的分頻器值。n由UCON0[15:12]、 UCON2[15]為FCLK/n 時鐘使能/禁止位:0 = 禁止;1 = 使能; 設定n為7 至21 時,則使用UCON0[15:12]; 設定n為22 至36 時,則使用UCON0[15:12]; 設定n為37 至43 時,則使用UCON0[14:12]。
UCON0 的情況:UART 時鐘 = FCLK / (分頻器+6);分頻器>0。 1:UART 時鐘 = FCLK/7; 2:UART 時鐘 = FCLK/8; 3:UART 時鐘 = FCLK/9; …… 15:UART 時鐘 = FCLK/21。
UCON0,UCON2 必須為0。 1:UART 時鐘 = FCLK/22; 2:UART 時鐘 = FCLK/23; 3:UART 時鐘 = FCLK/24; …… 15:UART 時鐘 = FCLK/36
UCON2 的情況:UART 時鐘 = FCLK / (分頻器+36);分頻器>0。 UCON0,UCON1 必須為0。 1:UART 時鐘 = FCLK/37; 2:UART 時鐘 = FCLK/38; 3:UART 時鐘 = FCLK/39; …… 15:UART 時鐘 = FCLK/43 |
0000 |
時鐘選擇 | [11:10] |
選擇PCLK,UEXTCLK 或FCLK/n 給UART 波特率。 00:PCLK 10:PCLK 01:UEXTCLK 11:FCLK/n |
00 |
Tx中斷型別 | [9] |
中斷請求型別 0:脈衝(非FIFO模式中Tx緩衝器一變為空或FIFO 模式中達到Tx FIFO 觸發深度就請求中斷) 1:電平(當非FIFO模式中Tx緩衝器為空或FIFO模式中達到Tx FIFO觸發深度時請求中斷) |
0 |
Rx中斷型別 | [9] |
中斷請求型別 |
0 |
Rx超時使能 | [7] |
當使能了UART FIFO 使能/禁止Rx 超時中斷。該中斷是一個接收中斷 0: 禁止 1:使能 |
0 |
Rx錯誤狀態中斷使能 | [6] |
異常時允許UART 產生中斷,如接收操作期間的斷點、幀錯誤、奇偶錯誤或溢位錯誤。 0:不產生接收錯誤狀態中斷 1:產生接收錯誤狀態中斷 |
0 |
環回模式 | [5] |
設定環回模式為1 使得UART 進入環回模式。此模式只用於測試。 0: 正常操作 1:環回模式 |
0 |
發出斷點訊號 | [4] |
設定此位使得UART 在單幀期間發出一個斷點訊號。此位在發出斷點訊號後將自動清零。 0:正常傳輸 1:發出斷點訊號 |
0 |
傳送模式 | [3:2] |
確定哪個功能能夠將Tx資料寫入UART 傳送緩衝暫存器。 (UART Tx 啟用/禁用) 00:禁止 01:中斷請求或輪詢模式 10:DMA0 請求(僅適用於 UART0) DMA3 請求(僅適用於 UART2) 11:DMA1 請求(僅適用於 UART1) |
|
接收模式 | [1:0] |
確定哪個功能能夠將Rx資料讀取到UART 接收緩衝暫存器。 (UART Tx 啟用/禁用) 00:禁止 01:中斷請求或輪詢模式 10:DMA0 請求(僅適用於 UART0) DMA3 請求(僅適用於 UART2) 11:DMA1 請求(僅適用於 UART1) |
注意:應該在選擇或者取消FCLK/n後加上一下程式碼:
rGPHCON = rGPHCON & ~(3<<16); //GPH8(UEXTCLK)輸入
Delay(1); //大約100μs
rGPHCON = rGPHCON & ~(3<<16) | (1<<17); //GPH8(UEXTCLK)UEXTCLK
2.3 FIFO控制暫存器
UART 模組中包含了UFCON0、UFCON1 和UFCON2。
暫存器 | 地址 | R/W | 描述 | 復位值 |
UFCON0 | 0x50000008 | R/W | UART0 FIFO控制暫存器 | 0x00 |
UFCON1 | 0x50004008 | R/W | UART1 FIFO控制暫存器 | 0x00 |
UFCON2 | 0x50008008 | R/W | UART2 FIFO控制暫存器 | 0x00 |
暫存器位資訊:
UFCONx | 位 | 描述 | 初始狀態 |
Tx FIFO觸發深度 | [7:6] |
決定傳送FIFO 的觸發深度 00:空 01:16位元組 10:32位元組 11:48位元組 |
00 |
Rx FIFO觸發深度 | [5:4] |
決定接收FIFO 的觸發深度 00:空 01:16位元組 10:32位元組 11:48位元組 |
00 |
保留 | [3] | - | 0 |
Tx FIFO復位 | [2] |
復位FIFO後自動清零 0:正常 1:Tx FIFO復位 |
0 |
Rx FIFO復位 | [1] |
復位FIFO後自動清零 0:正常 1:Rx FIFO復位 |
0 |
FIFO使能 | [0] | 0:禁止 1:使能 | 0 |
2.4 UART MODEM控制暫存器
UART 模組中包含了UMCON0 和UMCON1。
暫存器 | 地址 | R/W | 描述 | 復位值 |
UMCON0 | 0x5000000C | R/W | UART0 Modem控制暫存器 | 0x00 |
UMCON1 | 0x5000400C | R/W | UART1 Modem控制暫存器 | 0x00 |
保留 | 0x5000800C | - | 保留 | 未定義 |
暫存器位資訊:
UMCONn | 位 | 描述 | 初始狀態 |
保留 | [7:5] | 這些位必須位0 | 000 |
自動流控制(AFC) | [4] | 0:禁止 1:使能 | 0 |
保留 | [3:1] | 這些位必須為0 | 000 |
請求傳送 | [0] |
如果AFC 位為使能,將忽律此值。這種情況下S3C2440A 將自動控制 請求傳送 [0] nRTS。如果 AFC 位為禁止,nRTS必須由軟體控制。 0:高電平(撤消nRTS) 1:低電平(啟用nRTS) |
0 |
2.5 UART TX/RX狀態暫存器
在UART 模組中包含了UTRSTAT0,UTRSTAT1 和UTRSTAT2。
暫存器 | 地址 | R/W | 描述 | 復位值 |
UTRSTAT0 | 0x50000010 | R | UART0 Tx/Rx狀態暫存器 | 0x06 |
UTRSTAT1 | 0x50004014 | R | UART1Tx/Rx狀態暫存器 | 0x06 |
UTRSTAT2 | 0x50008018 | R | UART2 Tx/Rx狀態暫存器 | 0x06 |
暫存器位資訊:
UTRSTATn | 位 | 描述 | 初始狀態 |
傳送器空 | [2] |
當傳送緩衝暫存器無有效資料要傳送並且傳送移位暫存器為空時將自動設定為1 0:非空 1:傳送器(傳送緩衝和移位暫存器)空 |
1 |
傳送緩衝器空 | [1] |
當傳送緩衝暫存器為空時自動設定為1 0 : 緩衝暫存器非空 如果UART 使用FIFO,使用者應該用UFSTAT 暫存器中的Rx FIFO 計數位和Rx FIFO 滿位取對代此位的檢查。 |
1 |
接收緩衝器 |
[0] |
每當通過RXDn 埠接收資料,接收緩衝暫存器包含了有效資料時自動設定為1 0:空 1:緩衝暫存器接收到有效資料(非FIFO 模式中,請求中斷或DMA) 如果UART 使用FIFO,使用者應該用UFSTAT 暫存器中的Rx FIFO 計數位和Rx FIFO 滿位取對代此位的檢查。 |
0 |
2.6 UART傳送緩衝暫存器(保持暫存器和FIFO暫存器)
在UART 模組中包含了UTXH0,UTXH1 和UTXH2。UTXHn 傳送資料為8 位資料。
暫存器 | 地址 | R/W | 描述 | 復位值 |
UTXH0 |
0x50000020(L) 0x50000023(B) |
W | UART0 傳送緩衝暫存器 | - |
UTXH1 |
0x50004020(L) 0x50004023(B) |
W | UART1傳送緩衝暫存器 | - |
UTXH2 |
0x50008020(L) 0x50008023(B) |
W | UART2傳送緩衝暫存器 | - |
暫存器位資訊:
UTXHn | 位 | 描述 | 初始狀態 |
TXDATAn | [7:0] | UARTn要傳送的資料 | - |
注意:L小端模式,B大端模式。
2.7 UART接收緩衝暫存器(保持暫存器和FIFO暫存器)
在UART 模組中包含了URXH0,URXH1 和URXH2。URXHn 傳送資料為8 位資料。
暫存器 | 地址 | R/W | 描述 | 復位值 |
URXH0 |
0x50000024(L) 0x50000027(B) |
W | UART0 接收緩衝暫存器 | - |
URXH1 |
0x50004024(L) 0x50004027(B) |
W | UART1 接收緩衝暫存器 | - |
URXH2 |
0x50008024(L) 0x50008027(B) |
W | UART2 接收緩衝暫存器 | - |
暫存器位資訊:
URXHn | 位 | 描述 | 初始狀態 |
RXDATAn | [7:0] | UARTn接收到的資料 | - |
注意:L小端模式,B大端模式。
注意: 當發生溢位錯誤時,必須讀出URXHn。如果未讀出,即使清除了UERSTATn 的溢位位下次接收資料將同樣發出溢位錯誤。
2.8 UART波特率分頻暫存器
在UART 模組中包含了UBRDIV0,UBRDIV1 和UBRDIV2。
儲存在波特率分頻暫存器中的值(UBRDIVn)是用於決定如下的序列Tx/Rx 時鐘率(波特率):
$$UBRDIVn=(int)\frac{UART時鐘}{波特率 \times 16} - 1$$
其中UART時鐘:PCLK、FCLK/n或UEXTCLK.
例如:如果波特率位115200bps,並且UART時鐘位40MHz,則UBRDIVn為:
$$UBRDIVn=(int)\frac{40000000}{115200 \times 16} - 1 = 21$$
暫存器 | 地址 | R/W | 描述 | 復位值 |
UBRDIV0 |
0x50000028 |
R/W | UART0波特率分頻暫存器 | - |
UBRDIV1 |
0x50004028 |
R/W | UART1波特率分頻暫存器 | - |
UBRDIV2 |
0x50008028 |
R/W | UART2波特率分頻暫存器 | - |
暫存器位資訊:
UBRDIVn | 位 | 描述 | 初始狀態 |
UBRDIV | [15:0] |
波特率分頻值UBRDIVn > 0。 使用UEXTCLK 作為輸入時鐘時,可以設定UBRDIVn 為0。 |
- |
三、串列埠初始化步驟
以UART0為例,其引腳如下:
- RX:GPH3
- TX:GPH2
輸出波特率位115200,資料位8位,停止位1位,奇偶校驗位None。時鐘源選擇PCLK=50HMz。
3.1 計算波特率
PLCK位50MHz,波特率位:
$$(int)\frac{50000000}{115200 \times 16} - 1 = 26$$
3.2 I/O狀態設定
設定GPH控制暫存器,同時設定GPH2、GPH3為上拉使能。
GPHCON &= ~((3<<4) | (3 <<6)); GPHCON |= ((2<<4) | (2<<6)); GPHUP &= ~((1<<2) | (1<<3));
3.3 設定資料長度,開始位,停止位,奇偶校驗相關
ULCON0 = 0x03;
3.4 禁止FIFO、禁止自動流控制
預設就是禁止的,可以不用設定。
3.5 設定UART時鐘、接收中斷使能
設定時鐘源為PCK,中斷/查詢模式。
UCON0 = 0x05;
3.6 設定波特率
/* 設定波特率 */ /* UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1 * UART clock = 50M * UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26 */ UBRDIV0 = 26;