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

📄 chap_9.lst

📁 该代码是基于菲利普ISP1581USB接口芯片与STC89C51单片机的USB2.0开发代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
 867   2                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 2;
 868   2                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
 869   2                      D14_Cntrl_Reg.D14_DATA_PORT_LSB = (UC) Temp;
 870   2                      D14_Cntrl_Reg.D14_DATA_PORT_MSB = (UC) (Temp >> 8);
 871   2                      wait_ep0tx();
 872   2                      ep0out_ack();
 873   2              }
 874   1      }
 875          
 876          
 877          //Set_Feature特性设置
 878          //不支持测试模式
 879          void set_feature(void)
 880          {
 881   1              unsigned char bRecipient = USB_Device_Request.bmRequestType & 0x0f;
 882   1              //端点
 883   1              if(bRecipient == 0x02 && USB_Device_Request.wValue == 0x0000)
 884   1              {
 885   2                      switch(USB_Device_Request.wIndex)
 886   2                      {
 887   3                      case  0x8000   :
 888   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 889   3                              break;
 890   3                      case  0x0000   :
 891   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
 892   3                              break;
 893   3                      case  0x8100   :
 894   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;
 895   3                              break;
 896   3                      case  0x0100   :
 897   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;
 898   3                              break;
 899   3                      case  0x8200   :
 900   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
 901   3                              break;
 902   3                      case  0x0200   :
 903   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
 904   3                              break;
 905   3                      case  0x8300   :
 906   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;
 907   3                              break;
 908   3                      case  0x0300   :
 909   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;
 910   3                              break;
 911   3                      case  0x8400   :
 912   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 9;
 913   3                              break;
 914   3                      case  0x0400   :
 915   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 8;
 916   3                              break;
 917   3                      case  0x8500   :
 918   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 11;
 919   3                              break;
 920   3                      case  0x0500   :
 921   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 10;
 922   3                              break;
C51 COMPILER V7.50   CHAP_9                                                                10/30/2007 16:17:28 PAGE 16  

 923   3                      case  0x8600   :
 924   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 13;
 925   3                              break;
 926   3                      case  0x0600   :
 927   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 12;
 928   3                              break;
 929   3                      case  0x8700   :
 930   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 15;
 931   3                              break;
 932   3                      case  0x0700   :
 933   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 14;
 934   3                              break;
 935   3                      default        :  
 936   3                              break;
 937   3                      }                                                                                                      
 938   2                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
 939   2                      Kernel_Flag.BITS.Endpt_Stall = 1;
 940   2                      D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = OFF;                 //disable FIFO
 941   2                      //D14_Cntrl_Reg.D14_ENDPT_TYPE.BITS.ENABLE = ON;                        //disable FIFO
 942   2                      ep0in_ack();
 943   2                      USB_Device.BITS.Halt = 0;
 944   2              }                                                                                       
 945   1              else if(bRecipient == 0x00 && USB_Device_Request.wValue == 0x0100)
 946   1              {       //远程唤醒
 947   2                      USB_Device.BITS.Remote_Wakeup = 1;
 948   2                      ep0in_ack();
 949   2              }
 950   1              else
 951   1              {
 952   2                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 953   2                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
 954   2                      while(!USB_Int_Flag.BITS.EP0SETUP)
 955   2                      {
 956   3                              //读取ISP1581中断寄存器
 957   3                              USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
 958   3                              //回写ISP1581中断寄存器
 959   3                              D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
 960   3                              if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
 961   3                                      return;
 962   3                      }
 963   2                      USB_Int_Flag.BITS.EP0TX = 0;
 964   2              }
 965   1      }
 966          
 967          
 968          //Get_Interface 获取接口状态
 969          void get_interface(void)
 970          {
 971   1              if(USB_Device_Request.wValue != 0)
 972   1              {
 973   2                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
 974   2                      while(!USB_Int_Flag.BITS.EP0SETUP)
 975   2                      {
 976   3                              //读取ISP1581中断寄存器
 977   3                              USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
 978   3                              //回写ISP1581中断寄存器
 979   3                              D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
 980   3                              if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
 981   3                                      return;
 982   3                      }
 983   2                      USB_Int_Flag.BITS.EP0TX = 0;
 984   2              }
C51 COMPILER V7.50   CHAP_9                                                                10/30/2007 16:17:28 PAGE 17  

 985   1              else
 986   1              {
 987   2                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 988   2                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 1;
 989   2                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
 990   2                      if(!USB_Device.BITS.Alter_Interface)
 991   2                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0;
 992   2                      else
 993   2                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = 1;
 994   2                      wait_ep0tx();
 995   2                      ep0in_ack();
 996   2              }
 997   1      }
 998          
 999          
1000          
1001          //Set_Interface 设置接口状态
1002          void set_interface(void)
1003          {
1004   1              if(USB_Device_Request.wIndex == 0 && USB_Device_Request.wValue == 0x0100)
1005   1                      USB_Device.BITS.Alter_Interface = 1;
1006   1              
1007   1              if(USB_Device_Request.wIndex == 0x0100 && USB_Device_Request.wValue == 0)
1008   1                      USB_Device.BITS.Alter_Interface = 0;
1009   1              
1010   1              if(USB_Device_Request.wIndex == 0 && USB_Device_Request.wValue == 0)
1011   1                      USB_Device.BITS.Alter_Interface = 0;
1012   1      
1013   1              ep0in_ack();
1014   1      }
1015          
1016          
1017          
1018          //端点0IN状态响应
1019          void ep0in_ack(void)
1020          {
1021   1              D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
1022   1              D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
1023   1              wait_ep0tx();
1024   1              LED=~LED;  //LED显示状态
1025   1      }
1026          
1027          
1028          
1029          //等待端点0IN状态响应
1030          void wait_ep0tx(void)
1031          {
1032   1              //end of status stage
1033   1              while(!USB_Int_Flag.BITS.EP0TX)
1034   1              {
1035   2                      //读取ISP1581中断寄存器
1036   2                      USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
1037   2                      //回写ISP1581中断寄存器
1038   2                      D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
1039   2                      if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
1040   2                              return;
1041   2              }
1042   1              USB_Int_Flag.BITS.EP0TX = 0;
1043   1      }
1044          
1045          
1046          //端点0OUT状态响应
C51 COMPILER V7.50   CHAP_9                                                                10/30/2007 16:17:28 PAGE 18  

1047          void ep0out_ack(void)
1048          {
1049   1              //设置状态响应
1050   1              //acknowledge status stage
1051   1              D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
1052   1              D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STATUS = 1;
1053   1              wait_ep0rx();
1054   1              LED=~LED;  //LED显示状态
1055   1      }
1056          
1057          
1058          
1059          //等待端点0OUT状态响应
1060          void wait_ep0rx(void)
1061          {
1062   1              while(!USB_Int_Flag.BITS.EP0RX)
1063   1              {
1064   2                      //读取ISP1581中断寄存器
1065   2                      USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
1066   2                      //回写ISP1581中断寄存器
1067   2                      D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
1068   2                      if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
1069   2                              return;
1070   2              }               
1071   1              USB_Int_Flag.BITS.EP0RX = 0;
1072   1      }
1073          
1074          
1075          
1076          //从端点读数据
1077          unsigned int read_endpoint(unsigned char endp,unsigned int len,unsigned char *buf)
1078          {
1079   1              unsigned int datalen; 
1080   1      
1081   1              D14_Cntrl_Reg.D14_ENDPT_INDEX = endp;
1082   1              datalen = D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB;
1083   1              datalen <<= 8;
1084   1     

⌨️ 快捷键说明

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