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

📄 sl811.lst

📁 利用51单片机对u盘进行读写操作
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.06   SL811                                                                 08/10/2005 23:36:34 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE SL811
OBJECT MODULE PLACED IN SL811.OBJ
COMPILER INVOKED BY: D:\Keil51\C51\BIN\C51.EXE SL811.C BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include "common.h"
   2          #include "SL811.H"
   3          #include "HAL.H"
   4          
   5          extern FLAGS bdata bFlags;
   6          PKG usbstack;
   7          unsigned char xdata DBUF[BUFFER_LENGTH];
   8          pUSBDEV xdata uDev;     // Multiple USB devices attributes, Max 5 devices
   9          
  10          //*****************************************************************************************
  11          // SL811H variables initialization
  12          //*****************************************************************************************
  13          void USBReset(void)
  14          {
  15   1              unsigned char temp;
  16   1          temp=SL811Read(CtrlReg);   
  17   1              SL811Write(CtrlReg,temp|0x08);
  18   1              DelayMs(25);
  19   1              SL811Write(CtrlReg,temp);    
  20   1      }
  21          
  22          //*****************************************************************************************
  23          // usbXfer:
  24          // successful transfer = return TRUE
  25          // fail transfer = return FALSE
  26          //*****************************************************************************************
  27          unsigned char usbXfer(void)
  28          {  
  29   1              
  30   1              unsigned char xferLen, data0, data1,cmd;
  31   1              unsigned char intr,result,remainder,dataX,bufLen,addr,timeout;
  32   1              unsigned char out[8];
  33   1              //------------------------------------------------
  34   1              // Default setting for usb trasnfer
  35   1              //------------------------------------------------
  36   1              dataX=timeout=0;
  37   1              
  38   1              data0 = EP0_Buf;                                        // DATA0 buffer address
  39   1              data1 = data0 + (unsigned char)usbstack.wPayload;       // DATA1 buffer address
  40   1              bFlags.bits.DATA_STOP=FALSE;
  41   1              bFlags.bits.TIMEOUT_ERR=FALSE;
  42   1              //------------------------------------------------
  43   1              // Define data transfer payload
  44   1              //------------------------------------------------
  45   1              if (usbstack.wLen >= usbstack.wPayload)                 // select proper data payload
  46   1                      xferLen = usbstack.wPayload;                    // limit to wPayload size 
  47   1              else                                                    // else take < payload len
  48   1                      xferLen = usbstack.wLen;                        //      
  49   1              
  50   1              // For IN token
  51   1              if (usbstack.pid==PID_IN)                               // for current IN tokens
  52   1              {                                                                                               //
  53   2                      cmd = sDATA0_RD;                        // FS/FS on Hub, sync to sof
  54   2              }
  55   1              // For OUT token
C51 COMPILER V7.06   SL811                                                                 08/10/2005 23:36:34 PAGE 2   

  56   1              else if(usbstack.pid==PID_OUT)                          // for OUT tokens
  57   1              {       
  58   2                      if(xferLen)                                                                     // only when there are  
  59   2                              {
  60   3                              SL811BufWrite(data0,usbstack.buffer,xferLen);   // data to transfer on USB
  61   3                              }
  62   2                      cmd = sDATA0_WR;                                                // FS/FS on Hub, sync to sof
  63   2              // implement data toggle
  64   2                      bFlags.bits.bData1 = uDev.bData1[usbstack.endpoint];
  65   2                      uDev.bData1[usbstack.endpoint] = (uDev.bData1[usbstack.endpoint] ? 0 : 1); // DataToggle
  66   2                      
  67   2                      if(bFlags.bits.bData1)
  68   2                              cmd |= 0x40;                              // Set Data1 bit in command
  69   2              }
  70   1              //------------------------------------------------
  71   1              // For SETUP/OUT token
  72   1              //------------------------------------------------
  73   1              else                                                                                    // for current SETUP/OUT tokens
  74   1              {       
  75   2                      if(xferLen)                                                                     // only when there are  
  76   2                              {                                                                               // data to transfer on USB
  77   3                              intr=usbstack.setup.wLength;                    
  78   3                              out[0]=usbstack.setup.bmRequest;
  79   3                              out[1]=usbstack.setup.bRequest;
  80   3                              out[2]=(unsigned char)usbstack.setup.wValue;
  81   3                              out[3]=(unsigned char)(usbstack.setup.wValue>>8);
  82   3                              out[4]=(unsigned char)usbstack.setup.wIndex;
  83   3                              out[5]=(unsigned char)(usbstack.setup.wIndex>>8);
  84   3                              out[6]=(unsigned char)usbstack.setup.wLength;
  85   3                              out[7]=(unsigned char)(usbstack.setup.wLength>>8);
  86   3                              SL811BufWrite(data0,out,xferLen);
  87   3                              usbstack.setup.wLength=intr;
  88   3                              }
  89   2                      cmd = sDATA0_WR;                                                        // FS/FS on Hub, sync to sof
  90   2              }
  91   1              //------------------------------------------------
  92   1              // For EP0's IN/OUT token data, start with DATA1
  93   1              // Control Endpoint0's status stage.
  94   1              // For data endpoint, IN/OUT data, start ????
  95   1              //------------------------------------------------
  96   1              if (usbstack.endpoint == 0 && usbstack.pid != PID_SETUP)        // for Ep0's IN/OUT token
  97   1                      cmd |= 0x40;                                    // always set DATA1
  98   1              //------------------------------------------------
  99   1              // Arming of USB data transfer for the first pkt
 100   1              //------------------------------------------------
 101   1              SL811Write(EP0Status,((usbstack.endpoint&0x0F)|usbstack.pid));  // PID + EP address
 102   1              SL811Write(EP0Counter,usbstack.usbaddr);                                        // USB address
 103   1              SL811Write(EP0Address,data0);                                   // buffer address, start with "data0"
 104   1              SL811Write(EP0XferLen,xferLen);                                 // data transfer length
 105   1              SL811Write(IntStatus,INT_CLEAR);                                // clear interrupt status
 106   1              SL811Write(EP0Control,cmd);                                             // Enable ARM and USB transfer start here
 107   1              
 108   1              //------------------------------------------------
 109   1              // Main loop for completing a wLen data trasnfer
 110   1              //------------------------------------------------
 111   1              while(TRUE)
 112   1              {   
 113   2                      //---------------Wait for done interrupt------------------
 114   2                      while(TRUE)                                                                                             // always ensure requested device is
 115   2                      {                                                                                                               // inserted at all time, then you will
 116   3                              intr = SL811Read(IntStatus);    
 117   3                                                                              // wait for interrupt to be done, and 
C51 COMPILER V7.06   SL811                                                                 08/10/2005 23:36:34 PAGE 3   

 118   3                              if((intr & USB_RESET) || (intr & INSERT_REMOVE))        // proceed to parse result from slave 
 119   3                              {                                                                                                       // device.
 120   4                                      bFlags.bits.DATA_STOP = TRUE;                                                           // if device is removed, set DATA_STOP
 121   4                                      return FALSE;                                                                   // flag true, so that main loop will 
 122   4                              }                                                                                                       // know this condition and exit gracefully
 123   3                              if(intr & USB_A_DONE)                                                           
 124   3                                      break;                                                  // interrupt done !!!
 125   3                      }
 126   2      
 127   2                      SL811Write(IntStatus,INT_CLEAR); // clear interrupt status
 128   2                      result    = SL811Read(EP0Status);                                               // read EP0status register
 129   2                      remainder = SL811Read(EP0Counter);                                              // remainder value in last pkt xfer
 130   2      
 131   2                      //-------------------------ACK----------------------------
 132   2                      if (result & EP0_ACK)                                                                   // Transmission ACK
 133   2                      {       
 134   3      
 135   3                              // SETUP TOKEN
 136   3                              if(usbstack.pid == PID_SETUP)                                                           // do nothing for SETUP/OUT token 
 137   3                                      break;                                                                                  // exit while(1) immediately
 138   3      
 139   3                              // OUT TOKEN                            
 140   3                              else if(usbstack.pid == PID_OUT)
 141   3                                      break;
 142   3      
 143   3                              // IN TOKEN
 144   3                              else if(usbstack.pid == PID_IN)
 145   3                              {                                                                                                       // for IN token only
 146   4                                      usbstack.wLen  -= (WORD)xferLen;        // update remainding wLen value
 147   4                                      cmd   ^= 0x40;                          // toggle DATA0/DATA1
 148   4                                      dataX++;                                // point to next dataX
 149   4      
 150   4                                      //------------------------------------------------      
 151   4                                      // If host requested for more data than the slave 
 152   4                                      // have, and if the slave's data len is a multiple
 153   4                                      // of its endpoint payload size/last xferLen. Do 
 154   4                                      // not overwrite data in previous buffer.
 155   4                                      //------------------------------------------------      
 156   4                                      if(remainder==xferLen)                  // empty data detected
 157   4                                              bufLen = 0;                     // do not overwriten previous data
 158   4                                      else                                    // reset bufLen to zero
 159   4                                              bufLen = xferLen;               // update previous buffer length
 160   4                                      
 161   4                                      //------------------------------------------------      
 162   4                                      // Arm for next data transfer when requested data 
 163   4                                      // length have not reach zero, i.e. wLen!=0, and
 164   4                                      // last xferlen of data was completed, i.e.
 165   4                                      // remainder is equal to zero, not a short pkt
 166   4                                      //------------------------------------------------      
 167   4                                      if(!remainder && usbstack.wLen)                                                 // remainder==0 when last xferLen
 168   4                                      {                                                                                               // was all completed or wLen!=0
 169   5                                              addr    = (dataX & 1) ? data1:data0;            // select next address for data
 170   5                                              xferLen = (BYTE)(usbstack.wLen>=usbstack.wPayload) ? usbstack.wPayload:usbstack.wLen;   // get data len
             -gth required
 171   5                                                                      
 172   5                                              cmd |= 0x20;                                                    // always sync SOF when FS, regardless 
 173   5                                              SL811Write(EP0XferLen, xferLen);                        // select next xfer length
 174   5                                              SL811Write(EP0Address, addr);                   // data buffer addr 
 175   5                                              SL811Write(IntStatus,INT_CLEAR);                        // is a LS is on Hub.
 176   5                                              SL811Write(EP0Control,cmd);                                     // Enable USB transfer and re-arm
 177   5                                      }                               
 178   4      
C51 COMPILER V7.06   SL811                                                                 08/10/2005 23:36:34 PAGE 4   

 179   4                                      //------------------------------------------------
 180   4                                      // Copy last IN token data pkt from prev transfer

⌨️ 快捷键说明

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