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

📄 usbcore.lst

📁 自定义的USB设备单片机固件程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
 757   2        {
 758   3         //根据bmRequestType的D6~5位散转,D6~5位表示请求的类型
 759   3         //0为标准请求,1为类请求,2为厂商请求。
 760   3         switch((bmRequestType>>5)&0x03)
 761   3         {
 762   4          case 0:  //标准请求
 763   4           #ifdef DEBUG0
 764   4            Prints("USB标准输出请求:");
 765   4           #endif
 766   4           //USB协议定义了几个标准输出请求,我们实现这些标准请求即可
 767   4           //请求的代码在bRequest中,对不同的请求代码进行散转
 768   4           switch(bRequest)
 769   4           {
 770   5            case CLEAR_FEATURE: //清除特性
 771   5             #ifdef DEBUG0
 772   5              Prints("清除特性。\r\n");
 773   5             #endif
 774   5            break;
 775   5            
 776   5            case SET_ADDRESS:  //设置地址
 777   5             #ifdef DEBUG0
 778   5              Prints("设置地址。地址为:");
 779   5              PrintHex(wValue&0xFF); //显示所设置的地址
 780   5              Prints("\r\n");
 781   5             #endif
 782   5             D12SetAddress(wValue&0xFF); //wValue中的低字节是设置的地址值
 783   5             //设置地址没有数据过程,直接进入到状态过程,返回一个0长度的数据包
 784   5             SendLength=0;
 785   5             NeedZeroPacket=1;
 786   5             //将数据通过EP0返回
 787   5             UsbEp0SendData();
 788   5            break;
 789   5            
 790   5            case SET_CONFIGURATION: //设置配置
 791   5             #ifdef DEBUG0
 792   5              Prints("设置配置。\r\n");
 793   5             #endif
 794   5             //使能非0端点。非0端点只有在设置为非0的配置后才能使能。
 795   5             //wValue的低字节为配置的值,如果该值为非0,才能使能非0端点。
 796   5             //保存当前配置值
 797   5             ConfigValue=wValue&0xFF;
 798   5             D12SetEndpointEnable(ConfigValue);
 799   5             //返回一个0长度的状态数据包
C51 COMPILER V8.05a   USBCORE                                                              04/21/2009 19:44:21 PAGE 14  

 800   5             SendLength=0;
 801   5             NeedZeroPacket=1;
 802   5             //将数据通过EP0返回
 803   5             UsbEp0SendData();
 804   5            break;
 805   5            
 806   5            case SET_DESCRIPTOR: //设置描述符
 807   5             #ifdef DEBUG0
 808   5              Prints("设置描述符。\r\n");
 809   5             #endif
 810   5            break;
 811   5            
 812   5            case SET_FEATURE: //设置特性
 813   5             #ifdef DEBUG0
 814   5              Prints("设置特性。\r\n");
 815   5             #endif
 816   5            break;
 817   5      
 818   5            case SET_INTERFACE: //设置接口
 819   5             #ifdef DEBUG0
 820   5              Prints("设置接口。\r\n");
 821   5             #endif
 822   5            break;      
 823   5            
 824   5            default:  //未定义的标准请求
 825   5             #ifdef DEBUG0
 826   5              Prints("错误:未定义的标准输出请求。\r\n");
 827   5             #endif       
 828   5            break;
 829   5           }
 830   4          break;
 831   4          
 832   4          case 1:  //类请求
 833   4           #ifdef DEBUG0
 834   4            Prints("USB类输出请求:");
 835   4           #endif
 836   4           switch(bRequest)
 837   4           {
 838   5            case SET_IDLE:
 839   5             #ifdef DEBUG0
 840   5              Prints("设置空闲。\r\n");
 841   5             #endif
 842   5             //只需要返回一个0长度的数据包即可
 843   5             SendLength=0;
 844   5             NeedZeroPacket=1;
 845   5             //将数据通过EP0返回
 846   5             UsbEp0SendData();
 847   5            break;
 848   5            
 849   5            default:
 850   5             #ifdef DEBUG0
 851   5              Prints("未知请求。\r\n");
 852   5             #endif
 853   5            break;
 854   5           }
 855   4          break;
 856   4          
 857   4          case 2:  //厂商请求
 858   4           #ifdef DEBUG0
 859   4            Prints("USB厂商输出请求:\r\n");
 860   4           #endif
 861   4          break;
C51 COMPILER V8.05a   USBCORE                                                              04/21/2009 19:44:21 PAGE 15  

 862   4          
 863   4          default: //未定义的请求。这里只显示一个报错信息。
 864   4           #ifdef DEBUG0
 865   4            Prints("错误:未定义的输出请求。\r\n");
 866   4           #endif
 867   4          break;
 868   4         }
 869   3        }
 870   2       }
 871   1       //普通数据输出
 872   1       else //if(D12ReadEndpointLastStatus(0)&0x20)之else
 873   1       {
 874   2        D12ReadEndpointBuffer(0,16,Buffer);
 875   2        D12ClearBuffer();
 876   2       }
 877   1      }
 878          ////////////////////////End of function//////////////////////////////
 879          
 880          /********************************************************************
 881          函数功能:端点0输入中断处理函数。
 882          入口参数:无。
 883          返    回:无。
 884          备    注:无。
 885          ********************************************************************/
 886          void UsbEp0In(void)
 887          {
 888   1      #ifdef DEBUG0
 889   1       Prints("USB端点0输入中断。\r\n");
 890   1      #endif
 891   1       //读最后发送状态,这将清除端点0的中断标志位
 892   1       D12ReadEndpointLastStatus(1);
 893   1       //发送剩余的字节数
 894   1       UsbEp0SendData();
 895   1      }
 896          ////////////////////////End of function//////////////////////////////
 897          
 898          /********************************************************************
 899          函数功能:端点1输出中断处理函数。
 900          入口参数:无。
 901          返    回:无。
 902          备    注:无。
 903          ********************************************************************/
 904          void UsbEp1Out(void)
 905          {
 906   1       uint8 Buf[8]; //用来保存8字节的输出输出。
 907   1      #ifdef DEBUG0
 908   1       Prints("USB端点1输出中断。\r\n");
 909   1      #endif
 910   1       //读端点最后状态,这将清除端点1输出的中断标志位
 911   1       D12ReadEndpointLastStatus(2);
 912   1       //从端点1输出缓冲读回8字节数据
 913   1       D12ReadEndpointBuffer(2,8,Buf);
 914   1       //清除端点缓冲区
 915   1       D12ClearBuffer();
 916   1       
 917   1       //输出数据第一字节为LED状态,某位为1时,表示LED亮。
 918   1       LEDs=~Buf[0];
 919   1       
 920   1       //输出数据的第二字节非0时,清除发送计数器Count。
 921   1       if(Buf[1]!=0)
 922   1       {
 923   2        Count=0;
C51 COMPILER V8.05a   USBCORE                                                              04/21/2009 19:44:21 PAGE 16  

 924   2       }
 925   1      }
 926          ////////////////////////End of function//////////////////////////////
 927          
 928          /********************************************************************
 929          函数功能:端点1输入中断处理函数。
 930          入口参数:无。
 931          返    回:无。
 932          备    注:无。
 933          ********************************************************************/
 934          void UsbEp1In(void)
 935          {
 936   1      #ifdef DEBUG0
 937   1       Prints("USB端点1输入中断。\r\n");
 938   1      #endif
 939   1       //读最后发送状态,这将清除端点1输入的中断标志位
 940   1       D12ReadEndpointLastStatus(3);
 941   1       //端点1输入处于空闲状态
 942   1       Ep1InIsBusy=0;
 943   1      }
 944          ////////////////////////End of function//////////////////////////////
 945          
 946          /********************************************************************
 947          函数功能:端点2输出中断处理函数。
 948          入口参数:无。
 949          返    回:无。
 950          备    注:无。
 951          ********************************************************************/
 952          void UsbEp2Out(void)
 953          {
 954   1      #ifdef DEBUG0
 955   1       Prints("USB端点2输出中断。\r\n");
 956   1      #endif
 957   1       //如果缓冲区中的数据还未通过串口发送完毕,则暂时不处理该中断,直接返回。
 958   1       if(UsbEp2ByteCount!=0)return;
 959   1       
 960   1       //读最后接收状态,这将清除端点2输出的中断标志位。
 961   1       //注意端点2有个双缓冲机制,在清除中断之前,先检查是否两个缓冲区
 962   1       //是否全满了,如果两个缓冲区全满的话,就不用清除中断标志。只有当
 963   1       //两个缓冲区不全满的时候才需要清除中断标志。
 964   1       if((D12ReadEndpointStatus(4)&0x60)!=0x60)
 965   1       {
 966   2        D12ReadEndpointLastStatus(4);
 967   2       }
 968   1        
 969   1       //读区端点2的数据。返回值为实际读到的数据字节数
 970   1       UsbEp2ByteCount=D12ReadEndpointBuffer(4,BUF_LEN,UsbEp2Buffer);
 971   1       //清除端点缓冲区
 972   1       D12ClearBuffer();
 973   1       
 974   1       //输出位置设为0
 975   1       UsbEp2BufferOutputPoint=0;
 976   1      }
 977          ////////////////////////End of function//////////////////////////////
 978          
 979          /********************************************************************
 980          函数功能:端点2输入中断处理函数。
 981          入口参数:无。
 982          返    回:无。
 983          备    注:无。
 984          ********************************************************************/
 985          void UsbEp2In(void)
C51 COMPILER V8.05a   USBCORE                                                              04/21/2009 19:44:21 PAGE 17  

 986          {
 987   1      #ifdef DEBUG0
 988   1       Prints("USB端点2输入中断。\r\n");
 989   1      #endif
 990   1       //读最后发送状态,这将清除端点2输入的中断标志位
 991   1       D12ReadEndpointLastStatus(5);
 992   1       //端点2输入处于空闲状态
 993   1       Ep2InIsBusy=0;
 994   1      }
 995          ////////////////////////End of function//////////////////////////////


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1278    ----
   CONSTANT SIZE    =    970    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     21       8
   IDATA SIZE       =     16    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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