日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

嵌入式學(xué)習(xí)筆記之UART通信協(xié)議

 昵稱2009261 2014-04-25

        UART是用于控制計(jì)算機(jī)與串行設(shè)備的芯片。有一點(diǎn)要注意的是,它提供了數(shù)據(jù)終端設(shè)備接口,這樣計(jì)算機(jī)就可以和調(diào)制解調(diào)器或其它使用RS-232C接口的串行設(shè)備通信了。作為接口的一部分,UART還提供以下功能:

  1. 將由計(jì)算機(jī)內(nèi)部傳送過來的并行數(shù)據(jù)轉(zhuǎn)換為輸出的串行數(shù)據(jù)流;
  2. 將計(jì)算機(jī)外部來的串行數(shù)據(jù)轉(zhuǎn)換為字節(jié),供計(jì)算機(jī)內(nèi)部使用并行數(shù)據(jù)的器件使用;
  3. 在輸出的串行數(shù)據(jù)流中加入奇偶校驗(yàn)位,并對(duì)從外部接收的數(shù)據(jù)流進(jìn)行奇偶校驗(yàn);
  4. 在輸出數(shù)據(jù)流中加入啟停標(biāo)記,并從接收數(shù)據(jù)流中刪除啟停標(biāo)記;
  5. 處理由鍵盤或鼠標(biāo)發(fā)出的中斷信號(hào)(鍵盤和鼠票也是串行設(shè)備);
  6. 可以處理計(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ù)倪^程:

  1. #include "2410lib.h"  
  2.   
  3. /********************************************************************************************* 
  4. * name:     uart0_test 
  5. * func:     uart test function 
  6. * para:     none 
  7. * ret:      none 
  8. * modify: 
  9. * comment:       
  10. *********************************************************************************************/  
  11. void uart0_test()  
  12. {  
  13.     char cInput[256];  
  14.     UINT8T ucInNo=0;  
  15.     char c;  
  16.     uart_init(0,115200,0); //define the baud rate  
  17.     uart_printf("\n UART0 Communication Test Example\n");     
  18.     uart_printf(" Please input words, then press Enter:\n");  
  19. #ifdef BOARDTEST      
  20.     sprintf(&cInput, "Type via UART0 to test.");  
  21.     print_lcd(195,170,0x1c,&cInput);      
  22. #endif  
  23.     uart_printf(" ");  
  24.     g_nKeyPress = 1;  
  25.     while(g_nKeyPress==1)           // only for board test to exit  
  26.     {  
  27.         c=uart_getch();  
  28.         //uart_sendbyte(c);  
  29.           
  30.         uart_printf("%c",c);  
  31.         if(c!='\r')  
  32.             cInput[ucInNo++]=c;  
  33.         else  
  34.         {  
  35.             cInput[ucInNo]='\0';  
  36.             break;  
  37.         }  
  38.     }  
  39.     delay(1000);      
  40.   
  41.     uart_printf(" \nThe words that you input are: %s\n",cInput);          
  42.     uart_printf(" end.\n");   
  43. }  
  44.   
  45. void Main(int argc,char **argv)  
  46. {  
  47.       
  48.     sys_init();         // Initial s3c2410's Clock, MMU, Interrupt,Port and UART       
  49.       
  50.     while(1)  
  51.     {  
  52.         uart0_test();  
  53.     }  
  54.     for(;;);  
  55.   
  56. }  

在這里我們使用 uart_init 函數(shù)便完成了UART各個(gè)位的設(shè)置,現(xiàn)在來看看uart_init在系統(tǒng)中是如何定義的:

  1. void uart_init(int nMainClk, int nBaud, int nChannel)  
  2. {  
  3.     int i;  
  4.       
  5.     if(nMainClk == 0)  
  6.     nMainClk    = PCLK;  
  7.       
  8.     switch (nChannel)  
  9.     {  
  10.         case UART0:   
  11.         rUFCON0 = 0x0;   //UART channel 0 FIFO control register, FIFO disable  
  12.         rUMCON0 = 0x0;   //UART chaneel 0 MODEM control register, AFC disable  
  13.         rULCON0 = 0x3;   //Line control register : Normal,No parity,1 stop,8 bits  
  14.         // [10]       [9]     [8]     [7]          [6]      [5]        [4]         [3:2]          [1:0]  
  15.         // Clock Sel, Tx Int, Rx Int, Rx Time Out, Rx err,  Loop-back, Send break, Transmit Mode, Receive Mode  
  16.         // 0          1       0,      0            1        0          0,          01             01  
  17.         // PCLK       Level   Pulse   Disable      Generate Normal     Normal      Interrupt or Polling  
  18.         rUCON0  = 0x245;                            // Control register  
  19.         //rUBRDIV0=( (int)(nMainClk/16./nBaud) -1 );    // Baud rate divisior register 0  
  20.         rUBRDIV0=( (int)(nMainClk/16./nBaud+0.5) -1 );  // Baud rate divisior register 0      
  21.         break;  
  22.               
  23.     case UART1:   
  24.         rUFCON1 = 0x0;   //UART channel 1 FIFO control register, FIFO disable  
  25.         rUMCON1 = 0x0;   //UART chaneel 1 MODEM control register, AFC disable  
  26.         rULCON1 = 0x3;  
  27.         rUCON1  = 0x245;  
  28.         rUBRDIV1=( (int)(nMainClk/16./nBaud) -1 );  
  29.         break;  
  30.               
  31.         case UART2:   
  32.         rULCON2 = 0x3;  
  33.         rUCON2  = 0x245;  
  34.         rUBRDIV2=( (int)(nMainClk/16./nBaud) -1 );      
  35.         rUFCON2 = 0x0;   //UART channel 2 FIFO control register, FIFO disable  
  36.         break;  
  37.               
  38.     default:  
  39.         break;  
  40.     }  
  41.   
  42.     for(i=0;i<100;i++);  
  43.     delay(0);  
  44. }  

       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ù)!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多