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

📄 sl811.lst

📁 用C51编的SL811读写U盘的源程序,包含原理图
💻 LST
📖 第 1 页 / 共 5 页
字号:
 172   4                                      // not overwrite data in previous buffer.
 173   4                                      //------------------------------------------------      
 174   4                                      if(remainder==xferLen)                  // empty data detected
 175   4                                              bufLen = 0;                     // do not overwriten previous data
 176   4                                      else                                    // reset bufLen to zero
 177   4                                              bufLen = xferLen;               // update previous buffer length
 178   4                                      
 179   4                                      //------------------------------------------------      
C51 COMPILER V7.06   SL811                                                                 01/14/2008 22:33:40 PAGE 4   

 180   4                                      // Arm for next data transfer when requested data 
 181   4                                      // length have not reach zero, i.e. wLen!=0, and
 182   4                                      // last xferlen of data was completed, i.e.
 183   4                                      // remainder is equal to zero, not a short pkt
 184   4                                      //------------------------------------------------      
 185   4                                      if(!remainder && usbstack.wLen)                                                 // remainder==0 when last xferLen
 186   4                                      {                                                                                               // was all completed or wLen!=0
 187   5                                              addr    = (dataX & 1) ? data1:data0;            // select next address for data
 188   5                                              xferLen = (BYTE)(usbstack.wLen>=usbstack.wPayload) ? usbstack.wPayload:usbstack.wLen;   // get data len
             -gth required
 189   5                                              //if (FULL_SPEED)                                                               // sync with SOF transfer
 190   5                                              cmd |= 0x20;                                                    // always sync SOF when FS, regardless 
 191   5                                              SL811Write(EP0XferLen, xferLen);                        // select next xfer length
 192   5                                              SL811Write(EP0Address, addr);                   // data buffer addr 
 193   5                                              SL811Write(IntStatus,INT_CLEAR);                        // is a LS is on Hub.
 194   5                                              SL811Write(EP0Control,cmd);                                     // Enable USB transfer and re-arm
 195   5                                      }                               
 196   4      
 197   4                                      //------------------------------------------------
 198   4                                      // Copy last IN token data pkt from prev transfer
 199   4                                      // Check if there was data available during the
 200   4                                      // last data transfer
 201   4                                      //------------------------------------------------
 202   4                                      if(bufLen)                                                                              
 203   4                                      {       
 204   5                                              SL811BufRead(((dataX&1)?data0:data1), usbstack.buffer, bufLen);
 205   5                                              usbstack.buffer += bufLen;                                                              
 206   5                                      }
 207   4      
 208   4                                      //------------------------------------------------
 209   4                                      // Terminate on short packets, i.e. remainder!=0
 210   4                                      // a short packet or empty data packet OR when 
 211   4                                      // requested data len have completed, i.e.wLen=0
 212   4                                      // For a LOWSPEED device, the 1st device descp,
 213   4                                      // wPayload is default to 64-byte, LS device will
 214   4                                      // only send back a max of 8-byte device descp,
 215   4                                      // and host detect this as a short packet, and 
 216   4                                      // terminate with OUT status stage
 217   4                                      //------------------------------------------------
 218   4                                      if(remainder || !usbstack.wLen)
 219   4                                              break;
 220   4                              }// PID IN                                                      
 221   3                      }
 222   2                              
 223   2                      //-------------------------NAK----------------------------
 224   2                      if (result & EP0_NAK)                                                                   // NAK Detected
 225   2                      {                                                                                                               
 226   3                              if(usbstack.endpoint==0)                                                                                // on ep0 during enumeration of LS device
 227   3                              {                                                                                                       // happen when slave is not fast enough,
 228   4                                      SL811Write(IntStatus,INT_CLEAR);                                // clear interrupt status, need to
 229   4                                      SL811Write(EP0Control,cmd);                                             // re-arm and request for last cmd, IN token
 230   4                                      result = 0;                                     // respond to NAK status only
 231   4                              }
 232   3                              else                                                                                            // normal data endpoint, exit now !!! , non-zero ep
 233   3                                      break;                                                                                  // main loop control the interval polling
 234   3                      }
 235   2              
 236   2                      //-----------------------TIMEOUT--------------------------
 237   2                      if (result & EP0_TIMEOUT)                                                               // TIMEOUT Detected
 238   2                      {                                                                                                               
 239   3                              if(usbstack.endpoint==0)                                                                                // happens when hub enumeration
 240   3                              {
C51 COMPILER V7.06   SL811                                                                 01/14/2008 22:33:40 PAGE 5   

 241   4                                      if(++timeout >= TIMEOUT_RETRY)
 242   4                                      {       
 243   5                                          timeout--;
 244   5                                              break;                                                                          // exit on the timeout detected 
 245   5                                      }
 246   4                                      SL811Write(IntStatus,INT_CLEAR);                                // clear interrupt status, need to
 247   4                                      SL811Write(EP0Control,cmd);                                             // re-arm and request for last cmd again
 248   4                              }
 249   3                              else                                                                                            
 250   3                              {                                                                                                       // all other data endpoint, data transfer 
 251   4                                      bXXGFlags.bits.TIMEOUT_ERR = TRUE;                                                              // failed, set flag to terminate transfer
 252   4                                      break;                                                                                  // happens when data transfer on a device
 253   4                              }                                                                                                       // through the hub
 254   3                      }
 255   2      
 256   2                      //-----------------------STALL----------------------------
 257   2                      if (result & EP0_STALL)                                                                 // STALL detected
 258   2                              return TRUE;                                                                            // for unsupported request.
 259   2                                                                                                                                                      
 260   2                      //----------------------OVEFLOW---------------------------
 261   2                      if (result & EP0_OVERFLOW)                                                      // OVERFLOW detected
 262   2                              //result=result;
 263   2                              break;
 264   2                      //-----------------------ERROR----------------------------
 265   2                      if (result & EP0_ERROR)                                                                 // ERROR detected
 266   2                              //result=result;
 267   2                              break;
 268   2              }       // end of While(1)
 269   1         
 270   1              if (result & EP0_ACK)   // on ACK transmission
 271   1                      return TRUE;            // return OK
 272   1      
 273   1              return FALSE;                   // fail transmission
 274   1      
 275   1      }
 276          //*****************************************************************************************
 277          // Control Endpoint 0's USB Data Xfer
 278          // ep0Xfer, endpoint 0 data transfer
 279          //*****************************************************************************************
 280          unsigned char ep0Xfer(void)
 281          {
 282   1              //unsigned char wLen;
 283   1              
 284   1              //wLen=usbstack.wLen;
 285   1              usbstack.endpoint=0;
 286   1              //----------------------------------------------------
 287   1              // SETUP token with 8-byte request on endpoint 0
 288   1              //----------------------------------------------------
 289   1              usbstack.pid=PID_SETUP;
 290   1              usbstack.wLen=8;
 291   1              //usbstack.buffer=&usbstack.setup;
 292   1              if (!usbXfer()) 
 293   1                      return FALSE;
 294   1              //DelayMs(10);
 295   1              usbstack.pid  = PID_IN;
 296   1              //----------------------------------------------------
 297   1              // IN or OUT data stage on endpoint 0   
 298   1              //----------------------------------------------------
 299   1              usbstack.wLen=usbstack.setup.wLength;
 300   1              if (usbstack.wLen)                                                                                      // if there are data for transfer
 301   1              {
 302   2                      if (usbstack.setup.bmRequest & 0x80)            // host-to-device : IN token
C51 COMPILER V7.06   SL811                                                                 01/14/2008 22:33:40 PAGE 6   

 303   2                      {
 304   3                              usbstack.pid  = PID_IN; 
 305   3                              
 306   3                              if(!usbXfer())
 307   3                                      return FALSE;
 308   3                              //usbstack.wPayload = 0;
 309   3                              usbstack.pid  = PID_OUT;
 310   3                      }
 311   2                      else                                                                                    // device-to-host : OUT token
 312   2                      {                                                       
 313   3                              usbstack.pid  = PID_OUT;
 314   3                                      
 315   3                              if(!usbXfer())
 316   3                                      return FALSE;
 317   3                              usbstack.pid  = PID_IN;
 318   3                      }
 319   2              }
 320   1              //DelayMs(10);
 321   1              //----------------------------------------------------
 322   1              // Status stage IN or OUT zero-length data packet
 323   1              //----------------------------------------------------
 324   1              usbstack.wLen=0;
 325   1              if(!usbXfer())
 326   1                      return FALSE;
 327   1      
 328   1              return TRUE;                                                                                    
 329   1                                              
 330   1      }
 331          
 332          
 333          unsigned char epBulkSend(unsigned char *pBuffer,unsigned int len)
 334          {
 335   1              usbstack.usbaddr=0x1;
 336   1              usbstack.endpoint=usbstack.epbulkout;
 337   1              usbstack.pid=PID_OUT;
 338   1              usbstack.wPayload=64;
 339   1              usbstack.wLen=len;
 340   1              usbstack.buffer=pBuffer;
 341   1              while(len>0)
 342   1              {
 343   2                      if (len > usbstack.wPayload)
 344   2                              usbstack.wLen = usbstack.wPayload;
 345   2                      else                            
 346   2                              usbstack.wLen = len;    
 347   2                      if(!usbXfer())
 348   2                              return FALSE;

⌨️ 快捷键说明

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