深入理解ARM體系架構(S3C6410)---UART實例
S3C6410提供了4個獨立的異步串行口,每個獨立的串行口可以工作在中斷模式或DMA模式下。也就是說UART能夠產(chǎn)生一個中斷或DMA請求。UART可以提供最高3Mbps。每個UART包含2個64位的FIFO,分別用于接收,發(fā)送緩沖。
本文引用地址:http://www.ex-cimer.com/article/201611/317828.htmS3C6410 UART 包括可編程的波特率,紅外發(fā)射接收,1或2個停止校驗位,5,6,7,8數(shù)據(jù)位,和奇偶檢驗。每個UART包含一個波特率發(fā)生器,接收發(fā)送和控制單元。
波特率可以由PCLK,EXT_UCLK0或EX_UCLK1鎖定。發(fā)送接收器分別包含了一個64位FIFO和一個數(shù)據(jù)移位器。通過向FIFO寫入數(shù)據(jù),再把FIFO中的數(shù)據(jù)拷貝到數(shù)據(jù)移位器中,從而通過TxDn引腳被發(fā)送出去。接收數(shù)據(jù)與之相反:RxDn->datashifter->FIFO.
2、
RxD0, TxD0, RxD1, TxD1, RxD2, TxD2, RxD3and TxD3支持DMA格式和中斷格式。
UART 0,1,2,3支持紅外通信和64位FIFO
UART 0,1支持nRTS0, nCTS0, nRTS1, and nCTS1
支持高速操作。
支持握手操作。
下面將描述數(shù)據(jù)的發(fā)送和接收,中斷的產(chǎn)生,波特率的產(chǎn)生,回環(huán)模式,紅外模式,和自動流控制模式。
3 、 數(shù)據(jù)發(fā)送DATA TRANSMISSION
發(fā)送的數(shù)據(jù)幀是可以編程的,其中包括一個開始位,5~8位數(shù)據(jù)位,奇偶校驗位和1或2個停止位。這些都可以通過線性控制器ULCONn控制。發(fā)送器可以產(chǎn)生終止條件,這終止條件能強制在一個幀數(shù)據(jù)發(fā)送時間內(nèi)使串口輸出0狀態(tài)。
The data framefor transmission is programmable. It consists of a start bit, 5 to 8 data bits,an optional parity bit and 1 to 2 stop bits, which can be specified by the linecontrol register (ULCONn). The transmitter can also produce the breakcondition, which forces the serial output to logic 0 state for one frametransmission time. This block transmits break signals after the presenttransmission word is transmitted completely. After the break signal transmission,it continuously transmits data into the Tx FIFO (Tx holding register in thecase of Non-FIFO mode).
4、 數(shù)據(jù)接收DATA RECEPTION
接收的數(shù)據(jù)幀是可以編程的,其中包括一個開始位,5~8位數(shù)據(jù)位,奇偶校驗位和1或2個停止位。這些都可以通過線性控制器ULCONn控制。接收器能檢測到溢出錯誤,奇偶校驗錯誤,幀錯誤,和終止條件。每一個錯誤都可以設置一個錯誤標志。
overrun error指的是在一個以前的數(shù)據(jù)還沒有被讀走之前新的數(shù)據(jù)就把此數(shù)據(jù)覆蓋了。
parity error指的是接收器檢測到一個非預料的奇偶條件。
frame error指的是收到的數(shù)據(jù)沒有停止位。
break condition指的是RxDn在超過一個數(shù)據(jù)幀的時間始終保持0狀態(tài)。
當接收器在三個字的時間內(nèi)(其間隔根據(jù)字長位的設置)沒有收到任何數(shù)據(jù)且RxFIFO為空,產(chǎn)生超時條件。
5、 自動流控制AUTO FLOW CONTROL(AFC)
S3C6410中的UART0 和UART1 支持有nRTS和nCTS信號自動控制流。這樣,它能連接至外部的UART。如果用戶想連接UART到Modem。
則必須通過設置UMCONn禁止自動流并且通過軟件來控制nRTS。只有在nCTS信號有效的情況下,UART才會向FIFO中寫入數(shù)據(jù)。在自動流控制中nCTS表示另一個UART已經(jīng)準備好接收數(shù)據(jù)了。在接收數(shù)據(jù)之前,如果FIFO有2個以上空余字節(jié)空間則把nRTS設為有效。空余字節(jié)空間小于1時,則要把nRTS設為無效。
串口部分寄存器較多,其實根據(jù)需要仔細配置即可。
已經(jīng)編寫好的串口程序如下:
- void
Uart_Init(void) - {
// UART I/O port initialize (RXD0 : GPA0, TXD0: GPA1) rGPACON = (rGPACON & ~(0xff<<0)) | (0x22<<0); // GPA0->RXD0, GPA1->TXD0 rGPAPUD = (rGPAPUD & ~(0xf<<0)) | (0x1<<0); // RXD0: Pull-down, TXD0: pull up/down disable // Initialize UART Ch0 rULCON0 = (0<<6)|(0<<3)|(0<<2)|(3<<0); // Normal Mode, No Parity, 1 Stop Bit, 8 Bit Data rUCON0 = (0<<10)|(1<<9)|(1<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1<<0); // PCLK divide, Polling Mode rUFCON0 = (0<<6)|(0<<4)|(0<<2)|(0<<1)|(0<<0); // Disable FIFO rUMCON0 = (0<<5)|(0<<4)|(0<<0); // Disable Auto Flow Control rUBRDIV0 = 35; // Baud rate rUDIVSLOT0 = 0x80;//aSlotTable[DivSlot]; - }
- void
Uart_SendByte(int data) - {
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty. //_Delay(); WrUTXH0(data); - }
- void
Uart_SendString(char *pt) - {
while(*pt) Uart_SendByte(*pt++); - }
- //=====================================================================
- char
Uart_GetCh(void) - {
while(!(rUTRSTAT0 & 0x1)); //Receive data ready return RdURXH0(); - }
- char
Uart_GetKey(void) - {
if(rUTRSTAT0 & 0x1) //Receive data ready return RdURXH0(); return 0; - }
評論