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

📄 isr.lst

📁 烧录器的上位机控制程序代码,和下位机程序代码,包括USB通讯固件
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   ISR                                                                   12/19/2007 17:51:24 PAGE 1   


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

line level    source

   1          #include "define.h"
   2          #include "epphal.h"
   3          #include "d12ci.h"
   4          #include "mainloop.h"
   5          #include "usb100.h"
   6          #include "otp.h"
   7          #include "isr.h"
   8          #include "mainloop.h"
   9          #define VERSION 0x20
  10          
  11          unsigned int addr=0;
  12          unsigned char two_ci=0;
  13          unsigned char dir_otp_flash;
  14          bit busb_tx=0;
  15          
  16          /*
  17          //*************************************************************************
  18          //  Public static data
  19          //*************************************************************************
  20          */
  21          
  22          EPPFLAGS bEPPflags;
  23          
  24          /* Control endpoint TX/RX buffers */
  25          extern CONTROL_XFER ControlData;
  26          
  27          /* ISR static vars */
  28          unsigned char idata GenEpBuf[5];
  29          unsigned char idata EpBuf[128];
  30          
  31          //USB中断处理
  32          usb_isr() interrupt 0
  33          {
  34   1              DISABLE;
  35   1              fn_usb_isr();
  36   1              ENABLE;
  37   1      
  38   1              //==============        自动检测USB设备 
  39   1              P3_2=1;
  40   1          if (P3_2)
  41   1              {
  42   2                      IT0=0;
  43   2              }
  44   1              else
  45   1              {
  46   2                      IT0=1;
  47   2              }
  48   1      }
  49          
  50          //USB中断服务子程序
  51          void fn_usb_isr()
  52          {
  53   1              unsigned int i_st;
  54   1          
  55   1              bEPPflags.bits.in_isr = 1;
C51 COMPILER V8.02   ISR                                                                   12/19/2007 17:51:24 PAGE 2   

  56   1              
  57   1              i_st = D12_ReadInterruptRegister();//读取中断寄存器
  58   1      
  59   1      
  60   1              if(i_st != 0) {
  61   2              
  62   2                      if(i_st & D12_INT_ENDP0IN)
  63   2                              ep0_txdone();//端点0IN中断
  64   2                      
  65   2                      if(i_st & D12_INT_ENDP0OUT)
  66   2                              ep0_rxdone();//端点0OUT中断
  67   2                      if(i_st & D12_INT_ENDP1IN)
  68   2                              ep1_txdone();//端点1IN中断
  69   2                      if(i_st & D12_INT_ENDP1OUT)
  70   2                              ep1_rxdone();//端点1OUT中断
  71   2                      if(i_st & D12_INT_ENDP2IN)
  72   2                              main_txdone();//端点2IN中断
  73   2                      if(i_st & D12_INT_ENDP2OUT)
  74   2                              main_rxdone();//端点2OUT中断
  75   2              }
  76   1              
  77   1              bEPPflags.bits.in_isr = 0;
  78   1              
  79   1      }
  80          
  81          
  82          //端点0OUT中断
  83          void ep0_rxdone(void)
  84          {
  85   1              unsigned char ep_last, i;
  86   1              
  87   1              ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
  88   1              
  89   1              if (ep_last & D12_SETUPPACKET) {
  90   2                      //接收到SETUP包
  91   2                      ControlData.wLength = 0;
  92   2                      ControlData.wCount = 0;
  93   2                      
  94   2                      if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
  95   2                              (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
  96   3                              //SETUP包出错,返回
  97   3                              D12_SetEndpointStatus(0, 1);
  98   3                              D12_SetEndpointStatus(1, 1);
  99   3                              bEPPflags.bits.control_state = USB_IDLE;
 100   3                              return;
 101   3                      }
 102   2                      
 103   2                      ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
 104   2                      ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
 105   2                      ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
 106   2                      
 107   2                      //对控制端点的输入/输出进行应答
 108   2                      D12_AcknowledgeEndpoint(0);
 109   2                      D12_AcknowledgeEndpoint(1);
 110   2                      
 111   2                      ControlData.wLength = ControlData.DeviceRequest.wLength;
 112   2                      ControlData.wCount = 0;
 113   2                      
 114   2                      if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
 115   3                              //从主机传输数据
 116   3                              bEPPflags.bits.setup_packet = 1;
 117   3                              bEPPflags.bits.control_state = USB_TRANSMIT;            /* get command */
C51 COMPILER V8.02   ISR                                                                   12/19/2007 17:51:24 PAGE 3   

 118   3                      }
 119   2                      else {
 120   3                              if (ControlData.DeviceRequest.wLength == 0) {
 121   4                                      bEPPflags.bits.setup_packet = 1;
 122   4                                      bEPPflags.bits.control_state = USB_IDLE;                /* set command */
 123   4                              }
 124   3                              else {
 125   4                                      if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
 126   5                                              //接收数据长度为0
 127   5                                              bEPPflags.bits.control_state = USB_IDLE;
 128   5                                              D12_SetEndpointStatus(0, 1);
 129   5                                              D12_SetEndpointStatus(1, 1);
 130   5                                      }
 131   4                                      else {
 132   5                                              bEPPflags.bits.control_state = USB_RECEIVE;     //设置接收状态
 133   5                                      }
 134   4                              } // set command with data
 135   3                      } // else set command
 136   2              } // if setup packet
 137   1              
 138   1              else if (bEPPflags.bits.control_state == USB_RECEIVE) {
 139   2                      //接收数据
 140   2                      i =     D12_ReadEndpoint(0, EP0_PACKET_SIZE,
 141   2                              ControlData.dataBuffer + ControlData.wCount);
 142   2                      ControlData.wCount += i;
 143   2                      if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
 144   3                              //数据接收完毕
 145   3                              bEPPflags.bits.setup_packet = 1;
 146   3                              bEPPflags.bits.control_state = USB_IDLE;
 147   3                      }
 148   2              }
 149   1              else {
 150   2                      bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
 151   2              }
 152   1      }
 153          
 154          //端点0IN处理
 155          void ep0_txdone(void)
 156          {
 157   1              short i = ControlData.wLength - ControlData.wCount;
 158   1              D12_ReadLastTransactionStatus(1); //清中断标志位
 159   1              if (bEPPflags.bits.control_state != USB_TRANSMIT) 
 160   1                      return;//非发送状态,返回
 161   1              
 162   1              if( i >= EP0_PACKET_SIZE) {
 163   2                      //剩下数据大于16字节,发送16字节
 164   2                      D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
 165   2                      ControlData.wCount += EP0_PACKET_SIZE;
 166   2                      bEPPflags.bits.control_state = USB_TRANSMIT;
 167   2              }
 168   1              else if( i != 0) {
 169   2                      //发送剩下数据
 170   2                      D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
 171   2                      ControlData.wCount += i;
 172   2                      bEPPflags.bits.control_state = USB_IDLE;
 173   2              }
 174   1              else if (i == 0){
 175   2                      D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
 176   2                      bEPPflags.bits.control_state = USB_IDLE;
 177   2              }
 178   1      }
 179          
C51 COMPILER V8.02   ISR                                                                   12/19/2007 17:51:24 PAGE 4   

 180          //端点1OUT处理
 181          void ep1_txdone(void)
 182          {
 183   1              D12_ReadLastTransactionStatus(3); //清中断标志位
 184   1      
 185   1      }
 186          
 187          
 188          
 189          
 190          
 191          
 192          
 193          //端点1IN处理
 194          void ep1_rxdone(void)
 195          {
 196   1              unsigned char len;
 197   1          
 198   1              D12_ReadLastTransactionStatus(2); //表示清除端点1接收中断标志位
 199   1              len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
 200   1              //      if(len != 0)            //???
 201   1              //              bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
 202   1          switch (GenEpBuf[0])
 203   1              {
 204   2                 
 205   2                case 0xa0://下载FILE-->FLASH
 206   2                         {
 207   3                                 addr =0;two_ci =0;
 208   3                                 dir_otp_flash =1;            //数据在端点2里面接收
 209   3                         }
 210   2                         break;
 211   2              
 212   2                      case 0xa1:      //上传OTP-->PC

⌨️ 快捷键说明

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