Isr.LST
上传用户:lyfy_2008
上传日期:2014-07-13
资源大小:3016k
文件大小:13k
源码类别:

USB编程

开发平台:

Visual C++

  1. C51 COMPILER V7.02b   ISR                                                                  09/28/2006 22:04:34 PAGE 1   
  2. C51 COMPILER V7.02b, COMPILATION OF MODULE ISR
  3. OBJECT MODULE PLACED IN Isr.OBJ
  4. COMPILER INVOKED BY: C:KeilC51BINC51.EXE Isr.c BROWSE DEBUG OBJECTEXTEND
  5. stmt level    source
  6.    1          #include <stdio.h>
  7.    2          #include <string.h>
  8.    3          
  9.    4          #include <reg51.h>                /* special function register declarations   */
  10.    5          
  11.    6          //#include "epphal.h"
  12.    7          #include "d12ci.h"
  13.    8          #include "mainloop.h"
  14.    9          #include "usb100.h"
  15.   10          #include"address.h"
  16.   11          //#include"24C00.H"
  17.   12          extern void bus_reset(void);
  18.   13          extern void ep0_txdone(void);
  19.   14          extern void ep0_rxdone(void);
  20.   15          extern void ep1_txdone(void);
  21.   16          extern void ep1_rxdone(void);
  22.   17          extern void main_txdone(void);
  23.   18          extern void main_rxdone(void);
  24.   19          extern void dma_eot(void);
  25.   20          
  26.   21          /*
  27.   22          //*************************************************************************
  28.   23          //  Public static data
  29.   24          //*************************************************************************
  30.   25          */
  31.   26          #define uchar unsigned char 
  32.   27          EPPFLAGS bEPPflags;
  33.   28          
  34.   29          /* Control endpoint TX/RX buffers */
  35.   30          extern CONTROL_XFER ControlData;
  36.   31          
  37.   32          /* ISR static vars */
  38.   33          unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
  39.   34          unsigned char idata EpBuf[EP2_PACKET_SIZE];
  40.   35          unsigned char idata mainbuflen;
  41.   36          IO_REQUEST idata ioRequest;
  42.   37          unsigned char ioSize, ioCount;
  43.   38          unsigned long ClockTicks = 0;
  44.   39          
  45.   40          extern BOOL bNoRAM;
  46.   41          
  47.   42          //定时器0中断处理
  48.   43          timer_isr() interrupt 1
  49.   44          {
  50.   45   1              DISABLE;
  51.   46   1              ClockTicks++;
  52.   47   1              bEPPflags.bits.timer = 1;
  53.   48   1              ENABLE;
  54.   49   1      }
  55.   50          
  56.   51          //USB中断处理
  57.   52          usb_isr() interrupt 2
  58.   53          {
  59.   54   1              DISABLE;
  60.   55   1              fn_usb_isr();
  61. C51 COMPILER V7.02b   ISR                                                                  09/28/2006 22:04:34 PAGE 2   
  62.   56   1              ENABLE;
  63.   57   1      }
  64.   58          
  65.   59          //USB中断服务子程序
  66.   60          void fn_usb_isr()
  67.   61          {
  68.   62   1              unsigned int i_st;
  69.   63   1      
  70.   64   1              bEPPflags.bits.in_isr = 1;
  71.   65   1      
  72.   66   1              i_st = D12_ReadInterruptRegister();//读取中断寄存器
  73.   67   1      
  74.   68   1              if(i_st != 0) {
  75.   69   2                      if(i_st & D12_INT_BUSRESET) {
  76.   70   3                              bus_reset();//USB总线服务
  77.   71   3                              bEPPflags.bits.bus_reset = 1;
  78.   72   3                      }
  79.   73   2      
  80.   74   2                      if(i_st & D12_INT_EOT)
  81.   75   2                              dma_eot();//DMA传输结束
  82.   76   2      
  83.   77   2                      if(i_st & D12_INT_SUSPENDCHANGE)
  84.   78   2                              bEPPflags.bits.suspend = 1;//挂起改变
  85.   79   2      
  86.   80   2                      if(i_st & D12_INT_ENDP0IN)
  87.   81   2                              ep0_txdone();//端点0IN中断
  88.   82   2                      if(i_st & D12_INT_ENDP0OUT)
  89.   83   2                              ep0_rxdone();//端点0OUT中断
  90.   84   2                      if(i_st & D12_INT_ENDP1IN)
  91.   85   2                              ep1_txdone();//端点1IN中断
  92.   86   2                      if(i_st & D12_INT_ENDP1OUT)
  93.   87   2                              ep1_rxdone();//端点1OUT中断
  94.   88   2                      if(i_st & D12_INT_ENDP2IN)
  95.   89   2                              main_txdone();//端点2IN中断
  96.   90   2                      if(i_st & D12_INT_ENDP2OUT)
  97.   91   2                              main_rxdone();//端点2OUT中断
  98.   92   2              }
  99.   93   1      
  100.   94   1              bEPPflags.bits.in_isr = 0;
  101.   95   1      }
  102.   96          
  103.   97          //总线复位处理子程序
  104.   98          void bus_reset(void)
  105.   99          {
  106.  100   1      }
  107.  101          
  108.  102          //端点0 OUT中断
  109.  103          void ep0_rxdone(void)
  110.  104          {
  111.  105   1              unsigned char ep_last, i;
  112.  106   1      
  113.  107   1              ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
  114.  108   1      
  115.  109   1              if (ep_last & D12_SETUPPACKET) 
  116.  110   1              {
  117.  111   2                      //接收到SETUP包(命令相位)
  118.  112   2                      ControlData.wLength = 0;
  119.  113   2                      ControlData.wCount = 0;
  120.  114   2      
  121.  115   2                      if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
  122.  116   2                              (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) )
  123.  117   2                      {
  124. C51 COMPILER V7.02b   ISR                                                                  09/28/2006 22:04:34 PAGE 3   
  125.  118   3                              //SETUP包出错,返回
  126.  119   3                              D12_SetEndpointStatus(0, 1);
  127.  120   3                              D12_SetEndpointStatus(1, 1);
  128.  121   3                              bEPPflags.bits.control_state = USB_IDLE;
  129.  122   3                              return;
  130.  123   3                      }
  131.  124   2      
  132.  125   2                      ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
  133.  126   2                      ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
  134.  127   2                      ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
  135.  128   2      
  136.  129   2                      //对控制端点的输入/输出进行应答
  137.  130   2                      D12_AcknowledgeEndpoint(0);
  138.  131   2                      D12_AcknowledgeEndpoint(1);
  139.  132   2      
  140.  133   2                      ControlData.wLength = ControlData.DeviceRequest.wLength;
  141.  134   2                      ControlData.wCount = 0;
  142.  135   2      
  143.  136   2                      if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
  144.  137   2                      {
  145.  138   3                              //向主机传输数据
  146.  139   3                              bEPPflags.bits.setup_packet = 1;
  147.  140   3                              bEPPflags.bits.control_state = USB_TRANSMIT;            /* get command */
  148.  141   3                      }
  149.  142   2                      else
  150.  143   2                      {  //从主机接收数据
  151.  144   3                              if (ControlData.DeviceRequest.wLength == 0) //如果接收长度是0
  152.  145   3                              {
  153.  146   4                                      bEPPflags.bits.setup_packet = 1;
  154.  147   4                                      bEPPflags.bits.control_state = USB_IDLE;                /* set command */
  155.  148   4                              }
  156.  149   3                              else 
  157.  150   3                              {
  158.  151   4                                      if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) 
  159.  152   4                                      {
  160.  153   5                                      
  161.  154   5                                              bEPPflags.bits.control_state = USB_IDLE;
  162.  155   5                                              D12_SetEndpointStatus(0, 1);
  163.  156   5                                              D12_SetEndpointStatus(1, 1);
  164.  157   5                                      }
  165.  158   4                                      else 
  166.  159   4                                      {
  167.  160   5                                              bEPPflags.bits.control_state = USB_RECEIVE;     //设置接收状态
  168.  161   5                                      }
  169.  162   4                              } // set command with data
  170.  163   3                      } // else set command
  171.  164   2              } // if setup packet
  172.  165   1      
  173.  166   1              else if (bEPPflags.bits.control_state == USB_RECEIVE) 
  174.  167   1              {
  175.  168   2                      //接收数据 (数据相位)
  176.  169   2                      i =     D12_ReadEndpoint(0, EP0_PACKET_SIZE,
  177.  170   2                              ControlData.dataBuffer + ControlData.wCount);
  178.  171   2                      ControlData.wCount += i;
  179.  172   2                      if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) 
  180.  173   2                      {
  181.  174   3                              //数据接收完毕
  182.  175   3                              bEPPflags.bits.setup_packet = 1;
  183.  176   3                              bEPPflags.bits.control_state = USB_IDLE;
  184.  177   3                      }
  185.  178   2              }
  186.  179   1              else 
  187. C51 COMPILER V7.02b   ISR                                                                  09/28/2006 22:04:34 PAGE 4   
  188.  180   1              {
  189.  181   2                      bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
  190.  182   2              }
  191.  183   1      }
  192.  184          
  193.  185          //端点0IN处理
  194.  186          void ep0_txdone(void)
  195.  187          {
  196.  188   1              short i = ControlData.wLength - ControlData.wCount;
  197.  189   1              D12_ReadLastTransactionStatus(1); //清中断标志位
  198.  190   1              if (bEPPflags.bits.control_state != USB_TRANSMIT) 
  199.  191   1                      return;//非发送状态,返回
  200.  192   1      
  201.  193   1              if( i >= EP0_PACKET_SIZE) 
  202.  194   1              {
  203.  195   2                      //剩下数据大于16字节,发送16字节
  204.  196   2                      D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
  205.  197   2                      ControlData.wCount += EP0_PACKET_SIZE;
  206.  198   2                      bEPPflags.bits.control_state = USB_TRANSMIT;
  207.  199   2              }
  208.  200   1              else if( i != 0) 
  209.  201   1              {
  210.  202   2                      //发送剩下数据
  211.  203   2                      D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
  212.  204   2                      ControlData.wCount += i;
  213.  205   2                      bEPPflags.bits.control_state = USB_IDLE;
  214.  206   2              }
  215.  207   1              else if (i == 0){
  216.  208   2                      D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
  217.  209   2                      bEPPflags.bits.control_state = USB_IDLE;
  218.  210   2              }
  219.  211   1      }
  220.  212          
  221.  213          //DMA结束处理
  222.  214          void dma_eot(void)
  223.  215          {
  224.  216   1      }
  225.  217          
  226.  218          //端点1IN处理
  227.  219          void ep1_txdone(void)
  228.  220          {
  229.  221   1              D12_ReadLastTransactionStatus(3); //清中断标志位
  230.  222   1      }
  231.  223          
  232.  224          //端点1OUT处理
  233.  225          void ep1_rxdone(void)
  234.  226          {  //控制LED/数码管/
  235.  227   1              unsigned char len;
  236.  228   1      
  237.  229   1              D12_ReadLastTransactionStatus(2); //清中断标志位
  238.  230   1              len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
  239.  231   1              if(len != 0)
  240.  232   1                      bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
  241.  233   1      }
  242.  234          
  243.  235          //主端点IN控制
  244.  236          void main_txdone(void)
  245.  237          {
  246.  238   1              D12_ReadLastTransactionStatus(5); //清中断标志位
  247.  239   1      
  248.  240   1      }
  249.  241          
  250. C51 COMPILER V7.02b   ISR                                                                  09/28/2006 22:04:34 PAGE 5   
  251.  242          //主端点OUT控制
  252.  243          void main_rxdone(void)
  253.  244          {
  254.  245   1              unsigned char len,epstatus;
  255.  246   1              D12_ReadLastTransactionStatus(4); //清中断标志位
  256.  247   1              //接收数据
  257.  248   1              len = D12_ReadEndpoint(4, 64, EpBuf);
  258.  249   1              epstatus=D12_ReadEndpointStatus(4);
  259.  250   1              epstatus &= 0x60;
  260.  251   1              if (epstatus == 0x60)
  261.  252   1                      len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
  262.  253   1              if(len != 0)
  263.  254   1              {
  264.  255   2                      bEPPflags.bits.main_rxdone = 1;//标志接收到数据
  265.  256   2              mainbuflen=len;
  266.  257   2              }
  267.  258   1      }
  268.  259          
  269.  260          
  270.  261          
  271.  262          
  272.  263          
  273.  264          
  274.  265          
  275.  266          
  276.  267          
  277.  268          
  278.  269          
  279.  270          
  280.  271          
  281.  272          
  282.  273          
  283.  274          
  284.  275          
  285.  276          
  286.  277          
  287.  278          
  288.  279          
  289.  280          
  290.  281          
  291. MODULE INFORMATION:   STATIC OVERLAYABLE
  292.    CODE SIZE        =    716    ----
  293.    CONSTANT SIZE    =   ----    ----
  294.    XDATA SIZE       =   ----    ----
  295.    PDATA SIZE       =   ----    ----
  296.    DATA SIZE        =      8       5
  297.    IDATA SIZE       =     87    ----
  298.    BIT SIZE         =   ----    ----
  299. END OF MODULE INFORMATION.
  300. C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)