深入理解ARM體系架構(S3C6410)---UART實例
S3C6410提供了4個獨立的異步串行口,每個獨立的串行口可以工作在中斷模式或DMA模式下。也就是說UART能夠產生一個中斷或DMA請求。UART可以提供最高3Mbps。每個UART包含2個64位的FIFO,分別用于接收,發送緩沖。
本文引用地址:http://www.104case.com/article/201611/317828.htmS3C6410 UART 包括可編程的波特率,紅外發射接收,1或2個停止校驗位,5,6,7,8數據位,和奇偶檢驗。每個UART包含一個波特率發生器,接收發送和控制單元。
波特率可以由PCLK,EXT_UCLK0或EX_UCLK1鎖定。發送接收器分別包含了一個64位FIFO和一個數據移位器。通過向FIFO寫入數據,再把FIFO中的數據拷貝到數據移位器中,從而通過TxDn引腳被發送出去。接收數據與之相反: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
支持高速操作。
支持握手操作。
下面將描述數據的發送和接收,中斷的產生,波特率的產生,回環模式,紅外模式,和自動流控制模式。
3 、 數據發送DATA TRANSMISSION
發送的數據幀是可以編程的,其中包括一個開始位,5~8位數據位,奇偶校驗位和1或2個停止位。這些都可以通過線性控制器ULCONn控制。發送器可以產生終止條件,這終止條件能強制在一個幀數據發送時間內使串口輸出0狀態。
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、 數據接收DATA RECEPTION
接收的數據幀是可以編程的,其中包括一個開始位,5~8位數據位,奇偶校驗位和1或2個停止位。這些都可以通過線性控制器ULCONn控制。接收器能檢測到溢出錯誤,奇偶校驗錯誤,幀錯誤,和終止條件。每一個錯誤都可以設置一個錯誤標志。
overrun error指的是在一個以前的數據還沒有被讀走之前新的數據就把此數據覆蓋了。
parity error指的是接收器檢測到一個非預料的奇偶條件。
frame error指的是收到的數據沒有停止位。
break condition指的是RxDn在超過一個數據幀的時間始終保持0狀態。
當接收器在三個字的時間內(其間隔根據字長位的設置)沒有收到任何數據且RxFIFO為空,產生超時條件。
5、 自動流控制AUTO FLOW CONTROL(AFC)
S3C6410中的UART0 和UART1 支持有nRTS和nCTS信號自動控制流。這樣,它能連接至外部的UART。如果用戶想連接UART到Modem。
則必須通過設置UMCONn禁止自動流并且通過軟件來控制nRTS。只有在nCTS信號有效的情況下,UART才會向FIFO中寫入數據。在自動流控制中nCTS表示另一個UART已經準備好接收數據了。在接收數據之前,如果FIFO有2個以上空余字節空間則把nRTS設為有效。空余字節空間小于1時,則要把nRTS設為無效。
串口部分寄存器較多,其實根據需要仔細配置即可。
已經編寫好的串口程序如下:
- 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; - }
評論