深入理解ARM體系架構(gòu)(S3C6410)---UART實(shí)例
S3C6410提供了4個(gè)獨(dú)立的異步串行口,每個(gè)獨(dú)立的串行口可以工作在中斷模式或DMA模式下。也就是說UART能夠產(chǎn)生一個(gè)中斷或DMA請(qǐng)求。UART可以提供最高3Mbps。每個(gè)UART包含2個(gè)64位的FIFO,分別用于接收,發(fā)送緩沖。
本文引用地址:http://m.butianyuan.cn/article/201611/317828.htmS3C6410 UART 包括可編程的波特率,紅外發(fā)射接收,1或2個(gè)停止校驗(yàn)位,5,6,7,8數(shù)據(jù)位,和奇偶檢驗(yàn)。每個(gè)UART包含一個(gè)波特率發(fā)生器,接收發(fā)送和控制單元。
波特率可以由PCLK,EXT_UCLK0或EX_UCLK1鎖定。發(fā)送接收器分別包含了一個(gè)64位FIFO和一個(gè)數(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)模式,紅外模式,和自動(dòng)流控制模式。
3 、 數(shù)據(jù)發(fā)送DATA TRANSMISSION
發(fā)送的數(shù)據(jù)幀是可以編程的,其中包括一個(gè)開始位,5~8位數(shù)據(jù)位,奇偶校驗(yàn)位和1或2個(gè)停止位。這些都可以通過線性控制器ULCONn控制。發(fā)送器可以產(chǎn)生終止條件,這終止條件能強(qiáng)制在一個(gè)幀數(shù)據(jù)發(fā)送時(shí)間內(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ù)幀是可以編程的,其中包括一個(gè)開始位,5~8位數(shù)據(jù)位,奇偶校驗(yàn)位和1或2個(gè)停止位。這些都可以通過線性控制器ULCONn控制。接收器能檢測(cè)到溢出錯(cuò)誤,奇偶校驗(yàn)錯(cuò)誤,幀錯(cuò)誤,和終止條件。每一個(gè)錯(cuò)誤都可以設(shè)置一個(gè)錯(cuò)誤標(biāo)志。
overrun error指的是在一個(gè)以前的數(shù)據(jù)還沒有被讀走之前新的數(shù)據(jù)就把此數(shù)據(jù)覆蓋了。
parity error指的是接收器檢測(cè)到一個(gè)非預(yù)料的奇偶條件。
frame error指的是收到的數(shù)據(jù)沒有停止位。
break condition指的是RxDn在超過一個(gè)數(shù)據(jù)幀的時(shí)間始終保持0狀態(tài)。
當(dāng)接收器在三個(gè)字的時(shí)間內(nèi)(其間隔根據(jù)字長(zhǎng)位的設(shè)置)沒有收到任何數(shù)據(jù)且RxFIFO為空,產(chǎn)生超時(shí)條件。
5、 自動(dòng)流控制AUTO FLOW CONTROL(AFC)
S3C6410中的UART0 和UART1 支持有nRTS和nCTS信號(hào)自動(dòng)控制流。這樣,它能連接至外部的UART。如果用戶想連接UART到Modem。
則必須通過設(shè)置UMCONn禁止自動(dòng)流并且通過軟件來(lái)控制nRTS。只有在nCTS信號(hào)有效的情況下,UART才會(huì)向FIFO中寫入數(shù)據(jù)。在自動(dòng)流控制中nCTS表示另一個(gè)UART已經(jīng)準(zhǔn)備好接收數(shù)據(jù)了。在接收數(shù)據(jù)之前,如果FIFO有2個(gè)以上空余字節(jié)空間則把nRTS設(shè)為有效??沼嘧止?jié)空間小于1時(shí),則要把nRTS設(shè)為無(wú)效。
串口部分寄存器較多,其實(shí)根據(jù)需要仔細(xì)配置即可。
已經(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; - }
評(píng)論