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

📄 sl811.lst

📁 用C51编的SL811读写U盘的源程序,包含原理图
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V7.06   SL811                                                                 01/14/2008 22:33:40 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE SL811
OBJECT MODULE PLACED IN SL811.OBJ
COMPILER INVOKED BY: C:\Keil\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 XXGFLAGS bdata bXXGFlags;
   6          
   7          XXGPKG usbstack;
   8          unsigned char remainder;
   9          
  10          unsigned char xdata DBUF[BUFFER_LENGTH];
  11          
  12          pUSBDEV  idata  uDev;   // Multiple USB devices attributes, Max 5 devices
  13          //xdata pHUBDEV         uHub;                   // Struct for downstream device on HUB
  14          //pDevDesc  idata       pDev;                   // Device descriptor struct
  15          //pCfgDesc idata        pCfg;                   // Configuration descriptor struct
  16          //pIntfDesc idata       pIfc;                   // Interface descriptor struct
  17          //pEPDesc idata pEnp;                   // Endpoint descriptor struct
  18          //pStrDesc idata        pStr;                   // String descriptor struct
  19          //xdata pHidDesc                pHid;                   // HID class descriptor struct
  20          //xdata pHubDesc                pHub;                   // HUD class descriptor struct
  21          //xdata pPortStatus     pStat;                  // HID ports status
  22          
  23          //*****************************************************************************************
  24          // SL811H variables initialization
  25          //*****************************************************************************************
  26          unsigned char SL811_GetRev(void)
  27          {
  28   1              //SL811Write(SL811_ADDR_PORT, 0x0e);
  29   1              return SL811Read(0x0e);
  30   1      }
  31          
  32          void USBReset(void)
  33          {
  34   1              unsigned char temp;
  35   1              temp=SL811Read(CtrlReg);   
  36   1              SL811Write(CtrlReg,temp|0x08);
  37   1              DelayMs(25);            
  38   1                      
  39   1              SL811Write(CtrlReg,temp);    
  40   1      }
  41          
  42          //*****************************************************************************************
  43          // usbXfer:
  44          // successful transfer = return TRUE
  45          // fail transfer = return FALSE
  46          //*****************************************************************************************
  47          unsigned char usbXfer(void)
  48          {  
  49   1              
  50   1              unsigned char   xferLen, data0, data1,cmd;
  51   1              unsigned char intr,result,remainder,dataX,bufLen,addr,timeout;
  52   1              
  53   1              //------------------------------------------------
  54   1              // Default setting for usb trasnfer
  55   1              //------------------------------------------------
C51 COMPILER V7.06   SL811                                                                 01/14/2008 22:33:40 PAGE 2   

  56   1              dataX=timeout=0;
  57   1              //result          = SL811Read(EP0Status);       
  58   1              data0 = EP0_Buf;                                        // DATA0 buffer address
  59   1              data1 = data0 + (unsigned char)usbstack.wPayload;       // DATA1 buffer address
  60   1              bXXGFlags.bits.DATA_STOP=FALSE;
  61   1              bXXGFlags.bits.TIMEOUT_ERR=FALSE;
  62   1              //------------------------------------------------
  63   1              // Define data transfer payload
  64   1              //------------------------------------------------
  65   1              if (usbstack.wLen >= usbstack.wPayload)                 // select proper data payload
  66   1                      xferLen = usbstack.wPayload;                    // limit to wPayload size 
  67   1              else                                                    // else take < payload len
  68   1                      xferLen = usbstack.wLen;                        //      
  69   1              
  70   1              // For IN token
  71   1              if (usbstack.pid==PID_IN)                               // for current IN tokens
  72   1              {                                                                                               //
  73   2                      cmd = sDATA0_RD;                        // FS/FS on Hub, sync to sof
  74   2              }
  75   1              // For OUT token
  76   1              else if(usbstack.pid==PID_OUT)                          // for OUT tokens
  77   1              {       
  78   2                      if(xferLen)                                                                     // only when there are  
  79   2                              {
  80   3                              //intr=usbstack.setup.wLength;
  81   3                              //usbstack.setup.wLength=WordSwap(usbstack.setup.wLength);
  82   3                              SL811BufWrite(data0,usbstack.buffer,xferLen);   // data to transfer on USB
  83   3                              //usbstack.setup.wLength=intr;
  84   3                              }
  85   2                      cmd = sDATA0_WR;                                                // FS/FS on Hub, sync to sof
  86   2              // implement data toggle
  87   2                      bXXGFlags.bits.bData1 = uDev.bData1[usbstack.endpoint];
  88   2                      uDev.bData1[usbstack.endpoint] = (uDev.bData1[usbstack.endpoint] ? 0 : 1); // DataToggle
  89   2                      
  90   2                      if(bXXGFlags.bits.bData1)
  91   2                              cmd |= 0x40;                              // Set Data1 bit in command
  92   2              }
  93   1              // For SETUP/OUT token
  94   1              else                                                                                    // for current SETUP/OUT tokens
  95   1              {       
  96   2                      if(xferLen)                                                                     // only when there are  
  97   2                              {
  98   3                              intr=usbstack.setup.wLength;
  99   3                              usbstack.setup.wValue=WordSwap(usbstack.setup.wValue);
 100   3                              usbstack.setup.wIndex=WordSwap(usbstack.setup.wIndex);
 101   3                              usbstack.setup.wLength=WordSwap(usbstack.setup.wLength);
 102   3                              SL811BufWrite(data0,(unsigned char *)&usbstack.setup,xferLen);  // data to transfer on USB
 103   3                              usbstack.setup.wLength=intr;
 104   3                              }
 105   2                      cmd = sDATA0_WR;                                                // FS/FS on Hub, sync to sof
 106   2              }
 107   1              //------------------------------------------------
 108   1              // For EP0's IN/OUT token data, start with DATA1
 109   1              // Control Endpoint0's status stage.
 110   1              // For data endpoint, IN/OUT data, start ????
 111   1              //------------------------------------------------
 112   1              if (usbstack.endpoint == 0 && usbstack.pid != PID_SETUP)        // for Ep0's IN/OUT token
 113   1                      cmd |= 0x40;                                    // always set DATA1
 114   1              //------------------------------------------------
 115   1              // Arming of USB data transfer for the first pkt
 116   1              //------------------------------------------------
 117   1              SL811Write(EP0Status,((usbstack.endpoint&0x0F)|usbstack.pid));  // PID + EP address
C51 COMPILER V7.06   SL811                                                                 01/14/2008 22:33:40 PAGE 3   

 118   1              SL811Write(EP0Counter,usbstack.usbaddr);                                        // USB address
 119   1              SL811Write(EP0Address,data0);                                   // buffer address, start with "data0"
 120   1              SL811Write(EP0XferLen,xferLen);                                 // data transfer length
 121   1              SL811Write(IntStatus,INT_CLEAR);                                // clear interrupt status
 122   1              SL811Write(EP0Control,cmd);                                             // Enable ARM and USB transfer start here
 123   1              
 124   1              //------------------------------------------------
 125   1              // Main loop for completing a wLen data trasnfer
 126   1              //------------------------------------------------
 127   1              while(TRUE)
 128   1              {   
 129   2                      //---------------Wait for done interrupt------------------
 130   2                      while(TRUE)                                                                                             // always ensure requested device is
 131   2                      {                                                                                                               // inserted at all time, then you will
 132   3                              //intr=SL811Read(cSOFcnt);
 133   3                              //intr=SL811Read(IntEna);
 134   3                              intr = SL811Read(IntStatus);    
 135   3                                                                      // wait for interrupt to be done, and 
 136   3                              if((intr & USB_RESET) || (intr & INSERT_REMOVE))        // proceed to parse result from slave 
 137   3                              {                                                                                                       // device.
 138   4                                      bXXGFlags.bits.DATA_STOP = TRUE;                                                                // if device is removed, set DATA_STOP
 139   4                                      return FALSE;                                                                   // flag true, so that main loop will 
 140   4                              }                                                                                                       // know this condition and exit gracefully
 141   3                              if(intr & USB_A_DONE)                                                           
 142   3                                      break;                                                                                  // interrupt done !!!
 143   3                      }
 144   2      
 145   2                      SL811Write(IntStatus,INT_CLEAR);                                                // clear interrupt status
 146   2                      result    = SL811Read(EP0Status);                                               // read EP0status register
 147   2                      remainder = SL811Read(EP0Counter);                                              // remainder value in last pkt xfer
 148   2      
 149   2                      //-------------------------ACK----------------------------
 150   2                      if (result & EP0_ACK)                                                                   // Transmission ACK
 151   2                      {       
 152   3      
 153   3                              // SETUP TOKEN
 154   3                              if(usbstack.pid == PID_SETUP)                                                           // do nothing for SETUP/OUT token 
 155   3                                      break;                                                                                  // exit while(1) immediately
 156   3      
 157   3                              // OUT TOKEN                            
 158   3                              else if(usbstack.pid == PID_OUT)
 159   3                                      break;
 160   3      
 161   3                              // IN TOKEN
 162   3                              else if(usbstack.pid == PID_IN)
 163   3                              {                                                                                                       // for IN token only
 164   4                                      usbstack.wLen  -= (WORD)xferLen;        // update remainding wLen value
 165   4                                      cmd   ^= 0x40;                          // toggle DATA0/DATA1
 166   4                                      dataX++;                                // point to next dataX
 167   4      
 168   4                                      //------------------------------------------------      
 169   4                                      // If host requested for more data than the slave 
 170   4                                      // have, and if the slave's data len is a multiple
 171   4                                      // of its endpoint payload size/last xferLen. Do 

⌨️ 快捷键说明

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