IrDA.c
上传用户:jankzhpno
上传日期:2022-08-03
资源大小:4763k
文件大小:6k
源码类别:

Windows CE

开发平台:

Visual C++

  1. #include "def.h"
  2. #include "2440addr.h"
  3. #include "2440lib.h"
  4. #define IrDA_BUFLEN 0x100
  5. void IrDA_Port_Set(void);
  6. void IrDA_Port_Return(void);
  7. void __irq IrDA_TxInt(void);
  8. void __irq IrDA_RxOrErr(void);
  9. volatile U8 *IrDAdataPt;
  10. volatile U8 *IrDAdataFl;
  11. volatile U32 IrDA_cnt,IrDA_end,IrDA_err,IrDA_BAUD;
  12. volatile U32 sirda_rGPBCON,sirda_rGPBDAT,sirda_rGPBUP;
  13. volatile U32 sirda_rGPHCON,sirda_rGPHDAT,sirda_rGPHUP;
  14. volatile U32 sirda_ULCON2,sirda_UCON2,sirda_UFCON2,sirda_UMCON2,sirda_UBRDIV2;
  15. void IrDA_Port_Set(void)
  16. {
  17.     //Push UART GPIO port configuration
  18.     sirda_rGPBCON=rGPBCON; 
  19.     sirda_rGPBDAT=rGPBDAT;
  20.     sirda_rGPBUP=rGPBUP;
  21.     sirda_rGPHCON=rGPHCON; 
  22.     sirda_rGPHDAT=rGPHDAT;
  23.     sirda_rGPHUP=rGPHUP;
  24.     //Configure IrDA port
  25.     rGPBDAT|=(1<<1);
  26.     rGPBCON&=0x3ffff3;
  27.     rGPBCON|=(1<<2); // Output(nIrDATXDEN)
  28.     rGPBUP|=(1<<1); //Uart port pull-up disable
  29.     rGPHCON&=0x3c0fff;
  30.     rGPHCON|=0x2a000; // TXD2,RXD2
  31.     rGPHUP|=0x1c0; //Uart port pull-up disable
  32.     //Push Uart control registers 
  33.     sirda_ULCON2=rULCON2;
  34.     sirda_UCON2 =rUCON2;
  35.     sirda_UFCON2=rUFCON2;
  36.     sirda_UMCON2=rUMCON2;
  37.     sirda_UBRDIV2=rUBRDIV2;
  38. }       
  39.         
  40. void IrDA_Port_Return(void)
  41. {       
  42.     //Pop UART GPIO port configuration
  43.     rGPBCON=sirda_rGPBCON;
  44.     rGPBDAT=sirda_rGPBDAT;
  45.     rGPBUP =sirda_rGPBUP;
  46.     rGPHCON=sirda_rGPHCON;
  47.     rGPHDAT=sirda_rGPHDAT;
  48.     rGPHUP =sirda_rGPHUP;
  49.     //Pop Uart control registers 
  50.     rULCON2=sirda_ULCON2;
  51.     rUCON2 =sirda_UCON2;
  52.     rUFCON2=sirda_UFCON2;
  53.     rUMCON2=sirda_UMCON2;
  54.     rUBRDIV2=sirda_UBRDIV2;
  55. }
  56. void __irq IrDA_TxInt(void)
  57. {
  58.     rINTSUBMSK|=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  59.     if(IrDA_cnt < (IrDA_BUFLEN))
  60.     {
  61. Uart_Printf("%d,",*IrDAdataPt);
  62. WrUTXH2(*IrDAdataPt++);
  63. IrDA_cnt++;
  64. ClearPending(BIT_UART2);
  65.         rSUBSRCPND=(BIT_SUB_TXD2);
  66.         rINTSUBMSK&=~(BIT_SUB_TXD2);
  67.     }
  68.     else
  69.     {
  70. IrDA_end=1;
  71. while(rUFSTAT2 & 0x2f0); //Until FIFO is empty
  72. while(!(rUTRSTAT2 & 0x4)); //Until Tx shifter is empty
  73.         ClearPending(BIT_UART2);
  74. rINTMSK|=BIT_UART2;
  75.     }
  76. }
  77. void __irq IrDA_RxOrErr(void)
  78. {
  79.     DisableSubIrq(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2); // Just for the safety
  80.     if(rSUBSRCPND&BIT_SUB_RXD2) {
  81.      if(rUTRSTAT2&1) //has data, non-fifo mode
  82. WrUTXH1(rURXH2);
  83.     }
  84.     else {
  85.         switch(rUERSTAT2) { //to clear and check the status of register bits
  86. case '1':
  87.     Uart_Printf("Overrun errorn");
  88.      break;
  89. case '2':
  90.     Uart_Printf("Parity errorn");
  91.      break;
  92. case '4':
  93.     Uart_Printf("Frame errorn");
  94.      break;
  95. case '8':
  96.     Uart_Printf("Breake detectn");
  97.      break;
  98. default :
  99.     break;
  100.      }
  101.     }
  102.     ClearSubPending(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  103.     EnableSubIrq(BIT_SUB_RXD2|BIT_SUB_ERR2);
  104.     ClearPending(BIT_UART2);
  105. }
  106. extern U32 PCLK;
  107. void Test_IrDA_Tx(void)
  108. {
  109. char dat;
  110. Uart_Printf("nIrDA testn"); // Select IrDA baud rate
  111. IrDA_cnt = 0;
  112. IrDA_end = 0;
  113. IrDA_Port_Set();
  114. IrDA_BAUD = 19200;
  115. Uart_Printf("Select baudrate = %dn", IrDA_BAUD);
  116. rUBRDIV2 = ((int)(PCLK/16./IrDA_BAUD)-1);
  117. //Uart_Printf("rUBRDIV2 = %dn", rUBRDIV2);
  118. rGPBDAT &= 0x7fd; // Enable nIrDATXDEN    
  119. rUFCON2  = (1<<6)|(0<<4)|(1<<2)|(1<<1)|0;
  120. //Tx and Rx FIFO Trigger Level = 4byte,Tx and Rx FIFO Reset,FIFO disable
  121. rUCON2 = (0<<10)|(1<<9)|(1<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(0<<2)|(0);
  122. //Use PCLK,Tx&RxLevel interrupt,Rx timeout disable,Rx err interrupt enable,Non-loopback,Tx&Rx disable
  123. rULCON2 = (1<<6)|(0<<3)|(0<<2)|(3); //IrDA,No parity,One stop bit,8bits
  124. rUCON2 = (0<<10)|(1<<9)|(1<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  125. //Use PCLK,Tx&RxLevel interrupt,Rx timeout disable,Rx err interrupt enable,Non-loopback,Tx&Rx disable
  126. Uart_Printf("Now start UART IrDA Tx&Rx test, check data[a~z]n");
  127. pISR_UART2 = (U32)IrDA_RxOrErr;
  128. EnableSubIrq(BIT_SUB_RXD2|BIT_SUB_ERR2);
  129. EnableIrq(BIT_UART2);
  130. dat = 'a';
  131.     while(1) {
  132. Delay(5);
  133. WrUTXH0(dat);
  134. Delay(5);
  135. WrUTXH2(dat);
  136. while(!(rUTRSTAT2&0x2));   //Wait until THR is empty.    
  137. dat++;
  138. if(dat>'z')
  139. break;
  140. }
  141. DisableSubIrq(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  142. EnableIrq(BIT_UART2);
  143. // rUFCON2 = (3<<6)|(2<<4)|(1<<2)|(1<<1)|(0);
  144. rGPBDAT |= (1<<1); // Disable nIrDATXDEN
  145. // IrDA_Port_Return();
  146. Uart_Printf("nEnd Tx&Rxn");
  147. }
  148. void Test_IrDA_Rx(void)
  149. {
  150.     unsigned int i;
  151.     
  152.     IrDA_cnt=0;
  153.     IrDA_end=0;
  154.     IrDA_err=0;
  155.     IrDA_Port_Set();    
  156.     
  157. pISR_UART2 = (U32)IrDA_RxOrErr;
  158. Uart_Printf("nSelect the baud raten"); // Select IrDA baud rate
  159. Uart_Printf("1)9600    2)19200    3)38400    4)57600    5)115200n");
  160. i = Uart_Getch();
  161.     switch(i) {
  162. case '1':
  163.             IrDA_BAUD=9600;
  164.         break;
  165. case '2':
  166.             IrDA_BAUD=19200;
  167.         break;
  168. case '3':
  169.             IrDA_BAUD=38400;
  170.         break;
  171. case '4':
  172.             IrDA_BAUD=57600;
  173.         break;
  174. case '5':
  175.             IrDA_BAUD=115200;
  176.         break;
  177. default:
  178. break;
  179.     }
  180.     rUBRDIV2=( (int)(PCLK/16./IrDA_BAUD) -1 );
  181.     Uart_Printf("rUBRDIV2=%dn", rUBRDIV2);
  182.     Uart_Printf("[UART IrDA Rx Test]n");
  183.     Uart_Printf("This test should be configured two boards.n");
  184.     Uart_Printf("Press any key to start Rx and then Start Tx....n");
  185.     Uart_Getch();
  186.     Uart_Printf("Now... Rx with IrDAn");
  187.     rUFCON2=(1<<6)|(0<<4)|(1<<2)|(1<<1)|(1);
  188.     //Tx and Rx FIFO Trigger Level:4byte,Tx and Rx Reset,FIFO En
  189.     rUCON2=(0<<10)|(1<<9)|(1<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(0<<2)|(0); // From H/W
  190.     rULCON2=(1<<6)|(0<<3)|(0<<2)|(3); // IrDA,No parity,One stop bit, 8bit
  191.     Delay(1); // From H/W
  192.     rUCON2=(0<<10)|(1<<9)|(1<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(0<<2)|(1);
  193.     // PCLK,Tx&Rx:Level,Rx timeout:x,Rx error int:o,Loop-back:x,Send break:x,Tx:x,Rx:int
  194.     rINTMSK=~(BIT_UART2);
  195.     rINTSUBMSK=~(BIT_SUB_RXD2|BIT_SUB_ERR2);
  196.     while(!IrDA_end);
  197.     
  198.     rINTSUBMSK|=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2);
  199.     rUFCON2=(3<<6)|(2<<4)|(1<<2)|(1<<1)|(0);
  200.     Uart_Printf("nEnd Rx, receive data count=%dn",IrDA_cnt);
  201.     for(i=0;i<IrDA_BUFLEN;i++)
  202.     {
  203. if(i-(*IrDAdataFl++))
  204. {
  205.     Uart_Printf("i=%d,",i);
  206.     IrDA_err++;
  207. }
  208.     }
  209.     if(IrDA_err)
  210.      Uart_Printf("IrDA test fail!! Error count=%dn",IrDA_err);
  211.     else
  212.      Uart_Printf("IrDA test is good!!n");
  213.     IrDA_Port_Return();
  214. }