S5PV210 UART 相關說明 通用非同步收發器簡稱 UART, 即 UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用來傳輸串列數據。發送數據時, CPU 將並行數據寫入 UART,UART 按照一定的格式在一根電線上串列發出;接收數據時, UA ...
S5PV210 UART 相關說明
通用非同步收發器簡稱 UART, 即 UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用來傳輸串列數據。發送數據時, CPU 將並行數據寫入 UART,UART 按照一定的格式在一根電線上串列發出;接收數據時, UART 檢測另一根電線的信號,將串列收集在緩衝區中, CPU 即可讀取 UART 獲得這些數據。
在 S5PV210 中, UART 提供了 4 對獨立的非同步串口 I/O 埠,有 4 個獨立的通道,每個通道可以工作於 DMA 模式或者中斷模式。其中,通道 0 有 256byte 的的發送 FIFO 和 256byte 的接收 FIFO,通道 1 有 64byte 的的發送 FIFO 64byte 的接收 FIFO,而通道 2 和 3 只有 16byte 的的發送 FIFO 和 16byte 的接收 FIFO。
S5PV210 的 UART 結構圖如下:
串口初始化程式
void uart_init()
{
/* 1 配置引腳用於 RX0/TX0 功能 */
GPA0CON = 0x22;
/* 2 設置數據格式等 */
UFCON0 = 0x1; // 使能 FIFO
UMCON0 = 0x0; // 無流控
ULCON0 = 0x3; // 數據位:8, 無校驗, 停止位: 1
UCON0 = 0x5; // 時鐘: PCLK,禁止中斷,使能 UART 發送、接收
/* 3 設置波特率 */
UBRDIV0 = UART_UBRDIV_VAL; // 34
UDIVSLOT0 = UART_UDIVSLOT_VAL; // 0xDFDD
}
程式分析:
第一步 配置引腳用於 RX0/TX0 功能
GPA0CON 寄存器如下圖所示:
配置 GPA0CON = 0x22。
第二步 設置數據格式
ULCON0 寄存器如下圖所示:
Word Length = 11,8bit 的數據;
Number of Stop Bit = 0,1bit 的停止位;
Parity Mode = 000,無校驗;
Infrared Mode =0,使用普通模式;
所以 ULCON0 = 0x3。
第三步 配置 UART
UCON0 寄存器如下圖所示:
Receive Mode = 01 ,使用中斷模式或者輪詢模式;
Transmit Mode = 01,使用中斷模式或者輪詢模式;
Send Break Signal = 0,普通傳輸;
Loop-back Mode = 0,不使用迴環方式;
我們採用輪詢的方式接受和發送數據,不使用中斷,所以 bit[6-9]均為 0;
Clock Selection = 0,使用 PCLK 作為 UART 的工作時鐘;
我們不使用 DMA,所以 bit[16]和 bit[20]均為 0;
所以 UCON0 = 0x5。
第四步 UFCON0 和 UMCON0
這兩個寄存器比較簡單, UFCON0 用來使能 FIFO, UMCON0 用來設置無流控。
第五步 設置波特率
主要是配置如下兩個寄存器:
波特率設置相關公式:
UBRDIVn + (num of 1's in UDIVSLOTn)/16 = (PCLK / (bps x 16)) −1
UART 工作於 PSYS 下,所以 PCLK 即 PCLK_PSYS = 66MHz,我們的波特率 bps 設置為 115200,所以
(66MHz/(115200 x 16)) – 1 = 34.80 = UBRDIVn + (num of 1's in UDIVSLOTn)/16
所以,設置 UBRDIV0 = 34,num of 1's in UDIVSLOTn = 13。
根據下圖得出 UDIVSLOTn 的值(友善的手冊中直接用的(num of 1's in UDIVSLOTn)這個值):
輪詢方式接收和發送一個字元
/* 接收一個字元 */
char getc(void)
{
while ((UFSTAT0 & 0xff) == 0); // 如果 RX FIFO 空,等待
return URXH0; // 取數據
}
/* 發送一個字元 */
void putc(char c)
{
while (UFSTAT0 & (1<<24)); // 如果 TX FIFO 滿,等待
UTXH0 = c; // 寫數據
}
通過讀 UFSTAT0 發送/接收狀態寄存器,當 Rx FIFO Count 不為 0 時說明接收到數據,讀 URXH0 寄存器可以得到 8bit 的數據; 當 Tx FIFO Full = 0 時說明可以發送數據,寫 8bit 的數據到 UTXH0。
UFSTAT0 寄存器如下圖所示:
所做修改
在《友善之臂210手冊》中,講解的是通過 UTRSTAT0 這個 buffer state reg 來查看當前的狀態,因為我們採用的 FIFO模式,並且 UTRSTAT0 與程式所用 Reg 也不符,所以手冊中顯然是錯誤的,我們寫的分析是修改過的。(可能我參考的手冊並不是友善之臂的最新版,沒有檢察出有此處小錯誤)
本篇文章參考:《友善之臂210手冊》