分享

嵌入式学习笔记之UART通信协议

 昵称2009261 2014-04-25

        UART是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了数据终端设备接口,这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。作为接口的一部分,UART还提供以下功能:

  1. 将由计算机内部传送过来的并行数据转换为输出的串行数据流;
  2. 将计算机外部来的串行数据转换为字节,供计算机内部使用并行数据的器件使用;
  3. 在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验;
  4. 在输出数据流中加入启停标记,并从接收数据流中删除启停标记;
  5. 处理由键盘或鼠标发出的中断信号(键盘和鼠票也是串行设备);
  6. 可以处理计算机与外部串行设备的同步管理问题;

       

异步串口通信协议,工作原理是将传输数据的每个字符以串行方式一位接一位的传输。如下图:

          

 

其中每一位(bit)的意义如下:

     起始位:先发出一个逻辑“0”的信号,表示传输字符的开始。

     数据位:紧跟起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟来定位。

     奇偶校验位:数据位加上这一位后(跟在数据位尾部),使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。

     停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平(逻辑“1”)。

     空闲位:处于逻辑“1”状态,表示当前线路上没有数据的传送。

    波特率:是衡量数据传输速率的指针。表示为每秒钟传送的二进制位数(bit数)。例如资料传送速率为120字符/秒,而每一个字符为10位,则其传送的波特率为:

                                                                                10×120   =  1200字符/秒=1200波特。

     以上的数据位、奇偶校验位、波特率等均可以在COM接口中设置。也可以在代码中对UART寄存器的各位进行设置,UART寄存器的各位所代表的含义如下:

   

             下面通过几个小程序,了解UART通信协议进行数据传输的过程:

  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 函数便完成了UART各个位的设置,现在来看看uart_init在系统中是如何定义的:

  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 便是开发板为我们提供的三个寄存器,通过rUFCON、rUMCON、rULCON、rUCON、rUBRDIV 等引脚的赋值完成UART寄存器的设置。

       关于更多ARM开发板的源码,由于CSDN资源分享的页面出现异常无法上传分享,如有需要、给我留言,我发给大家。

       “往往都是事情改变人,人却改变不了事情。”既是如此,为何不先改变自己呢?

       明天、学习继续!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多