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

📄 sl811.lst

📁 本程序是基于单片机C8051F020上使用SL811 USB 总线接口实现检测U 盘的功能。插上U 盘
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V7.06   SL811                                                                 04/30/2005 15:12:27 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 DB OE

stmt level    source

   1          #include "common.h"
   2          
   3          extern XXGFLAGS bdata bXXGFlags;
   4          
   5          XXGPKG usbstack;
   6          unsigned char remainder;
   7          
   8          unsigned char remainder;
   9          
  10          unsigned char xdata DBUF[BUFFER_LENGTH];
  11          unsigned char data  ASSII[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,
             -0x46};
  12          
  13          
  14          pUSBDEV  idata  uDev;   // Multiple USB devices attributes, Max 5 devices
  15          
  16          sbit nReset=P3^0;
  17          //*****************************************************************************************
  18          // SL811H variables initialization
  19          //*****************************************************************************************
  20           /*
  21          void SL811_GetRev(void)
  22          {
  23                  nReset=0;
  24                  DelayMs(5);
  25                  nReset=1;
  26                  DelayMs(5);
  27          }
  28          
  29          */
  30          
  31          void USBhard_Reset(void)
  32          {
  33   1              nReset=0;
  34   1              Delay_ms(5);
  35   1              nReset=1;
  36   1              Delay_ms(5);
  37   1      }
  38          
  39          
  40          void USBReset(void)
  41          {
  42   1              unsigned char temp;
  43   1          temp=SL811Read(CtrlReg);   
  44   1              SL811Write(CtrlReg,temp|0x08);
  45   1              Delay_ms(25);
  46   1              SL811Write(CtrlReg,temp|0x18);
  47   1              Delay_ms(25);
  48   1              SL811Write(CtrlReg,temp|0x08);
  49   1              Delay_ms(25);           
  50   1          SL811Write(CtrlReg,temp);    
  51   1      }
  52          
  53          //*****************************************************************************************
  54          // usbXfer:
C51 COMPILER V7.06   SL811                                                                 04/30/2005 15:12:27 PAGE 2   

  55          // successful transfer = return TRUE
  56          // fail transfer = return FALSE
  57          //*****************************************************************************************
  58          
  59          unsigned char usbXfer(void)
  60          {  
  61   1              
  62   1              unsigned char   xferLen, data0, data1,cmd;
  63   1              unsigned char intr,result,remainder,dataX,bufLen,addr,timeout;
  64   1              
  65   1              //------------------------------------------------
  66   1              // Default setting for usb trasnfer
  67   1              //------------------------------------------------
  68   1              dataX=timeout=0;
  69   1              //result          = SL811Read(EP0Status);       
  70   1              data0 = EP0_Buf;                                        // DATA0 buffer address
  71   1              data1 = data0 + (unsigned char)usbstack.wPayload;       // DATA1 buffer address
  72   1              bXXGFlags.bits.DATA_STOP=FALSE;
  73   1              bXXGFlags.bits.TIMEOUT_ERR=FALSE;
  74   1              //------------------------------------------------
  75   1              // Define data transfer payload
  76   1              //------------------------------------------------
  77   1              if (usbstack.wLen >= usbstack.wPayload)                 // select proper data payload
  78   1                      xferLen = usbstack.wPayload;                    // limit to wPayload size 
  79   1              else                                                    // else take < payload len
  80   1                      xferLen = usbstack.wLen;                        //      
  81   1              
  82   1              // For IN token
  83   1              if (usbstack.pid==PID_IN)                               // for current IN tokens
  84   1              {                                                                                               //
  85   2                      cmd = sDATA0_RD;                        // FS/FS on Hub, sync to sof
  86   2              }
  87   1              // For OUT token
  88   1              else if(usbstack.pid==PID_OUT)                          // for OUT tokens
  89   1              {       
  90   2                      if(xferLen)                                                                     // only when there are  
  91   2                              {
  92   3                              //intr=usbstack.setup.wLength;
  93   3                              //usbstack.setup.wLength=WordSwap(usbstack.setup.wLength);
  94   3                              SL811BufWrite(data0,usbstack.buffer,xferLen);   // data to transfer on USB
  95   3                              //usbstack.setup.wLength=intr;
  96   3                              }
  97   2                      cmd = sDATA0_WR;                                                // FS/FS on Hub, sync to sof
  98   2              // implement data toggle
  99   2                      bXXGFlags.bits.bData1 = uDev.bData1[usbstack.endpoint];
 100   2                      uDev.bData1[usbstack.endpoint] = (uDev.bData1[usbstack.endpoint] ? 0 : 1); // DataToggle
 101   2                      
 102   2                      if(bXXGFlags.bits.bData1)
 103   2                              cmd |= 0x40;                              // Set Data1 bit in command
 104   2              }
 105   1              // For SETUP/OUT token
 106   1              else                                                                                    // for current SETUP/OUT tokens
 107   1              {       
 108   2                      if(xferLen)                                                                     // only when there are  
 109   2                              {
 110   3                              intr=usbstack.setup.wLength;
 111   3                              usbstack.setup.wValue=WordSwap(usbstack.setup.wValue);
 112   3                              usbstack.setup.wIndex=WordSwap(usbstack.setup.wIndex);
 113   3                              usbstack.setup.wLength=WordSwap(usbstack.setup.wLength);
 114   3                              SL811BufWrite(data0,(unsigned char *)&usbstack.setup,xferLen);  // data to transfer on USB
 115   3                              usbstack.setup.wLength=intr;
 116   3                              }
C51 COMPILER V7.06   SL811                                                                 04/30/2005 15:12:27 PAGE 3   

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

 179   4      
 180   4                                      //------------------------------------------------      
 181   4                                      // If host requested for more data than the slave 
 182   4                                      // have, and if the slave's data len is a multiple
 183   4                                      // of its endpoint payload size/last xferLen. Do 

⌨️ 快捷键说明

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