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

📄 sl811.lst

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

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

 365   2      		else											// device-to-host : OUT token
 366   2         		{							
 367   3      			usbstack.pid  = PID_OUT;
 368   3      				
 369   3      			if(!usbXfer())
 370   3      				return FALSE;
 371   3      			usbstack.pid  = PID_IN;
 372   3      		}
 373   2      	}
 374   1      	//DelayMs(10);
 375   1      	//----------------------------------------------------
 376   1      	// Status stage IN or OUT zero-length data packet
 377   1      	//----------------------------------------------------
 378   1      	usbstack.wLen=0;
 379   1      	if(!usbXfer())
 380   1      		return FALSE;
 381   1      
 382   1      	return TRUE;											
 383   1      					
 384   1      }
 385          
 386          
 387          unsigned char epBulkSend(unsigned char *pBuffer,unsigned int len)
 388          {
 389   1      	usbstack.usbaddr=0x1;
 390   1      	usbstack.endpoint=usbstack.epbulkout;
 391   1      	usbstack.pid=PID_OUT;
 392   1      	usbstack.wPayload=64;
 393   1      	usbstack.wLen=len;
 394   1      	usbstack.buffer=pBuffer;
 395   1      	/*
 396   1      	while(len>0)
 397   1      	{
 398   1      		if (len > usbstack.wPayload)
 399   1      			usbstack.wLen = usbstack.wPayload;
 400   1      		else				
 401   1      			usbstack.wLen = len;	
 402   1      		while(!usbXfer());
 403   1      			//DelayMs(10);
 404   1      			//return FALSE;
 405   1      		len-=usbstack.wLen;
 406   1      		usbstack.buffer=usbstack.buffer+usbstack.wLen;
 407   1      		//DelayUs(10);
 408   1      	}
 409   1      	*/
 410   1      	if(usbstack.wLen)
 411   1      	{
 412   2      	      while(!usbXfer());
 413   2      	}
 414   1      	return TRUE;	
 415   1      }
 416          
 417          unsigned char epBulkRcv(unsigned char *pBuffer,unsigned int len)
 418          {
 419   1      	usbstack.usbaddr=0x1;
 420   1      	usbstack.endpoint=usbstack.epbulkin;
 421   1      	usbstack.pid=PID_IN;
 422   1      	usbstack.wPayload=64;
 423   1      	usbstack.wLen=len;
 424   1      	usbstack.buffer=pBuffer;
 425   1      	if(usbstack.wLen)
 426   1      	{
C51 COMPILER V6.20c  SL811                                                                 10/09/2005 10:50:56 PAGE 8   

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

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

⌨️ 快捷键说明

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