⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isr.lst

📁 C8051F120与串口、并口、D12、USB、LCD应用
💻 LST
字号:
C51 COMPILER V7.01  ISR                                                                    06/30/2007 11:42:51 PAGE 1   


C51 COMPILER V7.01, COMPILATION OF MODULE ISR
OBJECT MODULE PLACED IN Isr.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Isr.c LARGE BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <c8051f120.h>
   2          #include <d12interface.h>
   3          #include <usb.h>
   4          
   5          CONTROL_XFER ControlData;
   6          
   7          #define D12_SETUPPACKET_MASK    0x20
   8          
   9          u8 Ep2OutLen;   //len of ep2 out data
  10          bool Ep2SendBufferFul = false;  //ep2 send buffer has data to send
  11          
  12          /* ep0 out interrupt */
  13          void ep0_out()
  14          {
  15   1              u8 ret, i;
  16   1              ret = D12_ReadLastTransactionStatus(D12_EPCTLOUT);
  17   1              if (ret & D12_SETUPPACKET_MASK)
  18   1              {//setup packet
  19   2                      ControlData.wLength = 0;
  20   2                      ControlData.wCount = 0;
  21   2                      if( D12_ReadEndpointBuffer(0, (u8 *)(&(ControlData.DevRequest)),
  22   2                              sizeof(ControlData.DevRequest)) != sizeof(DEVICE_REQUEST) ) 
  23   2                      {
  24   3                              //wrong setup packet, set ep0 to stall
  25   3                              D12_SetEndpointStatus(0, 1);
  26   3                              D12_SetEndpointStatus(1, 1);
  27   3                              bEppflags.flags.control_state = USB_IDLE;
  28   3                              return;
  29   3                      }
  30   2      
  31   2                      //u16 data must be swap because d12 & c51 has different byte order
  32   2                      ControlData.DevRequest.wValue = SWAP(ControlData.DevRequest.wValue);
  33   2                      ControlData.DevRequest.wIndex = SWAP(ControlData.DevRequest.wIndex);
  34   2                      ControlData.DevRequest.wLength = SWAP(ControlData.DevRequest.wLength);
  35   2      
  36   2                      // Acknowledge setup here to unlock in/out endp
  37   2                      D12_AcknowledgeEndpoint(0);
  38   2                      D12_AcknowledgeEndpoint(1);
  39   2                      ControlData.wLength = ControlData.DevRequest.wLength;
  40   2                      ControlData.wCount = 0;
  41   2                      if (ControlData.DevRequest.bmRequestType & USB_ENDPOINT_DIRECTION_MASK)
  42   2                      {//device send data to pc
  43   3                              bEppflags.flags.setup_packet = 1;
  44   3                              bEppflags.flags.control_state = USB_TRANSMIT; //USB_IDLE;/* get command */
  45   3                              //control_handler();
  46   3                      }
  47   2                      else 
  48   2                      {
  49   3                              if (ControlData.DevRequest.wLength == 0) 
  50   3                              {
  51   4                                      bEppflags.flags.setup_packet = 1;
  52   4                                      bEppflags.flags.control_state = USB_IDLE; /* set command */
  53   4                              }
  54   3                              else 
  55   3                              {
C51 COMPILER V7.01  ISR                                                                    06/30/2007 11:42:51 PAGE 2   

  56   4                                      if(ControlData.DevRequest.wLength > MAX_CONTROLDATA_SIZE) 
  57   4                                      {
  58   5                                              bEppflags.flags.control_state = USB_IDLE;
  59   5                                              D12_SetEndpointStatus(0, 1);
  60   5                                              D12_SetEndpointStatus(1, 1);
  61   5                                      }
  62   4                                      else
  63   4                                      {
  64   5                                              bEppflags.flags.control_state = USB_RECEIVE; /* set command with OUT
  65   5                                      token */
  66   5                                      }
  67   4                              } // set command with data
  68   3                      } // else set command
  69   2                      // if setup packet
  70   2              }
  71   1              else if (bEppflags.flags.control_state == USB_RECEIVE) 
  72   1              {
  73   2                      i = D12_ReadEndpointBuffer(0,
  74   2                              ControlData.buffer + ControlData.wCount,        
  75   2                              EP0_PACKET_SIZE);
  76   2                      ControlData.wCount += i;
  77   2                      if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) 
  78   2                      {
  79   3                              //data received over
  80   3                              bEppflags.flags.setup_packet = 1;
  81   3                              bEppflags.flags.control_state = USB_IDLE;
  82   3                      }
  83   2              }
  84   1              else
  85   1              {
  86   2                      bEppflags.flags.control_state = USB_IDLE;
  87   2              }
  88   1      }
  89          
  90          
  91          void ep0_in()
  92          {
  93   1              short i = ControlData.wLength - ControlData.wCount;
  94   1              D12_ReadLastTransactionStatus(1); // Clear interrupt flag
  95   1              if (bEppflags.flags.control_state != USB_TRANSMIT)
  96   1                      return;
  97   1              if( i >= EP0_PACKET_SIZE) {
  98   2                      D12_WriteEndpointBuffer(1, ControlData.pData + ControlData.wCount, EP0_PACKET_SIZE);
  99   2                      ControlData.wCount += EP0_PACKET_SIZE;
 100   2                      bEppflags.flags.control_state = USB_TRANSMIT;
 101   2              }
 102   1              else if( i != 0) {
 103   2                      D12_WriteEndpointBuffer(1, ControlData.pData + ControlData.wCount, i);
 104   2                      ControlData.wCount += i;
 105   2                      bEppflags.flags.control_state = USB_IDLE;
 106   2              }
 107   1              else if (i == 0){
 108   2                      D12_WriteEndpointBuffer(1, 0, 0); // Send zero packet at the end ???
 109   2                      bEppflags.flags.control_state = USB_IDLE;
 110   2              }
 111   1      }
 112          
 113          
 114          //ep1 in
 115          void ep1_in(void)
 116          {
 117   1              D12_ReadLastTransactionStatus(3); // Clear interrupt flag 
C51 COMPILER V7.01  ISR                                                                    06/30/2007 11:42:51 PAGE 3   

 118   1      }
 119          
 120          //ep1 out
 121          void ep1_out(void)
 122          {
 123   1              u8 len;
 124   1              D12_ReadLastTransactionStatus(2); // Clear interrupt flag 
 125   1              len = D12_ReadEndpointBuffer(2, Ep1Buf, EP1_PACKET_SIZE);
 126   1              if(len != 0)
 127   1                      bEppflags.flags.ep1_out = 1;
 128   1      }
 129          
 130          //ep2 (main ep) in
 131          void main_in()
 132          {
 133   1              D12_ReadLastTransactionStatus(5);
 134   1              Ep2SendBufferFul = false;
 135   1      }
 136          
 137          //ep2 (main ep) out
 138          void main_out()
 139          {
 140   1              u8      epstatus;
 141   1      
 142   1              DISABLE_INTERRUPT;
 143   1      
 144   1              D12_ReadLastTransactionStatus(4);
 145   1              epstatus = D12_ReadEndpointStatus(4);
 146   1              epstatus &= 0x60;
 147   1              Ep2OutLen = D12_ReadEndpointBuffer(4, Ep2Buf, EP2_PACKET_SIZE);
 148   1              if (epstatus == 0x60)
 149   1                      Ep2OutLen += D12_ReadEndpointBuffer(4, Ep2Buf+EP2_PACKET_SIZE, EP2_PACKET_SIZE);        //read double buf data
 150   1              if (Ep2OutLen != 0)
 151   1                      bEppflags.flags.ep2_out = 1;
 152   1              else
 153   1                      ENABLE_INTERRUPT;
 154   1      }
 155          
 156          /* external interrupt handle rounter */
 157          void D12Int_Handler() interrupt 0
 158          {
 159   1              u16 ret;
 160   1      
 161   1              bEppflags.flags.in_isr = 1;
 162   1      
 163   1              ret = D12_ReadInterruptRegister();
 164   1              
 165   1              if (ret & 0x1) //control ep out
 166   1              {
 167   2                      ep0_out();
 168   2              }
 169   1              if (ret & 0x2)  //control ep in
 170   1              {
 171   2                      ep0_in();
 172   2              }       
 173   1              if (ret & 0x4)  //ep1 out
 174   1              {
 175   2                      ep1_out();
 176   2              }       
 177   1              if (ret & 0x8)  //ep1 in
 178   1              {
 179   2                      ep1_in();
C51 COMPILER V7.01  ISR                                                                    06/30/2007 11:42:51 PAGE 4   

 180   2              }       
 181   1      
 182   1              if (ret & 0x10) //ep2 out
 183   1              {
 184   2                      main_out();
 185   2              }       
 186   1              if (ret & 0x20) //ep2 in
 187   1              {
 188   2                      main_in();
 189   2              }
 190   1        
 191   1              if (ret & 0x40) //system reset
 192   1              {
 193   2                      bEppflags.flags.bus_reset = 1;
 194   2              }
 195   1              if (ret & 0x80)
 196   1              {
 197   2                      bEppflags.flags.suspend = 1;    
 198   2              }
 199   1      
 200   1              bEppflags.flags.in_isr = 0;
 201   1      
 202   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    847    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     33       5
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -