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

uCOS

开发平台:

C/C++

  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include "2440addr.h"
  4. #include "2440lib.h"
  5. #include "def.h"
  6. #include "irda.h"
  7. #define IrDA_BUFLEN 0x100
  8. void IrDA_Port_Set(void);
  9. void IrDA_Port_Return(void);
  10. void __irq IrDA_TxInt(void);
  11. void __irq IrDA_RxOrErr(void);
  12. void __sub_IrDA_RxInt(void);
  13. void __sub_IrDA_RxErrInt(void);
  14. volatile U8 *IrDAdataPt;
  15. volatile U8 *IrDAdataFl;
  16. volatile U32 IrDA_cnt,IrDA_end,IrDA_err,IrDA_BAUD;
  17. volatile U32 sirda_rGPBCON,sirda_rGPBDAT,sirda_rGPBUP;
  18. volatile U32 sirda_rGPHCON,sirda_rGPHDAT,sirda_rGPHUP;
  19. volatile U32 sirda_ULCON2,sirda_UCON2,sirda_UFCON2,sirda_UMCON2,sirda_UBRDIV2;
  20. void * func_irda_test[][2]=
  21. {
  22. //     "0123456789012345" max 15磊 肺茄沥窍咯 comment窍技夸.
  23. //IrDA
  24. (void *)Test_IrDA_Rx,  "UART2 IrDA Rx  ",
  25. (void *)Test_IrDA_Tx,  "UART2 IrDA Tx  ",
  26. 0,0
  27. };
  28. void IrDA_Test(void)
  29. {
  30. int i;
  31. Uart_Printf("n======  IrDA Test program start ======n");
  32. while(1)
  33. {
  34. i=0;
  35. Uart_Printf("nn");
  36. while(1)
  37. {   //display menu
  38. Uart_Printf("%2d:%s",i,func_irda_test[i][1]);
  39. i++;
  40. if((int)(func_irda_test[i][0])==0)
  41. {
  42. Uart_Printf("n");
  43. break;
  44. }
  45. if((i%4)==0)
  46. Uart_Printf("n");
  47. }
  48. Uart_Printf("nPress Enter key to exit : ");
  49. i = Uart_GetIntNum();
  50. if(i==-1) break; // return.
  51. if(i>=0 && (i<((sizeof(func_irda_test)-1)/8)) ) // select and execute...
  52. ( (void (*)(void)) (func_irda_test[i][0]) )();
  53. }
  54. Uart_Printf("n====== IrDA Test program end ======n");
  55. }
  56. void IrDA_Port_Set(void)
  57. {
  58.     //Push UART GPIO port configuration
  59.     sirda_rGPBCON=rGPBCON; 
  60.     sirda_rGPBDAT=rGPBDAT;
  61.     sirda_rGPBUP=rGPBUP;
  62.     sirda_rGPHCON=rGPHCON; 
  63.     sirda_rGPHDAT=rGPHDAT;
  64.     sirda_rGPHUP=rGPHUP;
  65.     //Configure IrDA port
  66.     rGPBDAT|=(1<<1);
  67.     rGPBCON&=0x3ffff3;
  68.     rGPBCON|=(1<<2); // Output(nIrDATXDEN)
  69.     rGPBUP|=(1<<1); //Uart port pull-up disable
  70.     rGPHCON&=0x3c0fff;
  71.     rGPHCON|=0x2a000; // TXD2,RXD2
  72.     rGPHUP|=0x1c0; //Uart port pull-up disable
  73.     //Push Uart control registers 
  74.     sirda_ULCON2=rULCON2;
  75.     sirda_UCON2 =rUCON2;
  76.     sirda_UFCON2=rUFCON2;
  77.     sirda_UMCON2=rUMCON2;
  78.     sirda_UBRDIV2=rUBRDIV2;
  79. }       
  80.         
  81. void IrDA_Port_Return(void)
  82. {       
  83.     //Pop UART GPIO port configuration
  84.     rGPBCON=sirda_rGPBCON;
  85.     rGPBDAT=sirda_rGPBDAT;
  86.     rGPBUP =sirda_rGPBUP;
  87.     rGPHCON=sirda_rGPHCON;
  88.     rGPHDAT=sirda_rGPHDAT;
  89.     rGPHUP =sirda_rGPHUP;
  90.     //Pop Uart control registers 
  91.     rULCON2=sirda_ULCON2;
  92.     rUCON2 =sirda_UCON2;
  93.     rUFCON2=sirda_UFCON2;
  94.     rUMCON2=sirda_UMCON2;
  95.     rUBRDIV2=sirda_UBRDIV2;
  96. }
  97. void __irq IrDA_TxInt(void)
  98. {
  99.     rINTSUBMSK|=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  100.     if(IrDA_cnt < (IrDA_BUFLEN))
  101.     {
  102. Uart_Printf("%d,",*IrDAdataPt);
  103. WrUTXH2(*IrDAdataPt++);
  104. IrDA_cnt++;
  105. ClearPending(BIT_UART2);
  106.         rSUBSRCPND=(BIT_SUB_TXD2);
  107.         rINTSUBMSK&=~(BIT_SUB_TXD2);
  108.     }
  109.     else
  110.     {
  111. IrDA_end=1;
  112. while(rUFSTAT2 & 0x2f0); //Until FIFO is empty
  113. while(!(rUTRSTAT2 & 0x4)); //Until Tx shifter is empty
  114.         ClearPending(BIT_UART2);
  115. rINTMSK|=BIT_UART2;
  116.     }
  117. }
  118. void __irq IrDA_RxOrErr(void)
  119. {
  120.     rINTSUBMSK|=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2); // Just for the safety
  121.     if(rSUBSRCPND&BIT_SUB_RXD2) __sub_IrDA_RxInt();
  122.     else __sub_IrDA_RxErrInt();
  123.     rSUBSRCPND=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  124.     rINTSUBMSK&=~(BIT_SUB_RXD2|BIT_SUB_ERR2);
  125.     ClearPending(BIT_UART2);
  126. }
  127. void __sub_IrDA_RxInt(void)
  128. {
  129.     while( (rUFSTAT2 & 0x100) || (rUFSTAT2 & 0xf)  )
  130.     {
  131. *IrDAdataPt=rURXH2;
  132. *IrDAdataPt++;
  133. IrDA_cnt++;
  134.     }
  135.     if(IrDA_cnt >= IrDA_BUFLEN)
  136.     {
  137.      IrDA_end=1;
  138.      rINTMSK|=BIT_UART2;
  139.     }
  140. }
  141. void __sub_IrDA_RxErrInt(void)
  142. {
  143.     switch(rUERSTAT2)//to clear and check the status of register bits
  144.     {
  145. case '1':
  146.     Uart_Printf("Overrun errorn");
  147.     break;
  148. case '2':
  149.     Uart_Printf("Parity errorn");
  150.     break;
  151. case '4':
  152.     Uart_Printf("Frame errorn");
  153.     break;
  154. case '8':
  155.     Uart_Printf("Breake detectn");
  156.     break;
  157. default :
  158.     break;
  159.     }
  160. }
  161. void Test_IrDA_Tx(void)
  162. {
  163.     int i;
  164.     IrDA_cnt=0;
  165.     IrDA_end=0;
  166.     IrDAdataFl=(volatile U8 *)IrDABUFFER;
  167.     IrDAdataPt=(volatile U8 *)IrDABUFFER;
  168.     IrDA_Port_Set();
  169.     Uart_Select(1);
  170.     for(i=0;i<IrDA_BUFLEN;i++) *IrDAdataFl++=i; // Initialize IrDA Tx data
  171.     pISR_UART2=(U32)IrDA_TxInt;
  172.     Uart_Printf("nSelect the baud raten"); // Select IrDA baud rate
  173.     Uart_Printf("1)9600    2)19200    3)38400    4)57600    5)115200n"); 
  174.     i=Uart_Getch ();
  175.     switch(i)
  176.     {
  177. case '1':
  178. IrDA_BAUD=9600;
  179.         break;
  180. case '2':
  181.         IrDA_BAUD=19200;
  182.         break;
  183. case '3':
  184.         IrDA_BAUD=38400;
  185.         break;
  186. case '4':
  187.         IrDA_BAUD=57600;
  188.         break;
  189. case '5':
  190.         IrDA_BAUD=115200;
  191.         break;
  192. default:
  193.         break;
  194.     }
  195.     rUBRDIV2=( (int)(PCLK/16./IrDA_BAUD) -1 );
  196.     Uart_Printf("rUBRDIV2=%dn", rUBRDIV2);
  197.     Uart_Printf("[UART IrDA Tx Test]n");
  198.     Uart_Printf("This test should be configured two boards.n");
  199.     Uart_Printf("Start Rx first and press any key and...n");
  200.     Uart_TxEmpty(1);
  201.     rGPBDAT &= ~(1<<1); // Enable nIrDATXDEN - GPB1
  202.     rUFCON2=(1<<6)|(0<<4)|(1<<2)|(1<<1)|(1);
  203.     //Tx and Rx FIFO Trigger Level:4byte,Tx and Rx FIFO Reset,FIFO on
  204.     rUCON2=(0<<10)|(1<<9)|(1<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<2)|(0); // From H/W    
  205.     rULCON2=(1<<6)|(0<<3)|(0<<2)|(3); // IrDA,No parity,One stop bit, 8bit
  206.     Uart_Getch();
  207.     rUCON2 |= (1<<2); // Tx enable
  208.     Uart_Printf("Now... Tx with IrDAn");
  209.     rINTMSK=~(BIT_UART2);
  210.     rINTSUBMSK=~(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  211.     while(!IrDA_end);
  212.     rINTSUBMSK|=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  213.     rUFCON2=(3<<6)|(2<<4)|(1<<2)|(1<<1)|(0);
  214.     rGPBDAT|=(1<<1); // Disable nIrDATXDEN        
  215.     Uart_Printf("nEnd Tx, transfer data count=%dn",IrDA_cnt);
  216.     IrDA_Port_Return();
  217. }
  218. void Test_IrDA_Rx(void)
  219. {
  220.     unsigned int i;
  221.     IrDA_cnt=0;
  222.     IrDA_end=0;
  223.     IrDA_err=0;
  224.     IrDAdataPt =(volatile U8 *)IrDABUFFER; // 0 initialize
  225.     for(i=0;i<IrDA_BUFLEN;i++) *IrDAdataPt++=0; // Initialize IrDA Tx data
  226.     IrDAdataPt =(volatile U8 *)IrDABUFFER;
  227.     IrDA_Port_Set();    
  228.     Uart_Select(1);
  229.     pISR_UART2=(unsigned)IrDA_RxOrErr;
  230.     Uart_Printf("nSelect the baud raten"); // Select IrDA baud rate
  231.     Uart_Printf("1)9600    2)19200    3)38400    4)57600    5)115200n"); 
  232.     i=Uart_Getch();
  233.     switch(i)
  234.     {
  235. case '1':
  236.             IrDA_BAUD=9600;
  237.         break;
  238. case '2':
  239.             IrDA_BAUD=19200;
  240.         break;
  241. case '3':
  242.             IrDA_BAUD=38400;
  243.         break;
  244. case '4':
  245.             IrDA_BAUD=57600;
  246.         break;
  247. case '5':
  248.             IrDA_BAUD=115200;
  249.         break;
  250. default:
  251. break;
  252.     }
  253.     rUBRDIV2=( (int)(PCLK/16./IrDA_BAUD) -1 );
  254.     Uart_Printf("rUBRDIV2=%dn", rUBRDIV2);
  255.     Uart_Printf("[UART IrDA Rx Test]n");
  256.     Uart_Printf("This test should be configured two boards.n");
  257.     Uart_Printf("Press any key to start Rx and then Start Tx....n");
  258.     rUFCON2=(1<<6)|(0<<4)|(1<<2)|(1<<1)|(1);
  259.     //Tx and Rx FIFO Trigger Level:4byte,Tx and Rx Reset,FIFO En
  260.     rUCON2=(0<<10)|(1<<9)|(1<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(0<<2)|(0); // From H/W
  261.     rULCON2=(1<<6)|(0<<3)|(0<<2)|(3); // IrDA,No parity,One stop bit, 8bit
  262.     Uart_Getch();
  263.     Uart_Printf("Now... Rx with IrDAn");
  264.     rUCON2 |= 1; // Rx enable
  265.     rINTMSK=~(BIT_UART2);
  266.     rINTSUBMSK=~(BIT_SUB_RXD2|BIT_SUB_ERR2);
  267.     while(!IrDA_end) if(Uart_GetKey()=='r') break;
  268.     
  269.     rINTSUBMSK|=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  270.     rUFCON2=(3<<6)|(2<<4)|(1<<2)|(1<<1)|(0);
  271.     Uart_Printf("nEnd Rx, receive data count=%dn",IrDA_cnt);
  272.     IrDAdataPt =(volatile U8 *)IrDABUFFER;
  273.     for(i=0;i<IrDA_BUFLEN;i++)
  274.     {
  275. if(i-(*IrDAdataPt))
  276. {
  277.     Uart_Printf("i=%d,",i);
  278.     IrDA_err++;
  279. }
  280. else
  281. Uart_Printf("%d,",*IrDAdataPt++);
  282.     }
  283.     if(IrDA_err)
  284.      Uart_Printf("IrDA test fail!! Error count=%dn",IrDA_err);
  285.     else
  286.      Uart_Printf("nIrDA test is good!!n");
  287.     IrDA_Port_Return();
  288. }