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

📄 isr.lst

📁 USB_D12开发评估板实现USB键盘的全部源代码
💻 LST
字号:
C51 COMPILER V7.50   ISR                                                                   04/16/2007 15:22:56 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE ISR
OBJECT MODULE PLACED IN .\Obj\Isr.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Isr.c LARGE OPTIMIZE(2,SPEED) BROWSE MODP2 PRINT(.\Obj\Isr.lst) OBJECT(.\Ob
                    -j\Isr.obj)

line level    source

   1          #include "..\..\Driver\inc\includes.h"
   2          
   3          #include "mainloop.h"
   4          #include "usb100.h"
   5          
   6          extern byte_count byte_cnt;
   7          
   8          extern void bus_reset(void);
   9          
  10          extern void ep0_txdone(void);
  11          extern void ep0_rxdone(void);
  12          
  13          extern void ep1_txdone(void);
  14          extern void ep1_rxdone(void);
  15          
  16          extern void main_txdone(void);
  17          extern void main_rxdone(void);
  18          
  19          extern void dma_eot(void);
  20          
  21          /*
  22          //*************************************************************************
  23          //  Public static data
  24          //*************************************************************************
  25          */
  26          
  27          extern EPPFLAGS bEPPflags;
  28          
  29          /* Control endpoint TX/RX buffers */
  30          extern CONTROL_XFER ControlData;
  31          
  32          /* ISR static vars */
  33          unsigned char  GenEpBuf[EP1_PACKET_SIZE];
  34          unsigned char idata EpBuf[EP2_PACKET_SIZE];
  35          IO_REQUEST idata ioRequest;
  36          unsigned char ioSize, ioCount;
  37          unsigned long ClockTicks = 0;
  38          
  39          extern BOOL bNoRAM;
  40          
  41          
  42          //USB中断处理
  43          usb_isr() interrupt 0
  44          {
  45   1              DISABLE;
  46   1              bEPPflags.bits.bUSB_Busy = 1;
  47   1      //      fn_usb_isr();
  48   1              ENABLE;
  49   1      }
  50          
  51          //USB中断服务子程序
  52          void fn_usb_isr()
  53          {
  54   1              unsigned int i_st;
C51 COMPILER V7.50   ISR                                                                   04/16/2007 15:22:56 PAGE 2   

  55   1      
  56   1              bEPPflags.bits.in_isr = 1;
  57   1      
  58   1              i_st = D12_ReadInterruptRegister();//读取中断寄存器
  59   1      
  60   1              if(i_st != 0) 
  61   1              {
  62   2                      if(i_st & D12_INT_BUSRESET) 
  63   2                      {
  64   3                              bus_reset();//USB总线服务
  65   3                              bEPPflags.bits.bus_reset = 1;
  66   3                      }
  67   2      
  68   2                      if(i_st & D12_INT_EOT)
  69   2                      {
  70   3                              dma_eot();//DMA传输结束
  71   3                      }
  72   2                      if(i_st & D12_INT_SUSPENDCHANGE)
  73   2                      {
  74   3                              bEPPflags.bits.suspend = 1;//挂起改变
  75   3                      }
  76   2      
  77   2                      if(i_st & D12_INT_ENDP0IN)              //从主机的角度看为输入
  78   2                      {
  79   3                              ep0_txdone();//端点0IN中断
  80   3                      }
  81   2                      if(i_st & D12_INT_ENDP0OUT)
  82   2                      {
  83   3                              ep0_rxdone();//端点0OUT中断
  84   3                      }
  85   2                      if(i_st & D12_INT_ENDP1IN)
  86   2                      {
  87   3                              ep1_txdone();//端点1IN中断
  88   3                      }
  89   2                      if(i_st & D12_INT_ENDP1OUT)
  90   2                      {
  91   3                              ep1_rxdone();//端点1OUT中断
  92   3                      }
  93   2                      if(i_st & D12_INT_ENDP2IN)
  94   2                      {
  95   3                              main_txdone();//端点2IN中断
  96   3                      }
  97   2                      if(i_st & D12_INT_ENDP2OUT)
  98   2                      {
  99   3                              main_rxdone();//端点2OUT中断
 100   3                      }
 101   2              }
 102   1      
 103   1              bEPPflags.bits.in_isr = 0;
 104   1              bEPPflags.bits.bUSB_Busy = 0;
 105   1      //      ENABLE;
 106   1      }
 107          
 108                  sbit D12SUSPD     = P3^3;
 109          
 110          //总线复位处理子程序
 111          void bus_reset(void)
 112          {
 113   1              D12SUSPD = 1;
 114   1      
 115   1              ComShowString(1,"收到总线复位信号");
 116   1      }
C51 COMPILER V7.50   ISR                                                                   04/16/2007 15:22:56 PAGE 3   

 117          
 118          //DMA结束处理
 119          void dma_eot(void)
 120          {
 121   1      }
 122          
 123          
 124          //端点0OUT中断
 125          //主机发,设备接收数据后的处理。
 126          void ep0_rxdone(void)
 127          {
 128   1              unsigned char ep_last, i;
 129   1      
 130   1              ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
 131   1      
 132   1              if (ep_last & D12_SETUPPACKET) 
 133   1              {
 134   2                      //接收到SETUP包
 135   2                      ControlData.wLength = 0;
 136   2                      ControlData.wCount = 0;
 137   2      
 138   2                      if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
 139   2                              (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) 
 140   2                      {
 141   3                              //SETUP包出错,返回
 142   3                              D12_SetEndpointStatus(0, 1);
 143   3                              D12_SetEndpointStatus(1, 1);            //刷新缓冲区。
 144   3                              bEPPflags.bits.control_state = USB_IDLE;
 145   3                              return;
 146   3                      }
 147   2      
 148   2                      ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
 149   2                      ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
 150   2                      ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
 151   2      
 152   2                      //对控制端点的输入/输出进行应答
 153   2                      D12_AcknowledgeEndpoint(0);             //使缓冲区有效。
 154   2                      D12_AcknowledgeEndpoint(1);
 155   2      
 156   2                      ControlData.wLength = ControlData.DeviceRequest.wLength;
 157   2                      ControlData.wCount = 0;
 158   2      //当主机设置包为读取数据时,将状态切换成发送状态。
 159   2                      if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) 
 160   2                      {
 161   3                              //从主机传输数据
 162   3                              bEPPflags.bits.setup_packet = 1;
 163   3                              bEPPflags.bits.control_state = USB_TRANSMIT;            /* get command */
 164   3                      }
 165   2                      else                    //接收数据。
 166   2                      {
 167   3                              if (ControlData.DeviceRequest.wLength == 0) 
 168   3                              {
 169   4                                      bEPPflags.bits.setup_packet = 1;
 170   4                                      bEPPflags.bits.control_state = USB_IDLE;                /* set command */
 171   4                              }
 172   3                              else            //附加数据的设置包
 173   3                              {
 174   4                                      if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) 
 175   4                                      {
 176   5                                              //接收数据长度出错。
 177   5                                              bEPPflags.bits.control_state = USB_IDLE;
 178   5                                              D12_SetEndpointStatus(0, 1);
C51 COMPILER V7.50   ISR                                                                   04/16/2007 15:22:56 PAGE 4   

 179   5                                              D12_SetEndpointStatus(1, 1);
 180   5                                      }
 181   4                                      else 
 182   4                                      {
 183   5      
 184   5                                              bEPPflags.bits.control_state = USB_RECEIVE;     //设置接收状态
 185   5                                      }
 186   4                              } // set command with data
 187   3                      } // else set command
 188   2              } // if setup packet
 189   1      
 190   1              else if (bEPPflags.bits.control_state == USB_RECEIVE)
 191   1              {
 192   2                      //读取设置包的数据部分.
 193   2                      i =     D12_ReadEndpoint(0, EP0_PACKET_SIZE,
 194   2                              ControlData.dataBuffer + ControlData.wCount);
 195   2                      ControlData.wCount += i;
 196   2                      if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)  //ControlData.wLength由第1包设置.
 197   2                      {
 198   3                              //数据接收完毕
 199   3                              bEPPflags.bits.setup_packet = 1;     //接收设置包完毕,
 200   3                              bEPPflags.bits.control_state = USB_IDLE;
 201   3                      }
 202   2              }
 203   1              else 
 204   1              {
 205   2                      bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
 206   2              }
 207   1      }
 208          
 209          //端点0IN处理MC发送,主机接收.
 210          void ep0_txdone(void)
 211          {
 212   1              short i = ControlData.wLength - ControlData.wCount;
 213   1              D12_ReadLastTransactionStatus(1); //清中断标志位
 214   1      
 215   1              if (bEPPflags.bits.control_state != USB_TRANSMIT) 
 216   1                      return;//非发送状态,返回
 217   1      
 218   1              if( i >= EP0_PACKET_SIZE) 
 219   1              {
 220   2                      //剩下数据大于16字节,发送16字节
 221   2                      D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
 222   2                      ControlData.wCount += EP0_PACKET_SIZE;
 223   2                      bEPPflags.bits.control_state = USB_TRANSMIT;
 224   2              }
 225   1              else if( i != 0) 
 226   1              {
 227   2                      //发送剩下数据 ,数据个数为i个.
 228   2                      D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
 229   2                      ControlData.wCount += i;
 230   2                      bEPPflags.bits.control_state = USB_IDLE;
 231   2              }
 232   1              else if (i == 0)
 233   1              {
 234   2                      D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
 235   2                      bEPPflags.bits.control_state = USB_IDLE;
 236   2              }
 237   1      }
 238          
 239          
 240          
C51 COMPILER V7.50   ISR                                                                   04/16/2007 15:22:56 PAGE 5   

 241          //端点1OUT处理
 242          void ep1_txdone(void)
 243          {
 244   1              D12_ReadLastTransactionStatus(3); //清中断标志位
 245   1      }
 246          
 247          //端点1IN处理
 248          void ep1_rxdone(void)
 249          {
 250   1              unsigned char len;
 251   1      
 252   1              len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
 253   1              if(len != 0)
 254   1                      bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
 255   1              D12_ReadLastTransactionStatus(2); //清中断标志位
 256   1      
 257   1      }
 258          
 259          //主端点OUT控制
 260          void main_txdone(void)
 261          {
 262   1      //      unsigned char len,epstatus;
 263   1      
 264   1      
 265   1              D12_ReadLastTransactionStatus(5); //清中断标志位
 266   1      
 267   1              //可添加用户代码(进行检测端点号5IN令牌的操作)
 268   1              if(byte_cnt.word>0)
 269   1              {
 270   2                      if(byte_cnt.word<64)
 271   2                      {
 272   3                              D12_WriteEndpoint(5, byte_cnt.byte.low, EpBuf);
 273   3                              byte_cnt.word=0;
 274   3                      }
 275   2                      else
 276   2                      {
 277   3                              byte_cnt.word=byte_cnt.word-64;
 278   3                              D12_WriteEndpoint(5, 64, EpBuf);
 279   3                      }
 280   2              }
 281   1      }
 282          
 283          //主端点IN控制
 284          void main_rxdone(void)
 285          {
 286   1              unsigned char len;                                      //,epstatus;
 287   1      
 288   1              D12_ReadLastTransactionStatus(4); //清中断标志位
 289   1              //接收数据
 290   1              len = D12_ReadEndpoint(4, 64, EpBuf);
 291   1      //      epstatus=D12_ReadEndpointStatus(4);
 292   1      //      epstatus &= 0x60;
 293   1      //      if (epstatus == 0x60)
 294   1      //              len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
 295   1      
 296   1      }
 297          
 298          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1284    ----
C51 COMPILER V7.50   ISR                                                                   04/16/2007 15:22:56 PAGE 6   

   CONSTANT SIZE    =     17    ----
   XDATA SIZE       =     22       8
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =     70    ----
   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 + -