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

📄 chap_9.lst

📁 该代码是基于菲利普ISP1581USB接口芯片与STC89C51单片机的USB2.0开发代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
 649   5                                              }
 650   4                                              Descriptor_Ptr = &Bulk_Out_Descriptor[0]; //set pointer to interface descriptor
 651   4                                              count = *Descriptor_Ptr;        //read in descriptor length
 652   4                                              while(count != 0)
 653   4                                              {
 654   5                                                      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 655   5                                                      count--;
 656   5                                                      Descriptor_Ptr++;
 657   5                                              }
 658   4                                      }                                       
 659   3                                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;      //validate FIFO
 660   3                                      wait_ep0tx();
 661   3                                      ep0out_ack();
 662   3                              }
 663   2                              break;
 664   2                              
 665   2                      case  8:  
 666   2                              break;
 667   2                              
 668   2                      default  :
 669   2                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 670   2                              D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
 671   2                              while(!USB_Int_Flag.BITS.EP0SETUP)
 672   2                              {
 673   3                                      //读取ISP1581中断寄存器
 674   3                                      USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
C51 COMPILER V7.50   CHAP_9                                                                10/30/2007 16:17:28 PAGE 12  

 675   3                                      //回写ISP1581中断寄存器
 676   3                                      D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
 677   3                                      if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
 678   3                                              return;
 679   3                              }
 680   2                              USB_Int_Flag.BITS.EP0TX = 0;
 681   2                              break;
 682   2              }
 683   1      }
 684          
 685          
 686          //Set_Address设置地址
 687          void set_address(void)
 688          {
 689   1              USB_Int_Flag.BITS.EP0RX = 0;
 690   1              D14_Cntrl_Reg.D14_ADDRESS.BITS.DEVADDR = (USB_Device_Request.wValue >> 8);//设置地址
 691   1              //状态响应
 692   1              ep0in_ack();
 693   1      }
 694          
 695          
 696          
 697          //Set_Config设置配置
 698          void set_config(void)
 699          {
 700   1              USB_Int_Flag.BITS.EP0RX = 0;
 701   1              
 702   1              if(USB_Device_Request.wValue == 0)
 703   1              {
 704   2                      Device_Config_Value = 0;
 705   2                      ep0in_ack();
 706   2              }
 707   1              else if (USB_Device_Request.wValue ==  0x0100)
 708   1          {
 709   2                      //配置设备
 710   2                      Device_Config_Value = (UC) (USB_Device_Request.wValue >> 8);
 711   2                      ep0in_ack();
 712   2              }
 713   1              else
 714   1              {
 715   2                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 716   2                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
 717   2                      while(!USB_Int_Flag.BITS.EP0SETUP)
 718   2                      {
 719   3                              //读取ISP1581中断寄存器
 720   3                              USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
 721   3                              //回写ISP1581中断寄存器
 722   3                              D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
 723   3                              if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
 724   3                                      return;
 725   3                      }
 726   2                      USB_Int_Flag.BITS.EP0TX = 0;
 727   2              }
 728   1      }
 729          
 730          
 731          //Get_Config获取配置
 732          void get_config(void)
 733          {
 734   1              D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 735   1              D14_Cntrl_Reg.D14_DATA_PORT_LSB = Device_Config_Value;
 736   1              D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.VENDP = 1;
C51 COMPILER V7.50   CHAP_9                                                                10/30/2007 16:17:28 PAGE 13  

 737   1              wait_ep0tx();
 738   1              ep0out_ack();
 739   1      }
 740          
 741          
 742          
 743          //Clear_Feature特性清除
 744          void clear_feature(void)
 745          {
 746   1              unsigned char bRecipient = USB_Device_Request.bmRequestType & 0x0f;
 747   1              //端点
 748   1              if(bRecipient == 0x02 &&USB_Device_Request.wValue == 0x0000)
 749   1              {
 750   2                      switch(USB_Device_Request.wIndex)
 751   2                      {
 752   3                      case  0x8000   :
 753   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 754   3                              break;
 755   3                      case  0x0000   :
 756   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
 757   3                              break;
 758   3                      case  0x8100   :
 759   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;
 760   3                              break;
 761   3                      case  0x0100   :
 762   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
 763   3                              break;
 764   3                      case  0x8200   :
 765   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
 766   3                              break;
 767   3                      case  0x0200   :
 768   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
 769   3                              break;
 770   3                      case  0x8300   :
 771   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;
 772   3                              break;
 773   3                      case  0x0300   :
 774   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;
 775   3                              break;
 776   3                      case  0x8400   :
 777   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 9;
 778   3                              break;
 779   3                      case  0x0400   :
 780   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 8;
 781   3                              break;
 782   3                      case  0x8500   :
 783   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 11;
 784   3                              break;
 785   3                      case  0x0500   :
 786   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 10;
 787   3                              break;
 788   3                      case  0x8600   :
 789   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 13;
 790   3                              break;
 791   3                      case  0x0600   :
 792   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 12;
 793   3                              break;
 794   3                      case  0x8700   :
 795   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 15;
 796   3                              break;
 797   3                      case  0x0700   :
 798   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 14;
C51 COMPILER V7.50   CHAP_9                                                                10/30/2007 16:17:28 PAGE 14  

 799   3                              break;
 800   3                      default        :  
 801   3                              break;
 802   3                      }                                                                                                      
 803   2                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 0;
 804   2                      Kernel_Flag.BITS.Endpt_Stall = 0;
 805   2                      D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = OFF;                 //disable FIFO
 806   2                      D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = ON;                  //disable FIFO
 807   2                      ep0in_ack();
 808   2                      USB_Device.BITS.Halt = 0;
 809   2              }                                                                                       
 810   1              else if(bRecipient == 0x00 && USB_Device_Request.wValue == 0x0100)
 811   1              {       //远程唤醒
 812   2                      USB_Device.BITS.Remote_Wakeup = 0;
 813   2                      ep0in_ack();
 814   2              }
 815   1              else
 816   1              {
 817   2                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 818   2                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
 819   2                      while(!USB_Int_Flag.BITS.EP0SETUP)
 820   2                      {
 821   3                              //读取ISP1581中断寄存器
 822   3                              USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
 823   3                              //回写ISP1581中断寄存器
 824   3                              D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
 825   3                              if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
 826   3                                      return;
 827   3                      }
 828   2                      USB_Int_Flag.BITS.EP0TX = 0;
 829   2              }
 830   1      }
 831          
 832          
 833          
 834          //Get_Status获取设备状态
 835          void get_status(void)
 836          {
 837   1              if(USB_Device_Request.bmRequestType == 0x80)
 838   1              {
 839   2                      //端点0IN返回0x01,0x00两字节
 840   2                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 841   2                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 2;
 842   2                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
 843   2                      D14_Cntrl_Reg.D14_DATA_PORT_LSB = 1;
 844   2                      D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0;
 845   2                      //等待发送完毕
 846   2                      wait_ep0tx();
 847   2                      ep0out_ack();
 848   2              }
 849   1      
 850   1              if(USB_Device_Request.bmRequestType == 0x81)
 851   1              {
 852   2                      //端点0IN返回0x00,0x00两字节
 853   2                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 854   2                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 2;
 855   2                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
 856   2                      D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0;
 857   2                      D14_Cntrl_Reg.D14_DATA_PORT_MSB = 0;
 858   2                      wait_ep0tx();
 859   2                      ep0out_ack();
 860   2              }
C51 COMPILER V7.50   CHAP_9                                                                10/30/2007 16:17:28 PAGE 15  

 861   1      
 862   1              if(USB_Device_Request.bmRequestType == 0x82)
 863   1              {
 864   2                      Temp = 0;
 865   2                      Temp = USB_Device.BITS.Halt;
 866   2                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;

⌨️ 快捷键说明

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