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

📄 sl811.lst

📁 ms51 控制sl811读写u盘的源程序 及 原理图 可仿真试一下
💻 LST
📖 第 1 页 / 共 3 页
字号:
 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.20c  SL811                                                                 08/21/2003 22:51:04 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.20c  SL811                                                                 08/21/2003 22:51:04 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;
 371   3      		}
 372   2      	}
 373   1      	//DelayMs(10);
 374   1      	//----------------------------------------------------
 375   1      	// Status stage IN or OUT zero-length data packet
 376   1      	//----------------------------------------------------
 377   1      	usbstack.wLen=0;
 378   1      	if(!usbXfer())
 379   1      		return FALSE;
 380   1      
 381   1      	return TRUE;											
 382   1      					
 383   1      }
 384          
 385          
 386          unsigned char epBulkSend(unsigned char *pBuffer,unsigned int len)
 387          {
 388   1      	usbstack.usbaddr=0x1;
 389   1      	usbstack.endpoint=usbstack.epbulkout;
 390   1      	usbstack.pid=PID_OUT;
 391   1      	usbstack.wPayload=64;
 392   1      	usbstack.wLen=len;
 393   1      	usbstack.buffer=pBuffer;
 394   1      	/*
 395   1      	while(len>0)
 396   1      	{
 397   1      		if (len > usbstack.wPayload)
 398   1      			usbstack.wLen = usbstack.wPayload;
 399   1      		else				
 400   1      			usbstack.wLen = len;	
 401   1      		while(!usbXfer());
 402   1      			//DelayMs(10);
 403   1      			//return FALSE;
 404   1      		len-=usbstack.wLen;
 405   1      		usbstack.buffer=usbstack.buffer+usbstack.wLen;
 406   1      		//DelayUs(10);
 407   1      	}
 408   1      	*/
 409   1      	if(usbstack.wLen)
 410   1      	{
 411   2      	      while(!usbXfer());
 412   2      	}
 413   1      	return TRUE;	
 414   1      }
 415          
 416          unsigned char epBulkRcv(unsigned char *pBuffer,unsigned int len)
 417          {
 418   1      	usbstack.usbaddr=0x1;
 419   1      	usbstack.endpoint=usbstack.epbulkin;
 420   1      	usbstack.pid=PID_IN;
 421   1      	usbstack.wPayload=64;
 422   1      	usbstack.wLen=len;
 423   1      	usbstack.buffer=pBuffer;
 424   1      	if(usbstack.wLen)
 425   1      	{
 426   2      		while(!usbXfer());
C51 COMPILER V6.20c  SL811                                                                 08/21/2003 22:51:04 PAGE 8   

 427   2      			//return FALSE;
 428   2      	}
 429   1      	return TRUE;
 430   1      }
 431          //*****************************************************************************************
 432          // Control endpoint
 433          //*****************************************************************************************
 434          //void VendorCmd(void)
 435          //{ 
 436          //      ep0Xfer();
 437          //}
 438          
 439          //*****************************************************************************************
 440          // Set Device Address : 
 441          //*****************************************************************************************
 442          unsigned char SetAddress(unsigned char addr)
 443          {
 444   1      	usbstack.usbaddr=0;
 445   1      	usbstack.setup.bmRequest=0;
 446   1      	usbstack.setup.bRequest=SET_ADDRESS;
 447   1      	usbstack.setup.wValue=addr;
 448   1      	usbstack.setup.wIndex=0;
 449   1      	usbstack.setup.wLength=0;
 450   1      	//usbstack.buffer=&usbstack.setup;
 451   1      	return ep0Xfer();
 452   1      
 453   1      }
 454          
 455          //*****************************************************************************************
 456          // Set Device Configuration : 
 457          //*****************************************************************************************
 458          unsigned char Set_Configuration(void)
 459          {
 460   1      	//usbstack.usbaddr=usbaddr;
 461   1      	//usbstack.
 462   1      	usbstack.setup.bmRequest=0;
 463   1      	usbstack.setup.bRequest=SET_CONFIG;
 464   1      	//usbstack.setup.wValue=wVal;
 465   1      	usbstack.setup.wIndex=0;
 466   1      	usbstack.setup.wLength=0;
 467   1      	usbstack.buffer=NULL;
 468   1      	return ep0Xfer();
 469   1      
 470   1      }
 471          
 472          //*****************************************************************************************
 473          // Get Device Descriptor : Device, Configuration, String
 474          //*****************************************************************************************
 475          unsigned char GetDesc(void)
 476          { 
 477   1      	
 478   1      	usbstack.setup.bmRequest=0x80;
 479   1      	usbstack.setup.bRequest=GET_DESCRIPTOR;
 480   1      	usbstack.setup.wValue=WordSwap(usbstack.setup.wValue);
 481   1      	
 482   1      	usbstack.wPayload=uDev.wPayLoad[0];
 483   1      	//usbstack.buffer=&usbstack.setup;
 484   1      	return ep0Xfer();
 485   1      }
 486          
 487          //*****************************************************************************************
 488          // USB Data Endpoint Read/Write
C51 COMPILER V6.20c  SL811                                                                 08/21/2003 22:51:04 PAGE 9   

 489          // wLen is in low byte first format
 490          //*****************************************************************************************
 491          /*
 492          unsigned char DataRW(BYTE epaddr)
 493          {
 494          	//xdata BYTE pid = PID_OUT;
 495          
 496          	usbstack.pid=PID_OUT;
 497          	usbstack.endpoint=epaddr&0x0F;
 498          	

⌨️ 快捷键说明

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