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

📄 isr.lst

📁 这是PDIUSBD12 smart开发板原版开发包
💻 LST
字号:
C51 COMPILER V7.01  ISR                                                                    08/18/2003 08:43:22 PAGE 1   


C51 COMPILER V7.01, COMPILATION OF MODULE ISR
OBJECT MODULE PLACED IN Isr.OBJ
COMPILER INVOKED BY: C:\Keil7.0\C51\BIN\C51.EXE Isr.c OPTIMIZE(2,SPEED) DEBUG OBJECTEXTEND TABS(6)

stmt level    source

   1          #include <stdio.h>
   2          #include <string.h>
   3          
   4          #include <reg51.h>                /* special function register declarations   */
   5          
   6          #include "epphal.h"
   7          #include "d12ci.h"
   8          #include "mainloop.h"
   9          #include "usb100.h"
  10          
  11          extern void bus_reset(void);
  12          
  13          extern void ep0_txdone(void);
  14          extern void ep0_rxdone(void);
  15          
  16          extern void ep1_txdone(void);
  17          extern void ep1_rxdone(void);
  18          
  19          extern void main_txdone(void);
  20          extern void main_rxdone(void);
  21          
  22          extern void dma_eot(void);
  23          
  24          /*
  25          //*************************************************************************
  26          //  Public static data
  27          //*************************************************************************
  28          */
  29          
  30          EPPFLAGS bEPPflags;
  31          
  32          /* Control endpoint TX/RX buffers */
  33          extern CONTROL_XFER ControlData;
  34          
  35          /* ISR static vars */
  36          unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
  37          unsigned char idata EpBuf[EP2_PACKET_SIZE];
  38          IO_REQUEST idata ioRequest;
  39          unsigned char ioSize, ioCount;
  40          unsigned long ClockTicks = 0;
  41          
  42          extern BOOL bNoRAM;
  43          
  44          //定时器0中断处理
  45          timer_isr() interrupt 1
  46          {
  47   1            DISABLE;
  48   1            ClockTicks++;
  49   1            bEPPflags.bits.timer = 1;
  50   1            ENABLE;
  51   1      }
  52          
  53          //USB中断处理
  54          usb_isr() interrupt 0
  55          {
C51 COMPILER V7.01  ISR                                                                    08/18/2003 08:43:22 PAGE 2   

  56   1            DISABLE;
  57   1            fn_usb_isr();
  58   1            ENABLE;
  59   1      }
  60          
  61          //USB中断服务子程序
  62          void fn_usb_isr()
  63          {
  64   1            unsigned int i_st;
  65   1      
  66   1            bEPPflags.bits.in_isr = 1;
  67   1      
  68   1            i_st = D12_ReadInterruptRegister();//读取中断寄存器
  69   1      
  70   1            if(i_st != 0) {
  71   2                  if(i_st & D12_INT_BUSRESET) {
  72   3                        bus_reset();//USB总线服务
  73   3                        bEPPflags.bits.bus_reset = 1;
  74   3                  }
  75   2      
  76   2                  if(i_st & D12_INT_EOT)
  77   2                        dma_eot();//DMA传输结束
  78   2      
  79   2                  if(i_st & D12_INT_SUSPENDCHANGE)
  80   2                        bEPPflags.bits.suspend = 1;//挂起改变
  81   2      
  82   2                  if(i_st & D12_INT_ENDP0IN)
  83   2                        ep0_txdone();//端点0IN中断
  84   2                  if(i_st & D12_INT_ENDP0OUT)
  85   2                        ep0_rxdone();//端点0OUT中断
  86   2                  if(i_st & D12_INT_ENDP1IN)
  87   2                        ep1_txdone();//端点1IN中断
  88   2                  if(i_st & D12_INT_ENDP1OUT)
  89   2                        ep1_rxdone();//端点1OUT中断
  90   2                  if(i_st & D12_INT_ENDP2IN)
  91   2                        main_txdone();//端点2IN中断
  92   2                  if(i_st & D12_INT_ENDP2OUT)
  93   2                        main_rxdone();//端点2OUT中断
  94   2            }
  95   1      
  96   1            bEPPflags.bits.in_isr = 0;
  97   1      }
  98          
  99          //总线复位处理子程序
 100          void bus_reset(void)
 101          {
 102   1      }
 103          
 104          //端点0OUT中断
 105          void ep0_rxdone(void)
 106          {
 107   1            unsigned char ep_last, i;
 108   1      
 109   1            ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
 110   1      
 111   1            if (ep_last & D12_SETUPPACKET) {
 112   2                  //接收到SETUP包
 113   2                  ControlData.wLength = 0;
 114   2                  ControlData.wCount = 0;
 115   2      
 116   2                  if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
 117   2                        (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
C51 COMPILER V7.01  ISR                                                                    08/18/2003 08:43:22 PAGE 3   

 118   3                        //SETUP包出错,返回
 119   3                        D12_SetEndpointStatus(0, 1);
 120   3                        D12_SetEndpointStatus(1, 1);
 121   3                        bEPPflags.bits.control_state = USB_IDLE;
 122   3                        return;
 123   3                  }
 124   2      
 125   2                  ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
 126   2                  ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
 127   2                  ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
 128   2      
 129   2                  //对控制端点的输入/输出进行应答
 130   2                  D12_AcknowledgeEndpoint(0);
 131   2                  D12_AcknowledgeEndpoint(1);
 132   2      
 133   2                  ControlData.wLength = ControlData.DeviceRequest.wLength;
 134   2                  ControlData.wCount = 0;
 135   2      
 136   2                  if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
 137   3                        //从主机传输数据
 138   3                        bEPPflags.bits.setup_packet = 1;
 139   3                        bEPPflags.bits.control_state = USB_TRANSMIT;          /* get command */
 140   3                  }
 141   2                  else {
 142   3                        if (ControlData.DeviceRequest.wLength == 0) {
 143   4                              bEPPflags.bits.setup_packet = 1;
 144   4                              bEPPflags.bits.control_state = USB_IDLE;        /* set command */
 145   4                        }
 146   3                        else {
 147   4                              if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
 148   5                                    //接收数据长度为0
 149   5                                    bEPPflags.bits.control_state = USB_IDLE;
 150   5                                    D12_SetEndpointStatus(0, 1);
 151   5                                    D12_SetEndpointStatus(1, 1);
 152   5                              }
 153   4                              else {
 154   5                                    bEPPflags.bits.control_state = USB_RECEIVE;     //设置接收状态
 155   5                              }
 156   4                        } // set command with data
 157   3                  } // else set command
 158   2            } // if setup packet
 159   1      
 160   1            else if (bEPPflags.bits.control_state == USB_RECEIVE) {
 161   2                  //接收数据
 162   2                  i =   D12_ReadEndpoint(0, EP0_PACKET_SIZE,
 163   2                        ControlData.dataBuffer + ControlData.wCount);
 164   2                  ControlData.wCount += i;
 165   2                  if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
 166   3                        //数据接收完毕
 167   3                        bEPPflags.bits.setup_packet = 1;
 168   3                        bEPPflags.bits.control_state = USB_IDLE;
 169   3                  }
 170   2            }
 171   1            else {
 172   2                  bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
 173   2            }
 174   1      }
 175          
 176          //端点0IN处理
 177          void ep0_txdone(void)
 178          {
 179   1            short i = ControlData.wLength - ControlData.wCount;
C51 COMPILER V7.01  ISR                                                                    08/18/2003 08:43:22 PAGE 4   

 180   1            D12_ReadLastTransactionStatus(1); //清中断标志位
 181   1            if (bEPPflags.bits.control_state != USB_TRANSMIT) 
 182   1                  return;//非发送状态,返回
 183   1      
 184   1            if( i >= EP0_PACKET_SIZE) {
 185   2                  //剩下数据大于16字节,发送16字节
 186   2                  D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
 187   2                  ControlData.wCount += EP0_PACKET_SIZE;
 188   2                  bEPPflags.bits.control_state = USB_TRANSMIT;
 189   2            }
 190   1            else if( i != 0) {
 191   2                  //发送剩下数据
 192   2                  D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
 193   2                  ControlData.wCount += i;
 194   2                  bEPPflags.bits.control_state = USB_IDLE;
 195   2            }
 196   1            else if (i == 0){
 197   2                  D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
 198   2                  bEPPflags.bits.control_state = USB_IDLE;
 199   2            }
 200   1      }
 201          
 202          //DMA结束处理
 203          void dma_eot(void)
 204          {
 205   1      }
 206          
 207          //端点1OUT处理
 208          void ep1_txdone(void)
 209          {
 210   1            D12_ReadLastTransactionStatus(3); //清中断标志位
 211   1      }
 212          
 213          //端点1IN处理
 214          void ep1_rxdone(void)
 215          {
 216   1            unsigned char len;
 217   1      
 218   1            D12_ReadLastTransactionStatus(2); //清中断标志位
 219   1            len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
 220   1            if(len != 0)
 221   1                  bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
 222   1      }
 223          
 224          //主端点OUT控制
 225          void main_txdone(void)
 226          {
 227   1      //    unsigned char len,epstatus;
 228   1      
 229   1            D12_ReadLastTransactionStatus(5); //清中断标志位
 230   1      }
 231          
 232          //主端点IN控制
 233          void main_rxdone(void)
 234          {
 235   1            unsigned char len,epstatus;
 236   1      
 237   1            D12_ReadLastTransactionStatus(4); //清中断标志位
 238   1      
 239   1            //接收数据
 240   1            len = D12_ReadEndpoint(4, 64, EpBuf);
 241   1            epstatus=D12_ReadEndpointStatus(4);
C51 COMPILER V7.01  ISR                                                                    08/18/2003 08:43:22 PAGE 5   

 242   1            epstatus &= 0x60;
 243   1            if (epstatus == 0x60)
 244   1                  len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
 245   1      }
 246          
 247          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    876    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8       9
   IDATA SIZE       =     86    ----
   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 + -