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

📄 mainloop.lst

📁 周立功实验板DP-51+的实验程序
💻 LST
字号:
C51 COMPILER V7.01  MAINLOOP                                                               09/18/2003 10:10:15 PAGE 1   


C51 COMPILER V7.01, COMPILATION OF MODULE MAINLOOP
OBJECT MODULE PLACED IN Mainloop.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE Mainloop.c BROWSE DEBUG OBJECTEXTEND

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          #include "chap_9.h"
  11          #include "protodma.h"
  12          /*
  13          //*************************************************************************
  14          // USB protocol function pointer arrays
  15          //*************************************************************************
  16          */
  17          
  18          
  19          //USB标准请求
  20          code void (*StandardDeviceRequest[])(void) =
  21          {
  22                  get_status,
  23                  clear_feature,
  24                  reserved,
  25                  set_feature,
  26                  reserved,
  27                  set_address,
  28                  get_descriptor,
  29                  reserved,
  30                  get_configuration,
  31                  set_configuration,
  32                  get_interface,
  33                  set_interface,
  34                  reserved,
  35                  reserved,
  36                  reserved,
  37                  reserved
  38                  };
  39          
  40          //用户厂商请求
  41          code void (*VendorDeviceRequest[])(void) =
  42          {
  43                  reserved,
  44                  reserved,
  45                  reserved,
  46                  reserved,
  47                  reserved,
  48                  reserved,
  49                  reserved,
  50                  reserved,
  51                  reserved,
  52                  reserved,
  53                  reserved,
  54                  reserved,
  55                  read_write_register,
C51 COMPILER V7.01  MAINLOOP                                                               09/18/2003 10:10:15 PAGE 2   

  56                  reserved,
  57                  reserved,
  58                  reserved
  59                  };
  60          
  61          /*
  62          //*************************************************************************
  63          //  Public static data
  64          //*************************************************************************
  65          */
  66          
  67          extern EPPFLAGS bEPPflags;
  68          extern unsigned long ClockTicks;
  69          extern unsigned char idata GenEpBuf[];
  70          extern IO_REQUEST idata ioRequest;
  71          
  72          extern unsigned char ioSize, ioCount;
  73          extern unsigned char idata EpBuf[];
  74          
  75          CONTROL_XFER ControlData;
  76          BOOL bNoRAM;
  77          
  78          /* Configure Timer 0
  79             - Mode                  = 1
  80             - Interrupt                   = ENABLED
  81             - Clock Source                = INTERNAL
  82             - Enable Gating Control    = DISABLED
  83          */
  84          //定时器0初始化程序
  85          //定时器用来定时检测按键状态
  86          void init_timer0(void)
  87          {
  88   1              TMOD &= 0XF0;               /* clear Timer 0   */
  89   1              TMOD  |= 0X1;
  90   1              TL0 = 0X0;                  /* value set by user    */
  91   1              TH0 = 0X0;                  /* value set by user  */
  92   1              ET0 = 1;                                /* IE.1*/
  93   1              TR0 = 1;                        /* TCON.4 start timer  */
  94   1              PT0 = 0;
  95   1              EA = 1;
  96   1      }
  97          
  98          /* Interrupt Control Unit */
  99          /*   ****  Enabled interrupts in Interrupt Enable Register ****
 100                   ****  GLOBAL INTERRUPT MUST BE ENABLED FOR ANY OTHER
 101                   ****  INTERRUPT TO WORK!
 102          */
 103          /*                  GLOBAL INTERRUPT DISABLED ALL INTERRUPTS
 104                                                  ARE DISABLED          */
 105          /*                    External interrupt 0      */
 106          /*                        Priority Level = 0    */
 107          /*                        Timer 0 interrupt     */
 108          /*                       Priority Level = 0     */
 109          //中断设置
 110          void init_special_interrupts(void)
 111          {
 112   1              IT1 = 0;
 113   1              EX1 = 1;
 114   1              PX1 = 0;
 115   1      }
 116          
 117          //I/O口初始化程序
C51 COMPILER V7.01  MAINLOOP                                                               09/18/2003 10:10:15 PAGE 3   

 118          void init_port()
 119          {
 120   1              P0 = 0xFF;
 121   1              P1 = 0xFF;
 122   1              P2 = 0xFF;
 123   1              P3 = 0xFF;
 124   1              D12SUSPD = 0;
 125   1      }
 126          
 127          void main(void)
 128          {
 129   1              init_port();//初始化I/O口
 130   1      
 131   1              init_timer0();//初始化定时器0
 132   1              init_special_interrupts();//设置中断
 133   1      
 134   1              bEPPflags.value = 0;
 135   1      
 136   1              reconnect_USB();//重新连接USB
 137   1      
 138   1              /* Main program loop */
 139   1      
 140   1              while( TRUE ){
 141   2      
 142   2                      if (bEPPflags.bits.setup_packet){//Setup包处理
 143   3                              DISABLE;
 144   3                              bEPPflags.bits.setup_packet = 0;
 145   3                              ENABLE;
 146   3                              control_handler();//调用请求处理子程序
 147   3                              D12SUSPD = 1;
 148   3                      } // if setup_packet    
 149   2      
 150   2                      if (bEPPflags.bits.bus_reset) {//设备复位处理
 151   3                              DISABLE;
 152   3                              bEPPflags.bits.bus_reset = 0;
 153   3                              ENABLE;
 154   3                              // Release D12's SUSPEND pin after bus reset
 155   3                              // Enable 74HCT123 pulse generation before disconnect
 156   3                              D12SUSPD = 1;
 157   3                      } // if bus reset
 158   2      
 159   2                      if(bEPPflags.bits.setup_dma != 0) {//DMA状态改变处理
 160   3                              DISABLE;
 161   3                              bEPPflags.bits.setup_dma --;
 162   3                              ENABLE;
 163   3                              setup_dma();
 164   3                      } // if setup_dma
 165   2              } // Main Loop
 166   1      }
 167          
 168          //返回stall应答
 169          void stall_ep0(void)
 170          {
 171   1              D12_SetEndpointStatus(0, 1);
 172   1              D12_SetEndpointStatus(1, 1);
 173   1      }
 174          
 175          //断开USB总线
 176          void disconnect_USB(void)
 177          {
 178   1              // Initialize D12 configuration
 179   1              D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
C51 COMPILER V7.01  MAINLOOP                                                               09/18/2003 10:10:15 PAGE 4   

 180   1      }
 181          
 182          //连接USB总线
 183          void connect_USB(void)
 184          {
 185   1              // reset event flags
 186   1              DISABLE;
 187   1              bEPPflags.value = 0;//清除所有状态
 188   1              ENABLE;
 189   1      
 190   1              // V2.1 enable normal+sof interrupt
 191   1              D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
 192   1      
 193   1              // Initialize D12 configuration
 194   1              D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
 195   1      }
 196          
 197          //重新连接到USB总线
 198          void reconnect_USB(void)
 199          {
 200   1              unsigned long clk_cnt;
 201   1      
 202   1              // Pull-down D12's SUSPEND pin
 203   1              // Disable 74HCT123 pulse generation before disconnect
 204   1              // Release D12's SUSPEND pin after receiving bus reset from host
 205   1              D12SUSPD = 0;
 206   1              disconnect_USB();
 207   1      
 208   1              clk_cnt = ClockTicks;
 209   1              while(ClockTicks < clk_cnt + 20)
 210   1                      ;
 211   1      
 212   1              connect_USB();
 213   1      
 214   1      }
 215          
 216          //恢复到未配置状态
 217          void init_unconfig(void)
 218          {
 219   1      //      unsigned char i;
 220   1      
 221   1              D12_SetEndpointEnable(0);       /* Disable all endpoints but EPP0. */
 222   1      }
 223          
 224          //设置配置状态
 225          void init_config(void)
 226          {
 227   1              D12_SetEndpointEnable(1);       /* Enable  generic/iso endpoints. */
 228   1      }
 229          
 230          //从端点号1发送数据
 231          void single_transmit(unsigned char * buf, unsigned char len)
 232          {
 233   1              if( len <= EP0_PACKET_SIZE) {
 234   2                      D12_WriteEndpoint(1, len, buf);
 235   2              }
 236   1      }
 237          
 238          //发送端点号1建立代码
 239          void code_transmit(unsigned char code * pRomData, unsigned short len)
 240          {
 241   1              ControlData.wCount = 0;
C51 COMPILER V7.01  MAINLOOP                                                               09/18/2003 10:10:15 PAGE 5   

 242   1              if(ControlData.wLength > len)
 243   1                      ControlData.wLength = len;
 244   1      
 245   1              ControlData.pData = pRomData;
 246   1              if( ControlData.wLength >= EP0_PACKET_SIZE) {
 247   2                      D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
 248   2                      ControlData.wCount += EP0_PACKET_SIZE;
 249   2                      DISABLE;
 250   2                      bEPPflags.bits.control_state = USB_TRANSMIT;
 251   2                      ENABLE;
 252   2              }
 253   1              else {
 254   2                      D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
 255   2                      ControlData.wCount += ControlData.wLength;
 256   2                      DISABLE;
 257   2                      bEPPflags.bits.control_state = USB_IDLE;
 258   2                      ENABLE;
 259   2              }
 260   1      }
 261          
 262          
 263          
 264          //DMA建立子程序
 265          void setup_dma()
 266          {
 267   1              ioSize = ioRequest.uSize;
 268   1              ioCount = 0;
 269   1      
 270   1              DISABLE;
 271   1              bEPPflags.bits.dma_state = DMA_RUNNING;
 272   1              ENABLE;
 273   1      
 274   1              single_transmit(0, 0);
 275   1      
 276   1              if(ioRequest.bCommand & 0x1) {
 277   2                      if(ioSize > 64 || ioSize == 0) {
 278   3                              //传输大于64字节数据
 279   3                              D12_WriteEndpoint(5, 64, EpBuf);
 280   3                              ioCount += 64;
 281   3                      }
 282   2                      else {
 283   3                              //传输64字节数据
 284   3                              D12_WriteEndpoint(5, ioSize, EpBuf);
 285   3                              ioCount += ioSize;
 286   3                      }
 287   2              }
 288   1      }
 289          
 290          //请求处理子程序
 291          void control_handler()
 292          {
 293   1              unsigned char type, req;
 294   1      
 295   1              type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
 296   1              req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
 297   1      
 298   1              if (type == USB_STANDARD_REQUEST)
 299   1                      (*StandardDeviceRequest[req])();//调用标准请求
 300   1              else if (type == USB_VENDOR_REQUEST)
 301   1                      (*VendorDeviceRequest[req])();//调用厂商请求
 302   1              else
 303   1                      stall_ep0();
C51 COMPILER V7.01  MAINLOOP                                                               09/18/2003 10:10:15 PAGE 6   

 304   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    533    ----
   CONSTANT SIZE    =     96    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     24       8
   IDATA SIZE       =   ----    ----
   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 + -