s3c2440串口详解
一、UART原理說明
通用異步收發器簡稱UART(Universal Asynchronous Receiver/Transmitter),它用來傳輸串行數據:發送數據時,CPU將并行數據寫入UART,UART按照一定的格式在一根電線上串行發出;接收數據時,UART檢測另一根電線上的信號,將串行數據收集放在緩沖區中,CPU就可以讀取UART獲得這些數據。串口之間以全雙工方式傳輸數據,最精簡的連線只有三根線:TxD用于發送數據,RxD用于接收數據,Gnd用于給雙方提供參考電平,連線如下圖:
UART使用標準的TTL/CMOS邏輯電平(0-5V、0-3.3V、0-2.5V、0-1.8V)來表示數據,高電平表示1,低電平表示0。為了增強數據的抗干擾能力、提高傳輸長度,通常將TTL/CMOS邏輯電平轉換為RS232邏輯電平,3-12V表示0,-3--12V表示1。
TxD、RxD數據線以‘位’為最小單位傳輸數據。幀由具體完整意義的、不可分割的若干位組成,它包含開始位、數據位、校驗位、停止位。發送數據之前UART之間要約定好數據的傳輸速率(每位所占用的時間,其倒數稱為波特率)、數據的傳輸格式(有多少數據位、是否使用校驗位、是奇校驗還是偶校驗,有多少個停止位)。
數據傳輸如下圖:
(1)、平時數據線處于“空閑”狀態(1狀態)
(2)、當要發送數據時,UART改變TxD數據線的狀態(變為0狀態)并維持1位的時間,這樣接收方檢測到開始位后,再等待1.5位的時間就開始一位一位地檢測數據線的狀態得到所傳輸的數據。
(3)、UART一幀中可以有5、6、7、8位數據,發送方一位一位地改變數據線的狀態將它們發送出去,首先發送最低位。
(4)、如果使用校驗功能,UART在發送完數據后,還要發送1個校驗位。有兩種校驗法:奇校驗、偶校驗(數據位連同校驗位中,“1”的數目是奇數還是偶數)。
(5)、最后,發送停止位,數據線恢復到“空閑”狀態。停止位的長度有3種:1位、1.5位、2位。
二、S3C2440 UART的特性
s3c2440中UART,有三個獨立的通道,每個通道都可以工作于中斷模式或DMA模式,即UART可以發出中斷或DMA請求以便在UART、CPU間傳輸數據。UART由波特率發生器、發送器、接收器和控制邏輯組成。
使用系統時鐘時,s3c2440可以達到115.2Kbit/s;s3c2440UART的FIFO深度為64字節。發送數據時,CPU先將數據寫入發送FIFO中,然后UART會自動將FIFO中的數據復制到“發送移位器”中,發送移位器將數據一位一位地發送到TxD數據線上(根據設定的格式,插入開始位、校驗位、停止位)。接收數據時,“接收移位器”將RxD數據線上的數據一位一位接收進來,然后復制到接收FIFO,CPU即可從中讀取數據。
UART結構圖
三、s3c2440UART的使用
在使用UART之前需要設置波特率、傳輸格式(有多少個數據位、是否使用校驗位、是奇校驗還是偶校驗、有多少個停止位、是否使用流量控制);對于s3c2440還要設置相應的管腳位UART功能、選擇UART通道工作模式為中斷模式還是DMA模式,設置好后,往某個寄存器寫入數據即可發送,讀取某個寄存器即可得到接收到的數據。可以查詢狀態寄存器或設置中斷來獲知數據是否已經發送完畢、是否已經接收完畢。
具體操作方法:
1、將所涉及的UART通道管腳設為UART功能
比如UART0,GPH2、GPH3分別用作TxD0、RxD0,要使用串口通道0時,先設置GPHCON寄存器將GPH2、GPH3引腳功能設置為TxD0、RxD0。
2、UBRDIVn寄存器:設置波特率
s3c2440UART的時鐘源有三種選擇:FLCK/n(n值通過UCON0-UCON2聯合設置)、UEXTCLK、PCLK。
根據給定的波特率、所選擇的的時鐘源的頻率。可以通過以下公式計算UBRDIVn寄存器(n為0-2)的值,
給出了計算公式、例子及誤差計算
3、ULCONn寄存器:設置傳輸格式
4、UCONn寄存器:串口控制寄存器
UCONn寄存器用來選擇UART時鐘源、設置UART中斷方式等。
n的值有UCON0、UCON1、UCON2這3個寄存器的[15:12]一起來確定。
5、UFCONn寄存器、UFSTATn寄存器
UFCONn寄存器用于設置是否使用FIFO,設置各FIFO的觸發閾值,即發送FIFO中有多少個數據時產生中斷、接收FIFO中有多少個數據時產生中斷。并可以通過設置這個寄存器來復位各個FIFO。
讀取USTATn寄存器可以知道各個FIFO是否已滿、其中有多少個數據。
不適用FIFO時可以認為FIFO深度為1,使用FIFO時s3c2440FIFO深度64。
6、UMOCONn寄存器、UMSTATn寄存器
這兩類寄存器用于流量控制。
7、UTRSTATn寄存器
這個寄存器用來表示數據是否已經發送完畢、是否接收完畢。
8、UERSTATn寄存器
用來表示各種錯誤是否發生。
9、UTXHn寄存器
CPU將數據寫入這個寄存器,UART就會將它保存到緩沖區中,并自動發送出去
10、URXHn寄存器
當UART接收到數據,CPU讀取這個寄存器,就可以獲取數據。
四、UART使用程序
serial.h
void uart0_init(void); void putc(unsigned char c); unsigned char getc(void); int isDigit(unsigned char c); int isLetter(unsigned char c);
serial.c
#include "s3c24xx.h"
#include "serial.h"
#define TXD0READY (1<<2)
#define RXD0READY (1)
#define PCLK 50000000 // init.c中的clock_init函數設置PCLK為50MHz
#define UART_CLK PCLK // UART0的時鐘源設為PCLK
#define UART_BAUD_RATE 115200 // 波特率
#define UART_BRD ((UART_CLK / (UART_BAUD_RATE * 16)) - 1)
/*
* 初始化UART0
* 115200,8N1,無流控
*/
void uart0_init(void)
{
GPHCON |= 0xa0; // GPH2,GPH3用作TXD0,RXD0
GPHUP = 0x0c; // GPH2,GPH3內部上拉
ULCON0 = 0x03; // 8N1(8個數據位,無較驗,1個停止位)
UCON0 = 0x05; // 查詢方式,UART時鐘源為PCLK
UFCON0 = 0x00; // 不使用FIFO
UMCON0 = 0x00; // 不使用流控
UBRDIV0 = UART_BRD; // 波特率為115200
}
/*
* 發送一個字符
*/
void putc(unsigned char c)
{
/* 等待,直到發送緩沖區中的數據已經全部發送出去 */
while (!(UTRSTAT0 & TXD0READY));
/* 向UTXH0寄存器中寫入數據,UART即自動將它發送出去 */
UTXH0 = c;
}
/*
* 接收字符
*/
unsigned char getc(void)
{
/* 等待,直到接收緩沖區中的有數據 */
while (!(UTRSTAT0 & RXD0READY));
/* 直接讀取URXH0寄存器,即可獲得接收到的數據 */
return URXH0;
}
/*
* 判斷一個字符是否數字
*/
int isDigit(unsigned char c)
{
if (c >= '0' && c <= '9')
return 1;
else
return 0;
}
/*
* 判斷一個字符是否英文字母
*/
int isLetter(unsigned char c)
{
if (c >= 'a' && c <= 'z')
return 1;
else if (c >= 'A' && c <= 'Z')
return 1;
else
return 0;
}
總結
以上是生活随笔為你收集整理的s3c2440串口详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nodejs连接池 连接关闭_「转」连接
- 下一篇: Android的Surface的创建