UART是用于控制計(jì)算機(jī)與串行設(shè)備的芯片。有一點(diǎn)要注意的是,它提供了數(shù)據(jù)終端設(shè)備接口,這樣計(jì)算機(jī)就可以和調(diào)制解調(diào)器或其它使用RS-232C接口的串行設(shè)備通信了。作為接口的一部分,UART還提供以下功能:
- 將由計(jì)算機(jī)內(nèi)部傳送過來的并行數(shù)據(jù)轉(zhuǎn)換為輸出的串行數(shù)據(jù)流;
- 將計(jì)算機(jī)外部來的串行數(shù)據(jù)轉(zhuǎn)換為字節(jié),供計(jì)算機(jī)內(nèi)部使用并行數(shù)據(jù)的器件使用;
- 在輸出的串行數(shù)據(jù)流中加入奇偶校驗(yàn)位,并對(duì)從外部接收的數(shù)據(jù)流進(jìn)行奇偶校驗(yàn);
- 在輸出數(shù)據(jù)流中加入啟停標(biāo)記,并從接收數(shù)據(jù)流中刪除啟停標(biāo)記;
- 處理由鍵盤或鼠標(biāo)發(fā)出的中斷信號(hào)(鍵盤和鼠票也是串行設(shè)備);
- 可以處理計(jì)算機(jī)與外部串行設(shè)備的同步管理問題;
異步串口通信協(xié)議,工作原理是將傳輸數(shù)據(jù)的每個(gè)字符以串行方式一位接一位的傳輸。如下圖:

其中每一位(bit)的意義如下:
起始位:先發(fā)出一個(gè)邏輯“0”的信號(hào),表示傳輸字符的開始。
數(shù)據(jù)位:緊跟起始位之后。數(shù)據(jù)位的個(gè)數(shù)可以是4、5、6、7、8等,構(gòu)成一個(gè)字符。通常采用ASCII碼。從最低位開始傳送,靠時(shí)鐘來定位。
奇偶校驗(yàn)位:數(shù)據(jù)位加上這一位后(跟在數(shù)據(jù)位尾部),使得“1”的位數(shù)應(yīng)為偶數(shù)(偶校驗(yàn))或奇數(shù)(奇校驗(yàn)),以此來校驗(yàn)數(shù)據(jù)傳送的正確性。
停止位:它是一個(gè)字符數(shù)據(jù)的結(jié)束標(biāo)志??梢允?位、1.5位、2位的高電平(邏輯“1”)。
空閑位:處于邏輯“1”狀態(tài),表示當(dāng)前線路上沒有數(shù)據(jù)的傳送。
波特率:是衡量數(shù)據(jù)傳輸速率的指針。表示為每秒鐘傳送的二進(jìn)制位數(shù)(bit數(shù))。例如資料傳送速率為120字符/秒,而每一個(gè)字符為10位,則其傳送的波特率為:
10×120 = 1200字符/秒=1200波特。
以上的數(shù)據(jù)位、奇偶校驗(yàn)位、波特率等均可以在COM接口中設(shè)置。也可以在代碼中對(duì)UART寄存器的各位進(jìn)行設(shè)置,UART寄存器的各位所代表的含義如下:

下面通過幾個(gè)小程序,了解UART通信協(xié)議進(jìn)行數(shù)據(jù)傳輸?shù)倪^程:
- #include "2410lib.h"
-
- /*********************************************************************************************
- * name: uart0_test
- * func: uart test function
- * para: none
- * ret: none
- * modify:
- * comment:
- *********************************************************************************************/
- void uart0_test()
- {
- char cInput[256];
- UINT8T ucInNo=0;
- char c;
- uart_init(0,115200,0); //define the baud rate
- uart_printf("\n UART0 Communication Test Example\n");
- uart_printf(" Please input words, then press Enter:\n");
- #ifdef BOARDTEST
- sprintf(&cInput, "Type via UART0 to test.");
- print_lcd(195,170,0x1c,&cInput);
- #endif
- uart_printf(" ");
- g_nKeyPress = 1;
- while(g_nKeyPress==1) // only for board test to exit
- {
- c=uart_getch();
- //uart_sendbyte(c);
-
- uart_printf("%c",c);
- if(c!='\r')
- cInput[ucInNo++]=c;
- else
- {
- cInput[ucInNo]='\0';
- break;
- }
- }
- delay(1000);
-
- uart_printf(" \nThe words that you input are: %s\n",cInput);
- uart_printf(" end.\n");
- }
-
- void Main(int argc,char **argv)
- {
-
- sys_init(); // Initial s3c2410's Clock, MMU, Interrupt,Port and UART
-
- while(1)
- {
- uart0_test();
- }
- for(;;);
-
- }
在這里我們使用 uart_init 函數(shù)便完成了UART各個(gè)位的設(shè)置,現(xiàn)在來看看uart_init在系統(tǒng)中是如何定義的:
- void uart_init(int nMainClk, int nBaud, int nChannel)
- {
- int i;
-
- if(nMainClk == 0)
- nMainClk = PCLK;
-
- switch (nChannel)
- {
- case UART0:
- rUFCON0 = 0x0; //UART channel 0 FIFO control register, FIFO disable
- rUMCON0 = 0x0; //UART chaneel 0 MODEM control register, AFC disable
- rULCON0 = 0x3; //Line control register : Normal,No parity,1 stop,8 bits
- // [10] [9] [8] [7] [6] [5] [4] [3:2] [1:0]
- // Clock Sel, Tx Int, Rx Int, Rx Time Out, Rx err, Loop-back, Send break, Transmit Mode, Receive Mode
- // 0 1 0, 0 1 0 0, 01 01
- // PCLK Level Pulse Disable Generate Normal Normal Interrupt or Polling
- rUCON0 = 0x245; // Control register
- //rUBRDIV0=( (int)(nMainClk/16./nBaud) -1 ); // Baud rate divisior register 0
- rUBRDIV0=( (int)(nMainClk/16./nBaud+0.5) -1 ); // Baud rate divisior register 0
- break;
-
- case UART1:
- rUFCON1 = 0x0; //UART channel 1 FIFO control register, FIFO disable
- rUMCON1 = 0x0; //UART chaneel 1 MODEM control register, AFC disable
- rULCON1 = 0x3;
- rUCON1 = 0x245;
- rUBRDIV1=( (int)(nMainClk/16./nBaud) -1 );
- break;
-
- case UART2:
- rULCON2 = 0x3;
- rUCON2 = 0x245;
- rUBRDIV2=( (int)(nMainClk/16./nBaud) -1 );
- rUFCON2 = 0x0; //UART channel 2 FIFO control register, FIFO disable
- break;
-
- default:
- break;
- }
-
- for(i=0;i<100;i++);
- delay(0);
- }
UART0 --- UART2 便是開發(fā)板為我們提供的三個(gè)寄存器,通過rUFCON、rUMCON、rULCON、rUCON、rUBRDIV 等引腳的賦值完成UART寄存器的設(shè)置。
關(guān)于更多ARM開發(fā)板的源碼,由于CSDN資源分享的頁面出現(xiàn)異常無法上傳分享,如有需要、給我留言,我發(fā)給大家。
“往往都是事情改變?nèi)耍藚s改變不了事情。”既是如此,為何不先改變自己呢?
明天、學(xué)習(xí)繼續(xù)!
|