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

📄 mainloop.lst

📁 usb开发资料,外围设备实现
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.12  MAINLOOP                                                               10/08/2003 08:56:04 PAGE 5   

 242   1      	else {
 243   1      		bEPPflags.value = 0;
 244   1      		reconnect_USB();//重新连接USB
 245   1      	}
 246   1      */
 247   1      	/* Main program loop */
 248   1      
 249   1      	while( TRUE ){
 250   2      
 251   2      			showarray();
 252   2      			rownum++;
 253   2      			rownum=rownum%16;
 254   2      
 255   2      		
 256   2      		if (bEPPflags.bits.timer){
 257   3      			DISABLE;//定时器溢出,检测按键状态
 258   3      			bEPPflags.bits.timer = 0;
 259   3      			ENABLE;
 260   3      			if(bEPPflags.bits.configuration)//设备未配置返回
 261   3      				check_key_LED();
 262   3      		}
 263   2      
 264   2      		if (bEPPflags.bits.bus_reset) {//设备复位处理
 265   3      			DISABLE;
 266   3      			bEPPflags.bits.bus_reset = 0;
 267   3      			ENABLE;
 268   3      			// Release D12's SUSPEND pin after bus reset
 269   3      			// Enable 74HCT123 pulse generation before disconnect
 270   3      			D12SUSPD = 1;
 271   3      		} // if bus reset
 272   2      
 273   2      		if (bEPPflags.bits.suspend) {//挂起改变处理
 274   3      			DISABLE;
 275   3      			bEPPflags.bits.suspend= 0;
 276   3      			ENABLE;
 277   3      
 278   3      		/*	if(D12SUSPD == 1) {//挂起处理
 279   3      				D12SUSPD = 0;
 280   3      				P0 = 0xFF;
 281   3      				P1 = 0xFF;
 282   3      				P2 = 0xFF;
 283   3      				P3 = 0xFF;
 284   3      				D12_SetDMA(0xC3);
 285   3      				D12SUSPD = 1;
 286   3      				PCON |= 0x02;
 287   3      			//	while (1);
 288   3      			}
 289   3      			*/
 290   3      		} // if suspend change
 291   2      	
 292   2      		if (bEPPflags.bits.setup_packet){//Setup包处理
 293   3      			DISABLE;
 294   3      			bEPPflags.bits.setup_packet = 0;
 295   3      			ENABLE;
 296   3      			control_handler();//调用请求处理子程序
 297   3      			D12SUSPD = 1;
 298   3      		} // if setup_packet
 299   2      
 300   2      		if(bEPPflags.bits.setup_dma != 0) {//DMA状态改变处理
 301   3      			DISABLE;
 302   3      			bEPPflags.bits.setup_dma --;
 303   3      			ENABLE;
C51 COMPILER V6.12  MAINLOOP                                                               10/08/2003 08:56:04 PAGE 6   

 304   3      			setup_dma();
 305   3      		} // if setup_dma
 306   2      
 307   2      	} // Main Loop
 308   1      }
*** WARNING C280 IN LINE 214 OF .\MAINLOOP.C: 'key': unreferenced local variable
*** WARNING C280 IN LINE 214 OF .\MAINLOOP.C: 'i': unreferenced local variable
 309          
 310          //返回stall应答
 311          void stall_ep0(void)
 312          {
 313   1      	D12_SetEndpointStatus(0, 1);
 314   1      	D12_SetEndpointStatus(1, 1);
 315   1      }
 316          
 317          //断开USB总线
 318          void disconnect_USB(void)
 319          {
 320   1      	// Initialize D12 configuration
 321   1      	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
 322   1      }
 323          
 324          //连接USB总线
 325          void connect_USB(void)
 326          {
 327   1      	// reset event flags
 328   1      	DISABLE;
 329   1      	bEPPflags.value = 0;//清除所有状态
 330   1      	ENABLE;
 331   1      
 332   1      	// V2.1 enable normal+sof interrupt
 333   1      	D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
 334   1      
 335   1      	// Initialize D12 configuration
 336   1      	D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
 337   1      }
 338          
 339          //重新连接到USB总线
 340          void reconnect_USB(void)
 341          {
 342   1      	unsigned long clk_cnt;
 343   1      
 344   1      
 345   1      	// Pull-down D12's SUSPEND pin
 346   1      	// Disable 74HCT123 pulse generation before disconnect
 347   1      	// Release D12's SUSPEND pin after receiving bus reset from host
 348   1      	D12SUSPD = 0;
 349   1      	disconnect_USB();
 350   1      
 351   1      	printf("Wait for 1 second ...\n");
 352   1      
 353   1      	clk_cnt = ClockTicks;
 354   1      	while(ClockTicks < clk_cnt + 20)
 355   1      		;
 356   1      
 357   1      	connect_USB();
 358   1      
 359   1      }
 360          
 361          //恢复到未配置状态
 362          void init_unconfig(void)
 363          {
C51 COMPILER V6.12  MAINLOOP                                                               10/08/2003 08:56:04 PAGE 7   

 364   1      //	unsigned char i;
 365   1      
 366   1      	D12_SetEndpointEnable(0);	/* Disable all endpoints but EPP0. */
 367   1      }
 368          
 369          //设置配置状态
 370          void init_config(void)
 371          {
 372   1      	D12_SetEndpointEnable(1);	/* Enable  generic/iso endpoints. */
 373   1      }
 374          
 375          //从端点号1发送数据
 376          void single_transmit(unsigned char * buf, unsigned char len)
 377          {
 378   1      	if( len <= EP0_PACKET_SIZE) {
 379   2      		D12_WriteEndpoint(1, len, buf);
 380   2      	}
 381   1      }
 382          
 383          //发送端点号1建立代码
 384          void code_transmit(unsigned char code * pRomData, unsigned short len)
 385          {
 386   1      	ControlData.wCount = 0;
 387   1      	if(ControlData.wLength > len)
 388   1      		ControlData.wLength = len;
 389   1      
 390   1      	ControlData.pData = pRomData;
 391   1      	if( ControlData.wLength >= EP0_PACKET_SIZE) {
 392   2      		D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
 393   2      		ControlData.wCount += EP0_PACKET_SIZE;
 394   2      		DISABLE;
 395   2      		bEPPflags.bits.control_state = USB_TRANSMIT;
 396   2      		ENABLE;
 397   2      	}
 398   1      	else {
 399   2      		D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
 400   2      		ControlData.wCount += ControlData.wLength;
 401   2      		DISABLE;
 402   2      		bEPPflags.bits.control_state = USB_IDLE;
 403   2      		ENABLE;
 404   2      	}
 405   1      }
 406          
 407          //LED和按键处理子程序
 408          void check_key_LED(void)
 409          {
 410   1      /*	static unsigned char c, last_key = 0xf;
 411   1      
 412   1      	c = MCU_SWM0 & MCU_SWM1;
 413   1      	c &= 0x0f;
 414   1      	if (c != last_key) {
 415   1      		D12_WriteEndpoint(3, 1, &c);//发送按键状态
 416   1      	}
 417   1      
 418   1      	last_key = c;
 419   1      
 420   1      	if(bEPPflags.bits.ep1_rxdone) {
 421   1      		DISABLE;
 422   1      		bEPPflags.bits.ep1_rxdone = 0;
 423   1      		ENABLE;
 424   1      		MCU_LED0 = !(GenEpBuf[3] & 0x1);//改变LED状态
 425   1      		MCU_LED1 = !(GenEpBuf[3] & 0x2);
C51 COMPILER V6.12  MAINLOOP                                                               10/08/2003 08:56:04 PAGE 8   

 426   1      	}
 427   1      */
 428   1      }
 429          
 430          //DMA建立子程序
 431          void setup_dma()
 432          {
 433   1      	ioSize = ioRequest.uSize;
 434   1      	ioCount = 0;
 435   1      
 436   1      	DISABLE;
 437   1      	bEPPflags.bits.dma_state = DMA_RUNNING;
 438   1      	ENABLE;
 439   1      
 440   1      	single_transmit(0, 0);
 441   1      
 442   1      	if(ioRequest.bCommand & 0x1) {
 443   2      		if(ioSize > 64 || ioSize == 0) {
 444   3      			//传输大于64字节数据
 445   3      			D12_WriteEndpoint(5, 64, EpBuf);
 446   3      			ioCount += 64;
 447   3      		}
 448   2      		else {
 449   3      			//传输64字节数据
 450   3      			D12_WriteEndpoint(5, ioSize, EpBuf);
 451   3      			ioCount += ioSize;
 452   3      		}
 453   2      	}
 454   1      }
 455          
 456          //请求处理子程序
 457          void control_handler()
 458          {
 459   1      	unsigned char type, req;
 460   1      
 461   1      	type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
 462   1      	req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
 463   1      
 464   1      	help_devreq(type, req); //显示设备请求
 465   1      
 466   1      	if (type == USB_STANDARD_REQUEST)
 467   1      		(*StandardDeviceRequest[req])();//调用标准请求
 468   1      	else if (type == USB_VENDOR_REQUEST)
 469   1      		(*VendorDeviceRequest[req])();//调用厂商请求
 470   1      	else
 471   1      		stall_ep0();
 472   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    822    ----
   CONSTANT SIZE    =    494    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     24      18
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  2 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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