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

📄 d12_isr.lst

📁 usblab usb程序开发实验 一个实例
💻 LST
字号:
C51 COMPILER V8.01   D12_ISR                                                               04/19/2006 16:02:46 PAGE 1   


C51 COMPILER V8.01, COMPILATION OF MODULE D12_ISR
OBJECT MODULE PLACED IN d12_isr.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE d12_isr.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "hardware.h"
   2          #include "d12_driver.h"
   3          #include "USB100.h"
   4          #include "UFmain.h"
   5          
   6          void ep0_txdone(void);
   7          void ep0_rxdone(void);
   8          void ep1_txdone(void);
   9          void ep1_rxdone(void);
  10          void main_txdone(void);
  11          void main_rxdone(void);
  12          
  13          
  14          /*
  15          //*************************************************************************
  16          //  Public static data
  17          //*************************************************************************
  18          */
  19          EPPFLAGS bEPPflags;
  20          
  21          /* Control endpoint TX/RX buffers */
  22          extern CONTROL_XFER ControlData;
  23          
  24          /* ISR static vars */
  25          unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
  26          
  27          void fn_usb_isr()
  28          {
  29   1              unsigned int i_st;
  30   1      
  31   1              bEPPflags.bits.in_isr = 1;
  32   1              
  33   1      
  34   1              i_st = D12_ReadInterruptRegister();
  35   1              
  36   1              if(i_st != 0) {
  37   2                      if(i_st & D12_INT_BUSRESET) {                   
  38   3                              bEPPflags.bits.bus_reset = 1;
  39   3                      }
  40   2      
  41   2                      if(i_st & D12_INT_SUSPENDCHANGE)
  42   2                              bEPPflags.bits.suspend = 1;
  43   2      
  44   2                      
  45   2                      if(i_st & D12_INT_ENDP0IN)
  46   2                              ep0_txdone();
  47   2                      if(i_st & D12_INT_ENDP0OUT)
  48   2                              ep0_rxdone();
  49   2                      if(i_st & D12_INT_ENDP1IN)
  50   2                              ep1_txdone();
  51   2                      if(i_st & D12_INT_ENDP1OUT)
  52   2                              ep1_rxdone();
  53   2                      if(i_st & D12_INT_ENDP2IN)
  54   2                              main_txdone();
  55   2                      if(i_st & D12_INT_ENDP2OUT)
C51 COMPILER V8.01   D12_ISR                                                               04/19/2006 16:02:46 PAGE 2   

  56   2                              main_rxdone();
  57   2                      
  58   2              }
  59   1              
  60   1              bEPPflags.bits.in_isr = 0;
  61   1              
  62   1      }
  63          
  64          void usb_isr(void) interrupt 2
  65          {
  66   1              bEPPflags.bits.timer=1;
  67   1              fn_usb_isr();
  68   1      }
  69          
  70          //---------------------------------
  71          void ep0_rxdone(void)
  72          {
  73   1              unsigned char ep_last, i;
  74   1      
  75   1              ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag
  76   1              if (ep_last & D12_SETUPPACKET) {
  77   2      
  78   2                      ControlData.wLength = 0;
  79   2                      ControlData.wCount = 0;
  80   2              //判断端点是否满,如是,则取出
  81   2                      if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
  82   2                              (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
  83   3      
  84   3                              D12_SetEndpointStatus(0, 1);
  85   3                              D12_SetEndpointStatus(1, 1);
  86   3                              bEPPflags.bits.control_state = USB_IDLE;
  87   3                              
  88   3                              return;
  89   3                      }
  90   2      
  91   2                      ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
  92   2                      ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
  93   2                      ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
  94   2      
  95   2                      // Acknowledge setup here to unlock in/out endp
  96   2              //向控制输出端点发送应答建立命令以重新使能下一个建立阶段
  97   2                      D12_AcknowledgeEndpoint(0);
  98   2                      D12_AcknowledgeEndpoint(1);
  99   2      
 100   2                      ControlData.wLength = ControlData.DeviceRequest.wLength;
 101   2                      ControlData.wCount = 0;
 102   2              //需要证实控制传输是控制读还是写,如果是读:
 103   2              //如果控制传输是一个控制读类型那就是说器件需要在下一个数据阶段向
 104   2              //主机发回数据包.MCU需要设置一个标志以指示USB 设备现在正处于传输
 105   2              //模式即准备在主机发送请求时发送数据
 106   2      
 107   2                      if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
 108   3                              bEPPflags.bits.setup_packet = 1;
 109   3                              bEPPflags.bits.control_state = USB_IDLE;                /* get command */
 110   3                      }
 111   2              //如果是写
 112   2                      else {
 113   3                              if (ControlData.DeviceRequest.wLength == 0) {
 114   4                                      bEPPflags.bits.setup_packet = 1;
 115   4                                      bEPPflags.bits.control_state = USB_IDLE;                /* set command */
 116   4                              }
 117   3                              else {
C51 COMPILER V8.01   D12_ISR                                                               04/19/2006 16:02:46 PAGE 3   

 118   4                                      if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
 119   5                                              bEPPflags.bits.control_state = USB_IDLE;
 120   5                                              D12_SetEndpointStatus(0, 1);
 121   5                                              D12_SetEndpointStatus(1, 1);
 122   5                                      }
 123   4                                      else {
 124   5                                              bEPPflags.bits.control_state = USB_RECEIVE;     /* set command with OUT token */
 125   5                                      }
 126   4                              } // set command with data
 127   3                      } // else set command
 128   2              } // if setup packet
 129   1      
 130   1              else if (bEPPflags.bits.control_state == USB_RECEIVE) {
 131   2                      i =     D12_ReadEndpoint(0, EP0_PACKET_SIZE,
 132   2                              ControlData.dataBuffer + ControlData.wCount);
 133   2      
 134   2                      ControlData.wCount += i;
 135   2                      if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
 136   3                              bEPPflags.bits.setup_packet = 1;
 137   3                              bEPPflags.bits.control_state = USB_IDLE;
 138   3                      }
 139   2              }
 140   1      
 141   1              else {
 142   2                      bEPPflags.bits.control_state = USB_IDLE;
 143   2              }
 144   1      }
 145          
 146          //----------------------------------
 147          void ep0_txdone(void)
 148          {
 149   1              short i = ControlData.wLength - ControlData.wCount;
 150   1      
 151   1              D12_ReadLastTransactionStatus(1); // Clear interrupt flag
 152   1      
 153   1              if (bEPPflags.bits.control_state != USB_TRANSMIT) 
 154   1                      return;
 155   1              //-------------------------
 156   1              if( i >= EP0_PACKET_SIZE) {
 157   2                      D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
 158   2                      ControlData.wCount += EP0_PACKET_SIZE;
 159   2      
 160   2                      bEPPflags.bits.control_state = USB_TRANSMIT;
 161   2              }
 162   1              else if( i != 0) {
 163   2                      D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
 164   2                      ControlData.wCount += i;
 165   2      
 166   2                      bEPPflags.bits.control_state = USB_IDLE;
 167   2              }
 168   1              else if (i == 0){
 169   2                      D12_WriteEndpoint(1, 0, 0); // Send zero packet at the end ???
 170   2      
 171   2                      bEPPflags.bits.control_state = USB_IDLE;
 172   2              }
 173   1      
 174   1      }
 175          //----------------------------------
 176          void ep1_txdone(void)
 177          {
 178   1              D12_ReadLastTransactionStatus(3); /* Clear interrupt flag */
 179   1      }
C51 COMPILER V8.01   D12_ISR                                                               04/19/2006 16:02:46 PAGE 4   

 180          
 181          void ep1_rxdone(void)
 182          {
 183   1              unsigned char len;
 184   1      
 185   1              D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */
 186   1      
 187   1              len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);
 188   1      
 189   1              if(len != 0)
 190   1                      bEPPflags.bits.ep1_rxdone = 1;
 191   1      }
 192          //---------------------------------
 193          void main_txdone(void)
 194          {
 195   1              D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */
 196   1      }
 197          
 198          void main_rxdone(void)
 199          {
 200   1              D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */    
 201   1      }
 202          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    586    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2       4
   IDATA SIZE       =      4    ----
   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 + -