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

📄 sl811.lst

📁 单片机读写u盘的完整程序,代码全部用c语言编写。非常有价值的程序。这是本人花2500元购买的开发板源吗
💻 LST
📖 第 1 页 / 共 4 页
字号:
 182   4                                      //dataX++;
 183   4                                      
 184   4                                      if(!usbstack.wLen)
 185   4                                              break;
 186   4                                      ////////////////////////////////////
 187   4                                      if (usbstack.wLen >= usbstack.wPayload)                 // select proper data payload
 188   4                                              xferLen = usbstack.wPayload;                    // limit to wPayload size 
 189   4                                      else                                                    // else take < payload len
 190   4                                              xferLen = usbstack.wLen;        
 191   4                                      
 192   4                                      ////////////////////////////////////
 193   4                                      //if(bufLen)                                                                            
 194   4                                      {       
 195   5                                              //addr    = (dataX & 1) ? data1:data0; 
 196   5                                              addr=data0;
 197   5                                              
 198   5                                              SL811BufWrite(addr,usbstack.buffer,xferLen);
 199   5                                              
 200   5                                              cmd = sDATA0_WR;
 201   5                                              bXXGFlags.bits.bData1 = uDev.bData1[usbstack.endpoint];
 202   5                                              uDev.bData1[usbstack.endpoint] = (uDev.bData1[usbstack.endpoint] ? 0 : 1); // DataToggle
 203   5                      
 204   5                                              if(bXXGFlags.bits.bData1)
 205   5                                                      cmd |= 0x40;    
 206   5                                                                      // always sync SOF when FS, regardless 
 207   5                                              SL811Write(EP0XferLen, xferLen);                // select next xfer length
 208   5                                              SL811Write(EP0Address, addr);                   // data buffer addr 
 209   5                                              SL811Write(IntStatus,INT_CLEAR);                // is a LS is on Hub.
 210   5                                              SL811Write(EP0Control,cmd);                     // Enable USB transfer and re-arm
 211   5                                      }       
 212   4                                      
 213   4                              } //PID OUT
 214   3                              // IN TOKEN
 215   3                              else if(usbstack.pid == PID_IN)
 216   3                              {                                                                                                       // for IN token only
 217   4                                      usbstack.wLen  -= (WORD)xferLen;        // update remainding wLen value
 218   4                                      cmd   ^= 0x40;                          // toggle DATA0/DATA1
 219   4                                      dataX++;                                // point to next dataX
 220   4      
 221   4                                      //------------------------------------------------      
 222   4                                      // If host requested for more data than the slave 
 223   4                                      // have, and if the slave's data len is a multiple
 224   4                                      // of its endpoint payload size/last xferLen. Do 
 225   4                                      // not overwrite data in previous buffer.
 226   4                                      //------------------------------------------------      
 227   4                                      if(remainder==xferLen)                  // empty data detected
 228   4                                              bufLen = 0;                     // do not overwriten previous data
 229   4                                      else                                    // reset bufLen to zero
 230   4                                              bufLen = xferLen;               // update previous buffer length
 231   4                                      
 232   4                                      //------------------------------------------------      
 233   4                                      // Arm for next data transfer when requested data 
 234   4                                      // length have not reach zero, i.e. wLen!=0, and
 235   4                                      // last xferlen of data was completed, i.e.
 236   4                                      // remainder is equal to zero, not a short pkt
 237   4                                      //------------------------------------------------      
 238   4                                      if(!remainder && usbstack.wLen)                                                 // remainder==0 when last xferLen
 239   4                                      {                                                                                               // was all completed or wLen!=0
 240   5                                              addr    = (dataX & 1) ? data1:data0;            // select next address for data
 241   5                                              xferLen = (BYTE)(usbstack.wLen>=usbstack.wPayload) ? usbstack.wPayload:usbstack.wLen;   // get data len
C51 COMPILER V6.21  SL811                                                                  06/13/2005 16:14:57 PAGE 5   

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

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

 365   2                      {                                                       
 366   3                              usbstack.pid  = PID_OUT;
 367   3                                      
 368   3                              if(!usbXfer())
 369   3                                      return FALSE;
 370   3                              usbstack.pid  = PID_IN;

⌨️ 快捷键说明

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