Uart2.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:16k
源码类别:

uCOS

开发平台:

C/C++

  1. //====================================================================
  2. // File Name : uart2.c
  3. // Function  : S3C2440 UART-2 test code
  4. // Program   : Shin, On Pil (SOP)
  5. // Date      : May 30, 2002
  6. // Version   : 0.0
  7. // History
  8. // -2410
  9. //   0.0 : Programming start (February 20,2002) -> SOP
  10. //   1.0 (20020530) : First release for customer
  11. //   1.1 (20020801) : Strata NOR Flash Added and etc. -> SOP
  12. // -2440
  13. //   R0.0 (20030421): Modified for 2440. -> Junon
  14. //====================================================================
  15. #include <string.h>
  16. #include <stdlib.h>
  17. #include "2440addr.h"
  18. #include "2440lib.h"
  19. #include "def.h"
  20. #include "uart0.h"
  21. #include "uart2.h"
  22. void __irq Uart2_TxInt(void);
  23. void __irq Uart2_RxIntOrErr(void);
  24. void __irq Uart2_TxDmaDone(void);
  25. void __irq Uart2_RxDmaDone(void);
  26. void __irq Uart2_RxDmaOrErr(void);
  27. void __irq Uart2_TxFifo(void);
  28. void __irq Uart2_RxFifoOrErr(void);
  29. void __sub_Uart2_RxInt(void);
  30. void __sub_Uart2_RxFifo(void);
  31. void __sub_Uart2_RxErrInt(void);
  32. volatile static char *uart2TxStr;
  33. volatile static char *uart2RxStr;
  34. //---------------------------------------UART2 test function-------------------------------------
  35. void __irq Uart2_TxInt(void)
  36. {
  37.     rINTSUBMSK|=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2); // Just for the safety
  38.     if(*uart2TxStr != '')
  39.     {
  40.      WrUTXH2(*uart2TxStr++);
  41.         ClearPending(BIT_UART2); // Clear master pending
  42.         rSUBSRCPND=(BIT_SUB_TXD2);
  43.         rINTSUBMSK&=~(BIT_SUB_TXD2); // Unmask sub int
  44.     }
  45.     else
  46.     {
  47.      isTxInt=0;
  48.         ClearPending(BIT_UART2); // Clear master pending
  49.         rSUBSRCPND=(BIT_SUB_TXD2);
  50.         rINTMSK|=(BIT_UART2); // Unmask sub int
  51.     }
  52. }
  53. void __irq Uart2_RxIntOrErr(void)
  54. {
  55.     rINTSUBMSK|=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  56.     if(rSUBSRCPND&BIT_SUB_RXD2) __sub_Uart2_RxInt();
  57.     else __sub_Uart2_RxErrInt();
  58.     ClearPending(BIT_UART2);
  59.     rSUBSRCPND=(BIT_SUB_RXD2|BIT_SUB_ERR2); // Clear Sub int pending    
  60.     rINTSUBMSK&=~(BIT_SUB_RXD2|BIT_SUB_ERR2);    
  61. }
  62. void __irq Uart2_TxDmaDone(void)
  63. {
  64.     rDMASKTRIG3=0x0; // Stop Dma3
  65.     isDone=0;
  66.     rINTMSK |= BIT_DMA3;
  67.     ClearPending(BIT_DMA3);
  68. }
  69. void __irq Uart2_RxDmaDone(void)
  70. {
  71.     rDMASKTRIG3=0x0; //DMA3 Channel Off
  72.     isDone=0;
  73.     *(uart2RxStr+5)='';
  74.     rINTMSK|=(BIT_DMA3);
  75.     ClearPending(BIT_DMA3);
  76. }
  77. void __irq Uart2_RxDmaOrErr(void)
  78. {
  79.     rINTSUBMSK|=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  80.     if(rSUBSRCPND&BIT_SUB_RXD2) Uart_Printf("Error : UART2 Rx Interrupt is occured!!!n");
  81.     else __sub_Uart2_RxErrInt();
  82.     ClearPending(BIT_UART2);
  83.     rSUBSRCPND=(BIT_SUB_ERR2); // Clear Sub int pending    
  84.     rINTSUBMSK&=~(BIT_SUB_ERR2);    
  85. }
  86. void __irq Uart2_TxFifo(void)
  87. {
  88.     rINTSUBMSK|=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2); // Just for the safety
  89.     while (!(rUFSTAT2 & 0x4000) && (*uart2TxStr != ''))  //until tx fifo full or end of string
  90.      WrUTXH2(*uart2TxStr++);
  91.     if(*uart2TxStr == '') 
  92.     {
  93.      rINTMSK|=BIT_UART2;
  94.         rSUBSRCPND=BIT_SUB_TXD2; // Clear Sub int pending
  95.         ClearPending(BIT_UART2); // Clear master pending
  96.     }
  97.     else 
  98.     {
  99.         ClearPending(BIT_UART2); // Clear master pending
  100.         rSUBSRCPND=BIT_SUB_TXD2; // Clear Sub int pending
  101.         rINTSUBMSK&=~(BIT_SUB_TXD2); // Unmask sub int
  102.     }
  103. }
  104. void __irq Uart2_RxFifoOrErr(void)
  105. {
  106.     rINTSUBMSK|=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  107.     if(rSUBSRCPND&BIT_SUB_RXD2) __sub_Uart2_RxFifo();
  108.     else __sub_Uart2_RxErrInt();
  109.     ClearPending(BIT_UART2);
  110.     rSUBSRCPND=(BIT_SUB_RXD2|BIT_SUB_ERR2);
  111.     rINTSUBMSK&=~(BIT_SUB_RXD2|BIT_SUB_ERR2);
  112. }
  113. void __sub_Uart2_RxInt(void)
  114. {
  115.     if(RdURXH2()!='r') 
  116.     {
  117.      Uart_Printf("%c",RdURXH2());
  118.        *uart2RxStr++ =(char) RdURXH2();
  119.     }
  120.     else
  121.     {
  122.      isRxInt=0;
  123.      *uart2RxStr='';
  124.      Uart_Printf("n");
  125.     }
  126. }
  127. void __sub_Uart2_RxFifo(void)
  128. {
  129.     while(rUFSTAT2&0x7f) //During the Rx FIFO is not empty
  130.     {
  131. rx_point++;
  132. if(rx_point<5)
  133.  rx_filesize |= (RdURXH2()<<(8*(rx_point-1))); // First 4-bytes mean file size
  134. else if(rx_point>(rx_filesize-2))
  135. {
  136. rx_dncs |= (RdURXH2()<<(8*(1-(rx_filesize-rx_point)))); //Last 2-bytes mean checksum.
  137. if(rx_point==rx_filesize) rx_isdone=0;
  138. }
  139. else
  140. rx_checksum+=RdURXH2();
  141.     }
  142. }
  143.   
  144. void __sub_Uart2_RxErrInt(void)
  145. {
  146.     switch(rUERSTAT2)//to clear and check the status of register bits
  147.     {
  148. case 1:
  149.     Uart_Printf("Overrun errorn");
  150.     break;
  151. case 2:
  152.     Uart_Printf("Parity errorn");
  153.     break;
  154. case 4:
  155.     Uart_Printf("Frame errorn");
  156.     break;
  157. case 8:
  158.     Uart_Printf("Breake detectn");
  159.     break;
  160. default :
  161.     break;
  162.     }
  163.     isRxInt=0;
  164. }
  165. void Test_Uart2_Int(void)
  166. {
  167. U8 ch;
  168.     Uart_Port_Set(); 
  169.     // Additional configuration for UART2 port
  170.     //rGPHCON&=0x3fafff;      // TXD2,RXD2
  171.     Uart_Select(1);    
  172. /******** For operating clock test *********/
  173. Uart_Printf("[Uart channel 0 Interrupt test]n");
  174. Uart_Printf("Select operating clock 1. PCLK(D)    2. UCLK     3. FCLK/n  nChoose : ");
  175. ch = Uart_Getch();
  176. switch (ch)
  177. {
  178. case '2' :
  179. Uart_Uextclk_En(2, 115200, 14745600);
  180. break;
  181. case '3' :
  182. Uart_Fclkn_En(2, 115200);
  183. break;
  184. default :
  185. Uart_Pclk_En(2, 115200);
  186. }
  187. /******** Select UART or IrDA *********/
  188. Uart_Printf("Select 1. UART or 2. IrDA(D) modenChoose : ");
  189. if (Uart_Getch() == '1')
  190. rULCON2 &= ~(1<<6); // UART mode
  191. else
  192. rULCON2 |= (1<<6); // IrDA mode
  193.     /*********** UART2 Tx test with interrupt ***********/  
  194.     isTxInt=1;
  195.     uart2TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART2 Tx interrupt test is good!!!!rn";
  196.     Uart_Printf("[Uart channel 2 Tx Interrupt Test]n");
  197.     //-------------------------------------------------------------------------------------------->
  198.     Uart_Printf("Jumper Setting  <======> J17:2-3, J19:2-3, J16: 1-2, J18:1-2");
  199.     Uart_Printf("nConnect PC[COM1 or COM2] and UART2 of SMDK2440 with a serial cable!!! n");
  200.     Uart_Printf("Then, press any key........n");
  201.     Uart_Select(2); // Change the uart port    
  202.     Uart_Getch();
  203.     //----------------------------------------->
  204.     pISR_UART2=(unsigned)Uart2_TxInt;
  205.     rULCON2=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  206.     rUCON2 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  207.     //Clock,Tx:Def,Rx:Def,Rx timeout:x,Rx error int:x,Loop-back:x,Send break:x,Tx:int,Rx:int
  208.     Uart_TxEmpty(1); //wait until tx buffer is empty.
  209.     rINTMSK=~(BIT_UART2);
  210.     rINTSUBMSK=~(BIT_SUB_TXD2);
  211.     while(isTxInt);
  212.     /*********** UART2 Rx test with interrupt ***********/
  213.     isRxInt=1;
  214.     uart2RxStr=(volatile char *)UARTBUFFER;
  215.     Uart_Printf("n[Uart channel 2 Rx Interrupt Test]:n");
  216.     Uart_Printf("After typing ENTER key, you will see the characters which was typed by you.");
  217.     Uart_Printf("nTo quit, press ENTER key.!!!n");
  218.     
  219.     pISR_UART2 =(unsigned)Uart2_RxIntOrErr;
  220.     rULCON2=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  221.     rUCON2 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  222.     //Clock,Tx:pulse,Rx:pulse,Rx timeout:x,Rx error int:o,Loop-back:x,Send break:x,Tx:int,Rx:int
  223.     // Clear Int Pending and Unmask
  224.     ClearPending(BIT_UART2);
  225.     rINTMSK=~(BIT_UART2);
  226.     rSUBSRCPND=(BIT_SUB_RXD2|BIT_SUB_ERR2);
  227.     rINTSUBMSK=~(BIT_SUB_RXD2|BIT_SUB_ERR2);
  228.     
  229.     while(isRxInt);
  230.     rINTSUBMSK|=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  231.     rINTMSK|=(BIT_UART2);
  232.     Uart_Printf("%sn",(char *)UARTBUFFER);
  233.     //----------------------------------------------------------------------------------------->    
  234.     Uart_Printf("Jumper Setting  <======>  J16: 2-3, J18:2-3");
  235.     Uart_Printf("nConnect PC[COM1 or COM2] and UART1 of SMDK2440 with a serial cable!!! n");
  236.     Uart_Printf("Then, press any key........n");
  237.     Uart_Select(1);
  238.     Uart_Getch();
  239.     //--------------------------->
  240.     Uart_Port_Return();
  241. }
  242. void Test_Uart2_Dma(void)
  243. {
  244.     Uart_Port_Set(); 
  245.     // Additional configuration for UART2 port
  246.     //rGPHCON&=0x3fafff;      // TXD2,RXD2
  247.     
  248.     Uart_Select(1);    
  249.     /*********** UART2 Tx test with DMA3 ***********/ 
  250.     isDone=1;
  251.     uart2TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART2 Tx Test by DMA3 is good!!!!rn";
  252.     Uart_Printf("n[Uart channel 2 DMA3 Tx Test]n");
  253.     Uart_TxEmpty(1);
  254.     
  255.     //-------------------------------------------------------------------------------------------->
  256.     Uart_Printf("Jumper Setting  <======>  J17:2-3, J19:2-3, J16: 1-2, J18:1-2");
  257.     Uart_Printf("nConnect PC[COM1 or COM2] and UART2 of SMDK2440 with a serial cable!!! n");
  258.     Uart_Printf("Then, press any key........n");
  259.     Uart_Select(2); // Change the uart port    
  260.     Uart_Getch();
  261.     Uart_Printf("Port is changed.......n");
  262.     //----------------------------------------->
  263.   
  264.     
  265.     pISR_DMA3  =(unsigned)Uart2_TxDmaDone;
  266.     rULCON2=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  267.     rUCON2 = (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(2<<2)|(1);
  268.     //Clock,Tx:Def,Rx:Def,Rx timeout:x,Rx error int:x,Loop-back:x,Send break:x,Tx:dma3,Rx:int
  269.     /***DMA3 init***/
  270.     rDISRC3=(U32)uart2TxStr; // Start address
  271.     rDISRCC3=(0<<1)|(0); // AHB,Increment
  272.     rDIDST3=(U32)UTXH2; // Memory buffer Address
  273.     rDIDSTC3=(1<<1)|(1); // APB,Fixed
  274.     rDCON3=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(0<<24)|(1<<23)|(1<<22)|(0<<20)|strlen((char*)uart2TxStr);
  275.     //handshake, sync PCLK, TC int, single tx, single service, Uart2, H/W request,auto-reload off, Byte size Tx, Tx count value
  276.     rINTMSK=~(BIT_DMA3);
  277.     rDMASKTRIG3=(0<<2)|(1<<1)|(0);    //no-stop, DMA3 channel on, no-SW trigger 
  278.     while(isDone);
  279.     /*********** UART2 Rx test with DMA3 ***********/ 
  280.     isDone=1;
  281.     uart2RxStr=(char *)UARTBUFFER;
  282.     Uart_Printf("n[Uart channel 2 DMA3 Rx Test]n");
  283.     Uart_Printf("Type any five keys!!!n");    
  284.     Uart_Printf("Then you will see what you typed.n");
  285.     pISR_DMA3=(unsigned)Uart2_RxDmaDone;
  286.     pISR_UART2=(unsigned)Uart2_RxDmaOrErr;
  287.     
  288.     rULCON2=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  289.     rUCON2 &= 0x400; // For the PCLK <-> UCLK fuction  
  290.     rUCON2 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(2);
  291.     //Clock,Tx:Def,Rx:Def,Rx timeout:x,Rx error int:o,Loop-back:x,Send break:x,Tx:int,Rx:dma3
  292.     /***DMA3 init***/
  293.     rDISRC3=(U32)URXH2; // Start address
  294.     rDISRCC3=(1<<1)|(1); // APB,Fixed
  295.     rDIDST3=(U32)uart2RxStr; // Memory buffer Address
  296.     rDIDSTC3= (0<<1)|(0); // AHB,Increment
  297.     rDCON3=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(0<<24)|(1<<23)|(1<<22)|(0<<20)|(5);
  298.     //handshake, sync PCLK, TC int, single tx, single service, Uart2, H/W request,auto-reload off, Byte size Tx, Tx count value
  299.     // Clear Int Pending and Unmask
  300.     ClearPending(BIT_UART2);
  301.     rINTMSK=~(BIT_DMA3|BIT_UART2);
  302.     rSUBSRCPND=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  303.     rINTSUBMSK=~(BIT_SUB_ERR2);
  304.     rDMASKTRIG3=(0<<2)|(1<<1)|(0);    //no-stop, DMA3 channel on, no-SW trigger 
  305.     while(isDone);
  306.     Uart_Printf("%sn",uart2RxStr);
  307.     
  308.     //----------------------------------------------------------------------------------------->    
  309.     Uart_Printf("Jumper Setting  <======>  J16: 2-3, J18:2-3");
  310.     Uart_Printf("nConnect PC[COM1 or COM2] and UART1 of SMDK2440 with a serial cable!!! n");
  311.     Uart_Printf("Then, press any key........n");
  312.     Uart_Select(1);
  313.     Uart_Getch();
  314.     //--------------------------->
  315.     Uart_Port_Return();
  316. }
  317. void Test_Uart2_Fifo(void)
  318. {
  319.     Uart_Port_Set(); 
  320.     // Additional configuration for UART2 port
  321.     //rGPHCON&=0x3fafff;      // TXD2,RXD2
  322.     Uart_Select(1);
  323.     /******* UART2 Tx FIFO test with interrupt ********/     
  324.     Uart_Printf("[Uart channel 2 Tx FIFO Interrupt Test]n");
  325.     Uart_TxEmpty(1); //wait until tx buffer is empty.
  326.     
  327.     //-------------------------------------------------------------------------------------------->
  328.     Uart_Printf(" Jumper Setting  <======> J17:2-3, J19:2-3, J16: 1-2, J18:1-2");
  329.     Uart_Printf("nConnect PC[COM1 or COM2] and UART2 of SMDK2440 with a serial cable!!! n");
  330.     Uart_Printf("Then, press any key........n");
  331.     Uart_Select(2); // Change the uart port    
  332.     Uart_Getch();
  333.     //----------------------------------------->
  334.     
  335.     
  336.     /* <Tx Trigger Level:8Byte> */    
  337.     uart2TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART2 Tx FIFO interrupt(8byte) test is good!!!!rn";
  338.     pISR_UART2=(U32)Uart2_TxFifo;
  339.     rULCON2=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  340.     rUCON2 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  341.     //Clock,Tx:Def,Rx:Def,Rx timeout:x,Rx error int:x,Loop-back:x,Send break:x,Tx:int,Rx:int
  342.     rUFCON2=(2<<6)|(1<<4)|(1<<2)|(1<<1)|(1);
  343.     //Tx and Rx FIFO Trigger Level:8byte,Tx and Rx FIFO Reset,FIFO on
  344.     rINTMSK=~(BIT_UART2);
  345.     rINTSUBMSK=~(BIT_SUB_TXD2);
  346.     Delay(500);
  347.     rUFCON2=(2<<6)|(1<<4)|(1<<2)|(1<<1)|(0);
  348.     //Tx and Rx FIFO Trigger Level:8byte,Tx and Rx FIFO Reset,FIFO off
  349.     /* <Tx Trigger Level:12Byte> */    
  350.     uart2TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART2 Tx FIFO interrupt(12byte) test is good!!!!rn";
  351.     pISR_UART2=(unsigned)Uart2_TxFifo;
  352.     rULCON2=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  353.     rUCON2 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  354.     //Clock,Tx:Def,Rx:Def,Rx timeout:x,Rx error int:x,Loop-back:x,Send break:x,Tx:int,Rx:int
  355.     rUFCON2=(3<<6)|(2<<4)|(1<<2)|(1<<1)|(1);
  356.     //Tx and Rx FIFO Trigger Level:12byte,Tx and Rx FIFO Reset,FIFO on
  357.     rINTMSK=~(BIT_UART2);
  358.     rINTSUBMSK=~(BIT_SUB_TXD2);
  359.     Delay(500);
  360.     rUFCON2=(3<<6)|(2<<4)|(1<<2)|(1<<1)|(0);
  361.     //Tx and Rx FIFO Trigger Level:12byte,Tx and Rx FIFO Reset,FIFO off
  362.     
  363.     /******* UART2 Rx FIFO test with interrupt ********/     
  364.     rx_dncs=0;
  365.     rx_point=0;
  366.     rx_isdone=1;
  367.     rx_filesize=0;
  368.     rx_checksum=0;
  369.     Uart_Printf("[Uart channel 2 Rx FIFO Interrupt Test]n");
  370.     pISR_UART2=(unsigned)Uart2_RxFifoOrErr;
  371.     rULCON2=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  372.     rUCON2 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(1<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  373.     //Clock,Tx:Def,Rx:Def,Rx timeout:o,Rx error int:o,Loop-back:x,Send break:x,Tx:int,Rx:int
  374.     rUFCON2=(1<<6)|(0<<4)|(1<<2)|(1<<1)|(1);
  375.     //Tx and Rx FIFO Trigger Level:4byte,Tx and Rx FIFO Reset,FIFO on
  376.     // Clear Int Pending and Unmask 
  377.     ClearPending(BIT_UART2);
  378.     rINTMSK=~(BIT_UART2);
  379.     rSUBSRCPND=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  380.     rINTSUBMSK=~(BIT_SUB_RXD2|BIT_SUB_ERR2);
  381.     Uart_Printf("Download the target file[*.bin] by Uart2n");
  382.     while(rx_isdone);
  383.     rINTMSK |= (BIT_UART2);
  384.     rINTSUBMSK|=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  385.     rUFCON2=(3<<6)|(2<<4)|(1<<2)|(1<<1)|(0);
  386.     //Tx and Rx FIFO Trigger Level:12byte,Tx and Rx FIFO Reset,FIFO off
  387.     if(rx_dncs==(rx_checksum&0xffff)) 
  388. Uart_Printf("nDownload test OK!!!n");
  389.     else 
  390. Uart_Printf("nError!!!n");
  391.     //----------------------------------------------------------------------------------------->    
  392.     Uart_Printf("Jumper Setting  <======>  J16: 2-3, J18:2-3");
  393.     Uart_Printf("nConnect PC[COM1 or COM2] and UART1 of SMDK2440 with a serial cable!!! n");
  394.     Uart_Printf("Then, press any key........n");
  395.     Uart_Select(1);
  396.     Uart_Getch();
  397.     //--------------------------->
  398.     Uart_Port_Return();
  399. }