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

📄 sl811.lst

📁 采用811芯片实现单片机读写U盘的源代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
 187   3                              // OUT TOKEN                            
 188   3                              else if(usbstack.pid == PID_OUT)
 189   3                              {
 190   4                                      usbstack.wLen  -= (WORD)xferLen;
 191   4                                      usbstack.buffer += xferLen;
 192   4                                      //cmd ^=0x40;
 193   4                                      //dataX++;
 194   4                                      
 195   4                                      if(!usbstack.wLen)
 196   4                                              break;
 197   4                                      ////////////////////////////////////
 198   4                                      if (usbstack.wLen >= usbstack.wPayload)                 // select proper data payload
 199   4                                              xferLen = usbstack.wPayload;                    // limit to wPayload size 
 200   4                                      else                                                    // else take < payload len
 201   4                                              xferLen = usbstack.wLen;        
 202   4                                      
 203   4                                      ////////////////////////////////////
 204   4                                      //if(bufLen)                                                                            
 205   4                                      {       
 206   5                                              //addr    = (dataX & 1) ? data1:data0; 
 207   5                                              addr=data0;
 208   5                                              
 209   5                                              SL811BufWrite(addr,usbstack.buffer,xferLen);
 210   5                                              
 211   5                                              cmd = sDATA0_WR;
 212   5                                              bXXGFlags.bits.bData1 = uDev.bData1[usbstack.endpoint];
 213   5                                              uDev.bData1[usbstack.endpoint] = (uDev.bData1[usbstack.endpoint] ? 0 : 1); // DataToggle
 214   5                      
 215   5                                              if(bXXGFlags.bits.bData1)
 216   5                                                      cmd |= 0x40;    
 217   5                                                                      // always sync SOF when FS, regardless 
 218   5                                              SL811Write(EP0XferLen, xferLen);                // select next xfer length
 219   5                                              SL811Write(EP0Address, addr);                   // data buffer addr 
 220   5                                              SL811Write(IntStatus,INT_CLEAR);                // is a LS is on Hub.
 221   5                                              SL811Write(EP0Control,cmd);                     // Enable USB transfer and re-arm
 222   5                                      }       
 223   4                                      
 224   4                              } //PID OUT
 225   3                              // IN TOKEN
 226   3                              else if(usbstack.pid == PID_IN)
 227   3                              {                                                                                                       // for IN token only
 228   4                                      usbstack.wLen  -= (WORD)xferLen;        // update remainding wLen value
 229   4                                      cmd   ^= 0x40;                          // toggle DATA0/DATA1
 230   4                                      dataX++;                                // point to next dataX
 231   4      
 232   4                                      //------------------------------------------------      
 233   4                                      // If host requested for more data than the slave 
 234   4                                      // have, and if the slave's data len is a multiple
 235   4                                      // of its endpoint payload size/last xferLen. Do 
 236   4                                      // not overwrite data in previous buffer.
 237   4                                      //------------------------------------------------      
 238   4                                      if(remainder==xferLen)                  // empty data detected
 239   4                                              bufLen = 0;                     // do not overwriten previous data
 240   4                                      else                                    // reset bufLen to zero
 241   4                                              bufLen = xferLen;               // update previous buffer length
C51 COMPILER V7.00  SL811                                                                  09/22/2005 17:57:50 PAGE 5   

 242   4                                      
 243   4                                      //------------------------------------------------      
 244   4                                      // Arm for next data transfer when requested data 
 245   4                                      // length have not reach zero, i.e. wLen!=0, and
 246   4                                      // last xferlen of data was completed, i.e.
 247   4                                      // remainder is equal to zero, not a short pkt
 248   4                                      //------------------------------------------------      
 249   4                                      if(!remainder && usbstack.wLen)                                                 // remainder==0 when last xferLen
 250   4                                      {                                                                                               // was all completed or wLen!=0
 251   5                                              addr    = (dataX & 1) ? data1:data0;            // select next address for data
 252   5                                              xferLen = (BYTE)(usbstack.wLen>=usbstack.wPayload) ? usbstack.wPayload:usbstack.wLen;   // get data len
             -gth required
 253   5                                              //if (FULL_SPEED)                                                               // sync with SOF transfer
 254   5                                              cmd |= 0x20;                                    // always sync SOF when FS, regardless 
 255   5                                              SL811Write(EP0XferLen, xferLen);                // select next xfer length
 256   5                                              SL811Write(EP0Address, addr);                   // data buffer addr 
 257   5                                              SL811Write(IntStatus,INT_CLEAR);                // is a LS is on Hub.
 258   5                                              SL811Write(EP0Control,cmd);                     // Enable USB transfer and re-arm
 259   5                                      }                               
 260   4      
 261   4                                      //------------------------------------------------
 262   4                                      // Copy last IN token data pkt from prev transfer
 263   4                                      // Check if there was data available during the
 264   4                                      // last data transfer
 265   4                                      //------------------------------------------------
 266   4                                      if(bufLen)                                                                              
 267   4                                      {       
 268   5                                              SL811BufRead(((dataX&1)?data0:data1), usbstack.buffer, bufLen);
 269   5                                              usbstack.buffer += bufLen;                                                              
 270   5                                      }
 271   4      
 272   4                                      //------------------------------------------------
 273   4                                      // Terminate on short packets, i.e. remainder!=0
 274   4                                      // a short packet or empty data packet OR when 
 275   4                                      // requested data len have completed, i.e.wLen=0
 276   4                                      // For a LOWSPEED device, the 1st device descp,
 277   4                                      // wPayload is default to 64-byte, LS device will
 278   4                                      // only send back a max of 8-byte device descp,
 279   4                                      // and host detect this as a short packet, and 
 280   4                                      // terminate with OUT status stage
 281   4                                      //------------------------------------------------
 282   4                                      if(remainder || !usbstack.wLen)
 283   4                                              break;
 284   4                              }// PID IN                                                      
 285   3                      }
 286   2                              
 287   2                      //-------------------------NAK----------------------------
 288   2                      if (result & EP0_NAK)                                                                   // NAK Detected
 289   2                      {                                                                                                               
 290   3                              if(usbstack.endpoint==0)                                                                                // on ep0 during enumeration of LS device
 291   3                              {                                                                                                       // happen when slave is not fast enough,
 292   4                                      SL811Write(IntStatus,INT_CLEAR);                                // clear interrupt status, need to
 293   4                                      SL811Write(EP0Control,cmd);                                             // re-arm and request for last cmd, IN token
 294   4                                      result = 0;                                     // respond to NAK status only
 295   4                              }
 296   3                              else                                                                                            // normal data endpoint, exit now !!! , non-zero ep
 297   3                                      break;                                                                                  // main loop control the interval polling
 298   3                      }
 299   2              
 300   2                      //-----------------------TIMEOUT--------------------------
 301   2                      if (result & EP0_TIMEOUT)                                                               // TIMEOUT Detected
 302   2                      {                                                                                                               
C51 COMPILER V7.00  SL811                                                                  09/22/2005 17:57:50 PAGE 6   

 303   3                              if(usbstack.endpoint==0)                                                                                // happens when hub enumeration
 304   3                              {
 305   4                                      if(++timeout >= TIMEOUT_RETRY)
 306   4                                      {       
 307   5                                          timeout--;
 308   5                                              break;                                                                          // exit on the timeout detected 
 309   5                                      }
 310   4                                      SL811Write(IntStatus,INT_CLEAR);                                // clear interrupt status, need to
 311   4                                      SL811Write(EP0Control,cmd);                                             // re-arm and request for last cmd again
 312   4                              }
 313   3                              else                                                                                            
 314   3                              {                                                                                                       // all other data endpoint, data transfer 
 315   4                                      bXXGFlags.bits.TIMEOUT_ERR = TRUE;                                                              // failed, set flag to terminate transfer
 316   4                                      break;                                                                                  // happens when data transfer on a device
 317   4                              }                                                                                                       // through the hub
 318   3                      }
 319   2      
 320   2                      //-----------------------STALL----------------------------
 321   2                      if (result & EP0_STALL)                                                                 // STALL detected
 322   2                              return TRUE;                                                                            // for unsupported request.
 323   2                                                                                                                                                      
 324   2                      //----------------------OVEFLOW---------------------------
 325   2                      if (result & EP0_OVERFLOW)                                                      // OVERFLOW detected
 326   2                              //result=result;
 327   2                              break;
 328   2                      //-----------------------ERROR----------------------------
 329   2                      if (result & EP0_ERROR)                                                                 // ERROR detected
 330   2                              //result=result;
 331   2                              break;
 332   2              }       // end of While(1)
 333   1         
 334   1              if (result & EP0_ACK)   // on ACK transmission
 335   1                      return TRUE;            // return OK
 336   1      
 337   1              return FALSE;                   // fail transmission
 338   1      
 339   1      }
 340          //*****************************************************************************************
 341          // Control Endpoint 0's USB Data Xfer
 342          // ep0Xfer, endpoint 0 data transfer
 343          //*****************************************************************************************
 344          unsigned char ep0Xfer(void)
 345          {
 346   1              //unsigned char wLen;
 347   1              
 348   1              //wLen=usbstack.wLen;
 349   1              usbstack.endpoint=0;
 350   1              //----------------------------------------------------
 351   1              // SETUP token with 8-byte request on endpoint 0
 352   1              //----------------------------------------------------
 353   1              usbstack.pid=PID_SETUP;
 354   1              usbstack.wLen=8;
 355   1              //usbstack.buffer=&usbstack.setup;
 356   1              if (!usbXfer()) 
 357   1                      return FALSE;
 358   1              //DelayMs(10);
 359   1              usbstack.pid  = PID_IN;
 360   1              //----------------------------------------------------
 361   1              // IN or OUT data stage on endpoint 0   
 362   1              //----------------------------------------------------
 363   1              usbstack.wLen=usbstack.setup.wLength;
 364   1              if (usbstack.wLen)                                                                                      // if there are data for transfer
C51 COMPILER V7.00  SL811                                                                  09/22/2005 17:57:50 PAGE 7   

 365   1              {
 366   2                      if (usbstack.setup.bmRequest & 0x80)            // host-to-device : IN token
 367   2                      {
 368   3                              usbstack.pid  = PID_IN; 
 369   3                              
 370   3                              if(!usbXfer())
 371   3                                      return FALSE;
 372   3                              //usbstack.wPayload = 0;
 373   3                              usbstack.pid  = PID_OUT;
 374   3                      }
 375   2                      else                                                                                    // device-to-host : OUT token
 376   2                      {                                                       
 377   3                              usbstack.pid  = PID_OUT;
 378   3                                      
 379   3                              if(!usbXfer())
 380   3                                      return FALSE;

⌨️ 快捷键说明

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