UART.C
上传用户:jndfzc
上传日期:2014-06-02
资源大小:325k
文件大小:6k
源码类别:

单片机开发

开发平台:

Others

  1. #include "define.h"
  2. #include "uart.h"
  3. #include  "maindef.h"
  4. //232
  5. #define SENDD(PB,c) *(volatile unsigned char*)(PB+USTHR)=(char)c
  6. #define RECVD(PB) *(volatile unsigned char*)(PB+USRHR)&0xff
  7. #define GET_USCSR(PB) *(volatile unsigned char*)(PB+USCSR)
  8. #define UART0_BASE 0xFFFD0000 //A port
  9. #define UART1_BASE  0XFFFCC000 //B port
  10. #define UART422_BASE 0x700008
  11. #define UART485_BASE 0x700000
  12. #define baud_2400  0x30
  13. #define baud_4800  0x18
  14. #define baud_9600  0x0c
  15. #define baud_192  0x06
  16. #define baud_384  0x03
  17. #define baud_1152  0x01    
  18. //16c552
  19. #define  aComPortBaseAddr     (*(volatile unsigned char *)0x00700008)
  20. #define  aRecBuffer           (*(volatile unsigned char *)0x00700008)
  21. #define  aTransBuffer         (*(volatile unsigned char *)0x00700008)
  22. #define  aInterruptEnable     (*(volatile unsigned char *)0x00700009)
  23. #define  aIntIdentify         (*(volatile unsigned char *)0x0070000a)
  24. #define  aFIFO_Control        (*(volatile unsigned char *)0x0070000a)
  25. #define  aLineControl         (*(volatile unsigned char *)0x0070000b)
  26. #define  aModemControl        (*(volatile unsigned char *)0x0070000c)
  27. #define  aLineStatus          (*(volatile unsigned char *)0x0070000d)
  28. #define  aModemStatus         (*(volatile unsigned char *)0x0070000e)
  29. #define  aLSB_DivisorLatch    (*(volatile unsigned char *)0x00700008)
  30. #define  aMSB_DivisorLatch    (*(volatile unsigned char *)0x00700009)
  31. //com0
  32. #define  COM0_USBRGR          (*(volatile unsigned int  *)0xFFFD0020)
  33. #define  COM0_USMR            (*(volatile unsigned int  *)0xFFFD0004)
  34. #define  COM0_USCR            (*(volatile unsigned int  *)0xFFFD0000)
  35. #define  COM0_USCSR           (*(volatile unsigned int  *)0xFFFD0014)
  36. #define  COM0_RHR             (*(volatile unsigned char *)0xFFFD0018)
  37. #define  COM0_THR             (*(volatile unsigned char *)0xFFFD001c)
  38. struct  comm_buf_fm  PortA;
  39. struct  comm_buf_fm  Comm0;
  40. void UART_init(unsigned int port,unsigned int baud)
  41. {
  42. unsigned int UART_BASE=port?UART1_BASE:UART0_BASE;
  43. *(volatile unsigned *)(PIO_PDR)=0xE000; //pio disable
  44. *(volatile unsigned *)(UART_BASE+USBRGR)=baud;
  45. *(volatile unsigned *)(UART_BASE+USCR) = 0x15c;
  46. *(volatile unsigned *)(UART_BASE+USMR) = 0x8c0; //8bit,1 stop bit,no parity
  47. // *(volatile unsigned *)(UART_BASE+UCON) = 0x09; //Enable Interrupt
  48. *(volatile unsigned *)(UART_BASE+USCR) = 0x050;
  49. }
  50. /*
  51. void UART_trans(unsigned port,char d)
  52. {
  53. unsigned int UART_BASE=port?UART1_BASE:UART0_BASE;
  54. while((GET_USCSR(UART_BASE) & 0x2)!=0X2);
  55. SENDD(UART_BASE,d);
  56. }
  57. char UART_recev(unsigned port)
  58. {
  59. int i;
  60. unsigned int UART_BASE=port?UART1_BASE:UART0_BASE;
  61. for(i=0;i<1000;i++)
  62. {
  63. if((GET_USCSR(UART_BASE) & 0x1)==0x1)
  64. {
  65. break;
  66. }
  67. }
  68. return RECVD(UART_BASE);
  69. }
  70. void UART_send(unsigned port,char *buf,int BufLen)
  71. {
  72. unsigned int UART_BASE=port?UART1_BASE:UART0_BASE;
  73. int i=0;
  74. while(i<BufLen)
  75. {
  76. while((GET_USCSR(UART_BASE) & 0x2)!=0X2);
  77. SENDD(UART_BASE,buf[i++]);
  78. }
  79. }
  80. int UART_get(unsigned port,char *buf,int BufLen)
  81. {
  82. int count=0;
  83. unsigned int UART_BASE=port?UART1_BASE:UART0_BASE;
  84. int status=1;
  85. for(count=0;count<BufLen;count++)
  86. {
  87. while(!(status=(GET_USCSR(UART_BASE) & 0x1)));
  88. if(status)
  89. buf[count]=RECVD(UART_BASE);
  90. else
  91. buf[count]=0;
  92. }
  93. return count;
  94. }
  95. void UART_pdcsend(unsigned port,char *buf,int BufLen)
  96. {
  97. unsigned int UART_BASE=port?UART1_BASE:UART0_BASE;
  98. while((GET_USCSR(UART_BASE) & 0x12)!=0X12);
  99. *(volatile unsigned *)(UART_BASE+USTPR)=buf;
  100. *(volatile unsigned *)(UART_BASE+USTCR)=BufLen;
  101. }*/
  102. //422
  103. void UART422_init(unsigned char baud)
  104. {
  105.    aLineControl = 0x80;            /*Enable  Set  Baudrate*/
  106.    aLSB_DivisorLatch = baud;  /*Set Baudrate*/
  107.    aMSB_DivisorLatch = 0;
  108.    aLineControl = 0x03;
  109.    aFIFO_Control = 0xc9;           /* enable  FIFO  */ 
  110.    aInterruptEnable = 0x00;
  111. }
  112. void  UART422_server(void)
  113. {
  114.   unsigned char  temp;
  115.   if( aLineStatus & 0x1E )
  116.     {
  117.       temp = aRecBuffer;
  118.     }
  119.   if( aLineStatus & 0x01 )
  120.     {
  121.       PortA.RecvBuf[PortA.RecvSet] = aRecBuffer;
  122.       PortA.RecvSet++;
  123.       if((PortA.RecvSet) >= RECVNUM)
  124.        PortA.RecvSet = 0; 
  125.        //PortA.RecvFlag = 1;
  126.     }
  127.   if( aLineStatus & 0x20 ) 
  128.     {
  129.       if( PortA.SendSet != PortA.SendGet )
  130.         {
  131.            aTransBuffer = PortA.SendBuf[PortA.SendGet];
  132.            PortA.SendBuf[PortA.SendGet] = 0;
  133.            PortA.SendGet++;
  134.            if( (PortA.SendGet) >= SENDNUM )
  135.              PortA.SendGet = 0;
  136.              //PortA.SendFlag = 1;
  137.         } 
  138.     } 
  139. }
  140. void  Comm0Server(void)
  141. {
  142.  // unsigned char  temp;
  143. /*  if( COM0_USCSR & 0x1E0 )
  144.     {
  145.       temp = COM0_RHR;
  146.     }
  147.     */
  148.   if( (COM0_USCSR & 0x1) )
  149.     {
  150.       Comm0.RecvBuf[Comm0.RecvSet] = COM0_RHR;
  151.       Comm0.RecvSet++;
  152.       if((Comm0.RecvSet) >= RECVNUM)
  153.        Comm0.RecvSet = 0; 
  154.        //Comm0.RecvFlag = 1;
  155.     }
  156.   if( (COM0_USCSR & 0x2) ) 
  157.     {
  158.       if( Comm0.SendSet != Comm0.SendGet )
  159.         {
  160.            COM0_THR = Comm0.SendBuf[Comm0.SendGet];
  161.            Comm0.SendBuf[Comm0.SendGet]=0;
  162.            Comm0.SendGet++;
  163.            if( (Comm0.SendGet) >= SENDNUM )
  164.              Comm0.SendGet = 0;
  165.              //Comm0.SendFlag = 1;
  166.         } 
  167.     } 
  168. }
  169. void  InitCommBuf(void)
  170. {
  171.   PortA.RecvGet = PortA.RecvSet = 0;
  172.   Comm0.RecvGet = Comm0.RecvSet = 0;
  173.   UART422_init(baud_9600);
  174.   
  175.   UART_init(0,208);
  176.   
  177. }
  178. void  CommRun(void)
  179. {
  180.    UART422_server();
  181.    Comm0Server();
  182.    if((PortA.RecvSet) >= RECVNUM)
  183.        PortA.RecvSet = 0; 
  184.    if((PortA.RecvGet) >= RECVNUM)
  185.        PortA.RecvGet = 0; 
  186.    if((Comm0.RecvSet) >= RECVNUM)
  187.        Comm0.RecvSet = 0; 
  188.    if((Comm0.RecvGet) >= RECVNUM)
  189.        Comm0.RecvGet = 0; 
  190.    
  191.    
  192. }