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

📄 usbmouse.lst

📁 STC89C52单片机平台上实现用外线通讯并能与PC实现USB的通讯
💻 LST
📖 第 1 页 / 共 4 页
字号:
 309          /****************************读端点最后状态**********************************/
 310          uint8  read_last_status(uint8 endp)
 311          {
 312   1       write_usb_command(Read_Last_Status+endp);
 313   1       return read_a_usb_data();
 314   1      }
 315          /******************************************************************************/
 316          
 317          /****************************设置端点状态**************************************/
 318          void set_endpoint_status(uint8 endp,uint8 status)  
 319          {
 320   1       write_usb_command(0x40+endp);
 321   1       write_a_usb_data(!status);
 322   1      }
 323          /******************************************************************************/
 324          
 325          /*****************************读端点状态**************************************/
 326          uint8 read_endpoint_status(uint8 endp)
 327          {
 328   1       write_usb_command(0x80+endp);
 329   1       return read_a_usb_data();
 330   1      }
 331          /******************************************************************************/
 332          
 333          /************************清缓冲,在读取缓冲数据后调用**************************/
 334          void clear_buffer(void)
 335          {
 336   1       write_usb_command(Clear_Buffer);
 337   1      }
 338          /******************************************************************************/
 339          
 340          /***********************缓冲区数据有效,在写缓冲后调用**************************/
 341          void validate_buffer(void)
 342          {
 343   1       write_usb_command(Validate_Buffer);
 344   1      }
 345          /******************************************************************************/
 346          
 347          /***************************应答建立包************************************/
 348          void ack_setup(uint8 endp)
 349          {
 350   1       select_endpoint(endp);
 351   1       write_usb_command(Ack_Setup);
 352   1      }
 353          /******************************************************************************/
 354          
 355          /***********************出错处理******************************************/
 356          void error(uint8 number)
 357          {
 358   1       Prints("有错误发生!!!",1);
 359   1       number=0;
 360   1      }
 361          /******************************************************************************/
 362          
 363          /*************************读终端点缓冲****************************************/
 364          uint8 read_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
C51 COMPILER V6.12  USBMOUSE                                                               09/21/2007 12:44:30 PAGE 7   

 365          {
 366   1       uint8 i,j;
 367   1       read_last_status(endp);
 368   1       if(!(select_endpoint(endp))&0x01){error(0); return 0;}
 369   1       read_endpoint_status(endp);
 370   1       write_usb_command(Read_Buffer);
 371   1       read_a_usb_data();
 372   1       j=read_a_usb_data();
 373   1       if(j>len)
 374   1        j=len;
 375   1       for(i=0;i<j;i++)
 376   1        {
 377   2         USB_RD=0;
 378   2         *(buff+i)=USB_DATA;
 379   2         USB_RD=1;
 380   2        }
 381   1       clear_buffer();
 382   1       return j;
 383   1      }
 384          /******************************************************************************/
 385          
 386          /*************************写终端点缓冲*****************************************/
 387          uint8 write_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
 388          {
 389   1       uint8 i;
 390   1       read_last_status(endp);
 391   1       select_endpoint(endp);
 392   1       write_usb_command(Write_Buffer);
 393   1       write_a_usb_data(0);
 394   1       write_a_usb_data(len);
 395   1       for(i=0;i<len;i++)
 396   1        {
 397   2         USB_DATA=*(buff+i);
 398   2         USB_WR=0;
 399   2         USB_WR=1;
 400   2        }
 401   1       USB_DATA=0XFF;
 402   1       validate_buffer();
 403   1       return len;
 404   1      }
 405          /******************************************************************************/
 406          
 407          /***************************断开USB连接****************************************/
 408          void disconnect_usb(void)
 409          {
 410   1       Prints("断开USB连接........................",1);
 411   1       write_usb_command(0xf3);
 412   1       write_a_usb_data(0x0e);
 413   1       write_a_usb_data(0x47);
 414   1       delay(100);
 415   1      }
 416          /******************************************************************************/
 417          
 418          /*******************************连接USB**************************************/
 419          void connect_usb(void)
 420          {
 421   1       Prints("连接USB...............",1);
 422   1       write_usb_command(0xf3);                         //初始化USBD12
 423   1       write_a_usb_data(0x1e);                          //连接USB
 424   1       write_a_usb_data(0x47);                          //设置频率
 425   1      }
 426          /******************************************************************************/
C51 COMPILER V6.12  USBMOUSE                                                               09/21/2007 12:44:30 PAGE 8   

 427          
 428          /***************************初始化USB***************************************************/
 429          void init_usb(void)               
 430          {
 431   1       Prints("USBD12芯片初始化",1);
 432   1       set_usb_addr(0);
 433   1       USB_CS=0;
 434   1       set_endpoint_enable();
 435   1      }
 436          /******************************************************************************/
 437          
 438          /****************************USB总线复位处理***********************************/
 439          void usb_bus_reset(void)
 440          {
 441   1       Prints("USB总线复位................................",1);
 442   1       usb_flags.Register=0;
 443   1       set_endpoint_enable();
 444   1      }
 445          /******************************************************************************/
 446          
 447          /*****************************USB总线挂起处理**********************************/
 448          void usb_bus_suspend(void)
 449          {
 450   1       Prints("USB Suspend................",1);
 451   1      }
 452          /******************************************************************************/
 453          
 454          /***************************设置地址***************************************/
 455          void set_usb_address(void)
 456          {
 457   1      	usb_flags.flags.set_addr=1; 
 458   1      	set_usb_addr(Control_Data.DeviceRequest.wValue); 
 459   1      	while(select_endpoint(1)&0x01);
 460   1      	write_endpoint_buff(1,0,0);
 461   1      	while(select_endpoint(1)&0x01);
 462   1      	usb_flags.flags.usb_endp0_in=0;
 463   1      	usb_flags.flags.setup_packet_out=0;
 464   1      }
 465          /******************************************************************************/
 466          
 467          /**************************获取状态响应*****************************************/
 468          void get_status(uint8 receiver)
 469          {
 470   1       uint8 status[2];
 471   1       switch (receiver)
 472   1        {
 473   2         case 0:                        //获取设备状态
 474   2          status[0]=0x00;
 475   2          status[1]=0x00;
 476   2          break;
 477   2         case 1:                        //获取接口状态
 478   2          status[0]=0x00;
 479   2          status[0]=0x00;
 480   2          break;
 481   2         case 2:                        //获取端点状态
 482   2          status[0]=0x00;
 483   2          status[1]=0x00;
 484   2          break;
 485   2         }
 486   1        write_endpoint_buff(1,2,status);
 487   1        usb_flags.flags.usb_endp0_in=0;
 488   1      }
C51 COMPILER V6.12  USBMOUSE                                                               09/21/2007 12:44:30 PAGE 9   

 489          /******************************************************************************/
 490          
 491          /*********************清除特性*******************************************/
 492          void clear_feature(uint8 receiver)    
 493          {
 494   1       Prints("    清除特性................................",1);
 495   1       receiver=0;
 496   1       write_endpoint_buff(1,0,0);
 497   1       usb_flags.flags.usb_endp0_in=0;
 498   1       usb_flags.flags.setup_packet_out=0;
 499   1      }
 500          /******************************************************************************/
 501          
 502          /*******************设置特性**************************************************/
 503          void set_feature(uint8 receiver)
 504          {
 505   1       Prints("    设置特性................................",1);
 506   1       receiver=0;
 507   1       write_endpoint_buff(1,0,0);
 508   1       usb_flags.flags.usb_endp0_in=0;
 509   1       usb_flags.flags.setup_packet_out=0;
 510   1      }
 511          /******************************************************************************/
 512          
 513          /*****************************设置描述*****************************************/
 514          void set_descriptor(void)
 515          {
 516   1       Prints("    设置描述符................................",1);
 517   1       usb_flags.flags.usb_endp0_in=0;
 518   1       usb_flags.flags.setup_packet_out=0;
 519   1      }
 520          /******************************************************************************/
 521          
 522          /***************************设置配置*******************************************/
 523          void set_configuration(void)
 524          {
 525   1       Prints("    设置配置................................",1);
 526   1       write_endpoint_buff(1,0,0);
 527   1       usb_flags.flags.usb_endp0_in=0;
 528   1       usb_flags.flags.setup_packet_out=0;
 529   1      }
 530          /******************************************************************************/
 531          
 532          /************************获取配置状态******************************************/
 533          void get_configuration(void)
 534          { 
 535   1       uint8 value=0x01;
 536   1       Prints("    获取配置................................",1);
 537   1       write_endpoint_buff(1,1,&value);
 538   1       usb_flags.flags.usb_endp0_in=0;
 539   1      }
 540          /******************************************************************************/
 541          
 542          /****************************设置接口************************************/
 543          void set_interface(void)
 544          {
 545   1       Prints("    设置接口................................",1);
 546   1       write_endpoint_buff(1,0,0);
 547   1       usb_flags.flags.usb_endp0_in=0;
 548   1       usb_flags.flags.setup_packet_out=0;
 549   1      }
 550          /******************************************************************************/
C51 COMPILER V6.12  USBMOUSE                                                               09/21/2007 12:44:30 PAGE 10  

 551          
 552          /***************************获取接口状态***************************************/
 553          void get_interface(void)
 554          {
 555   1       uint8 value=0x01;
 556   1       Prints("    获取接口................................",1);
 557   1       write_endpoint_buff(1,1,&value);
 558   1       usb_flags.flags.usb_endp0_in=0;
 559   1      }
 560          /******************************************************************************/
 561          
 562          /***********************获取描述符*********************************************/
 563          void get_descriptor(void)
 564          {
 565   1       Prints("    获取描述符................................",1);
 566   1        if(!usb_flags.flags.not_end)
 567   1           {
 568   2            switch(MSB(Control_Data.DeviceRequest.wValue))
 569   2      	   {
 570   3              case DEVICE_DESCRIPTOR:
 571   3      		     Prints("        获取设备描述符................................",1);
 572   3      	         Control_Data.wCount=sizeof(DEVICE_DESCRIPTOR_STRUCT);
 573   3       	         Control_Data.pData=(uint8 *)(&device_descriptor);
 574   3                   break;
 575   3              case CONFIGURATION_DESCRIPTOR:
 576   3      			 Prints("        GET CONFIig................................",1);
 577   3                   Control_Data.wCount=SWAP16(con_int_endp_descriptor.configuration_descriptor.wTotalLength);
 578   3      			 Control_Data.pData=(uint8 *)(&con_int_endp_descriptor);
 579   3                   if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
 580   3                   break;
 581   3      		case STRING_DESCRIPTOR:
 582   3      		     Prints("        获取字符串描述符................................",1);
 583   3      			 switch(LSB(Control_Data.DeviceRequest.wValue))
 584   3      			  {
 585   4      			   case 0:
 586   4      			    Prints("            获取语言ID................................",1);
 587   4      			    Control_Data.wCount=LANGUAGE_ID[0];
 588   4                      Control_Data.pData=LANGUAGE_ID;
 589   4         			    break;
 590   4      
 591   4      			   case 1:
 592   4      			    Prints("            获取厂商字符串................................",1);
 593   4      			    Control_Data.wCount=ManufacturerString[0];
 594   4                      Control_Data.pData=ManufacturerString;
 595   4      			    break;
 596   4      
 597   4      			   case 2:
 598   4      			    Prints("            获取产品字符串................................",1);
 599   4      			    Control_Data.wCount=ProducterString[0];
 600   4                      Control_Data.pData=ProducterString;
 601   4      			    break;
 602   4      
 603   4      			   case 3:
 604   4                       Prints("            获取设备序列号................................",1);
 605   4      			     Control_Data.wCount=device_serial_number[0];
 606   4      			     Control_Data.pData=device_serial_number;
 607   4      			   break;
 608   4      
 609   4      			   default: break;
 610   4      			  }
 611   3      			 break;
 612   3      		 default:
C51 COMPILER V6.12  USBMOUSE                                                               09/21/2007 12:44:30 PAGE 11  

 613   3      		     Prints("       获取其它描述符..................描述符索引为:",0);
 614   3      			 PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
 615   3      			 Prints("",1); 
 616   3      		  break;
 617   3      	   	}
 618   2            if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
 619   2      	 }
 620   1      	//写数据到D12输入端点
 621   1          if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
 622   1           {
 623   2      	  write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
 624   2      	  Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
 625   2            Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
 626   2      	  if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;

⌨️ 快捷键说明

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