- 嵌入式系統設計與實踐:Linux篇
- 季江民
- 1225字
- 2020-04-03 09:21:48
4.4 異步串行口
S3C2410自帶3個異步串行口控制器,每個控制器有16個字節的FIFO,最大波特率115.2Kbit/s, UART行控制寄存器ULCONn、控制數寄存器UCONn、讀寫狀態寄存器UTRSTAT、FIFO控制寄存器UFCONn、UART MODEM控制寄存器UMCONn、讀寫狀態寄存器UTRSTATn、FIFO狀態寄存器UFSTATn、波特率分頻寄存器UBRDIVn。
(1)端口H控制寄存器功能如表4.19所示,端口H控制寄存器共有引腳21個,0~20腳,每2個位控制1個引腳。如果控制位為00時引腳為輸入,控制位為01時引腳為輸出,控制位為10時引腳為特殊功能,控制位為11時引腳為保留功能。
表4.19 端口H控制寄存器及功能

(2)端口上拉寄存器(GPBUP-GPHUP)
0接上拉電阻,1不接上拉電阻
(3)S3C2410中UART行控制寄存器ULCONn如表4.20所示。
表4.20 UART行控制寄存器VLCONn

(4)S3C2410中FIFO控制寄存器UFCONn如表4.21所示。
表4.21 FIFO控制寄存器UFCONn

(5)S3C2410中UART MODED控制寄存器UMCONn如表4.22所示。
表4.22 UARTMODED控制寄存器UMCONn

S3C2410中每個UART的寄存器有11個之多(共有3個UART),考慮比較簡單的情況,用到的寄存器也有8個。不過初始化就用去了5個寄存器,剩下的3個用于接收、發送數據。下面應用實例說明串行通信的應用。
例1:假設在數據傳送中設置傳送8個數據位,1個停止位,無校驗,正常操作模式,發送、接收都使用中斷或查詢方式,請根據實際需求設置異步通信寄存器,實際操作過程如下:
(1)初始化
① 把使用到的引腳GPH2、GPH3定義為TXD0、RXD0。
GPHCON |= 0xa0 //10100000 GPHUP |= 0x0c //上拉
② 設置ULCON0
如把ULCON0(UART channel 0 line control register)設定為:8個數據位,1個停止位,無校驗,正常操作模式(與之相對的是Infra-Red Mode,此模式表示0、1的方式比較特殊)。則ULCON0值為0x03。
③ 設置UCON0
如把UCON0設定為除了位[3:0],其他位都使用默認值。位[3:0]=0b0101表示:發送、接收都使用“中斷或查詢方式”,則把UCON0值賦為0x05。
④ 設置UFCON0
如把UFCON0的功能設定為不使用FIFO,則設為默認值0。
⑤ 設置UMCON0
如果把UMCON0設定為不使用流控,則設為默認值0x00。
⑥ 設置UBRDIV0
UBRDIV0未使用PLL,采用PCLK=12MHz,設置波特率為57600Bd,則由公式:
UBRDIVn = (int)(PCLK / (bps x 16))-1
可以計算得UBRDIV0 = 12,根據S3C2410數據手冊的誤差公式,驗算此波特率是否在可容忍的誤差范圍之內,如果不在,則需要更換另一個波特率。經驗算UBRDIV0可設為12。
(2)發送數據
① 設置UTRSTAT0
如果把UTRSTAT0功能設置如下:
位[2]:無數據發送時,自動設為1。當使用串口發送數據時,先讀此位以判斷是否有數據正在占用發送口。
位[1]:發送FIFO是否為空。
位[0]:接收緩沖區是否有數據,若有,此位設為1。實驗中需要不斷查詢此位,判斷是否有數據已經被接收。
② 給UTXH0寄存器賦值
實驗中要把發送的數據寫入UTXH0(UART channel 0 transmit buffer register )此寄存器。
(3)接收數據
① 根據位[0],先判斷寄存器UTRSTAT0的緩沖區是否有數據。
② 當查詢到UTRSTAT0位[0]=1時,讀此寄存器獲得串口接收到的數據。
串口數據傳送的三個函數:init_uart、putc、getc分別表示串口初始化、發送數據與接收數據。
void init_uart( ) //初始化UART { GPHCON|= 0xa0; //GPH2, GPH3 used as TXD0, RXD0 GPHUP = 0x0c; //GPH2, GPH3內部上拉 ULCON0 = 0x03; //8N1(8個數據位,無校驗位,1個停止位) UCON0 = 0x05; //查詢方式 UFCON0 = 0x00; //不使用FIFO UMCON0 = 0x00; //不使用流控 UBRDIV0= 12; //波特率為57600 } void putc(unsigned char c) { while( ! (UTRSTAT0 & TXD0READY) ); //不斷查詢,直到可以發送數據 UTXH0 = c; //發送數據 } unsigned char getc( ) { while( ! (UTRSTAT0 & RXD0READY) ); //不斷查詢,直到接收到了數據 return URXH0; //返回接收到的數據 }
4.5 IIC總線接口
IIC中有一條串行數據線(SDA),一條串行時鐘線(SCL)。數據傳送時,主機先發出開始S信號,然后發出8位數據,這8位數據中的前7位為從機的地址,第8位表示傳輸的方向(0表示寫操作,1表示讀操作)。在S3C2410中IIC總線控制寄存器有4個,分別是IICCON、IICSTAT、IICADD、IICDS。SDA線上的數據從IICDS寄存器發出(或傳入IICDS); IICADD寄存器中保存S3C2410當作從機時的地址;IICCON、IICSTAT兩個寄存器用來控制或標識各種狀態,如選擇工作模式、發出S或P信號、接收ACK信號、檢測是否收到ACK信號。
(1)IICCON寄存器
IICCON寄存器各位功能及描述如表4.23所示。
表4.23 IICCON寄存器各位的功能描述

(2)IICSTAT寄存器
IICSTAT寄存器各位功能及描述如表4.24所示。
表4.24 IICSTAT寄存器各位的功能描述

(3)IICADD寄存器
[7:1]表示從機地址,當IICSTAT[4]為0時才可寫入,在任何時間都可以讀出。
(4)IICDS寄存器
[7:0]保存的是要發送或已經接收的數據,當IICSTAT[4]為1時,才可以寫入,在任何時間都可讀出。
例:分析下列函數IIC_init
void IIC_init(void) { GPEUP |=0xc000 ; GPECON |=0xa0000000 ; INTMSK &= ~(BIT_IIC); IICCON=( 1<<7) | (0<<6) | (1<<5) |(0xf) ; IICADD = 0x10; //S3C2410 slave address = [7:1] IICSTAT =0x10; }
分析:語句GPEUP |=0xc000;表示禁止內部上拉,語句GPECON |=0xa0000000;表示選擇引腳GPE15到IICSDA, GPE14到IICSCL, Bit[7]=1,使能ACK, bit[6]=0, IICCLK=PCLK/16, bit[5]=1,使能中斷,Bit[3:0]=0xf, Tx_clock=IICCLK/16,如PCLK=50MHz, IICCLK=3.125MHz, Tx_clock=0.195MHz, IIC串行輸出使能Rx/Tx。