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

📄 usbcore.lst

📁 自定义的USB设备单片机固件程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
 502   2        if(SendLength!=0)
 503   2        {
 504   3         //不够最大包长,可以直接发送
 505   3         D12WriteEndpointBuffer(1,SendLength,pSendData);
 506   3         //发送完毕后,SendLength长度变为0
 507   3         SendLength=0;
 508   3        }
 509   2        else //如果要发送的数据包长度为0
 510   2        {
 511   3         if(NeedZeroPacket==1) //如果需要发送0长度数据
 512   3         {
 513   4          D12WriteEndpointBuffer(1,0,pSendData); //发送0长度数据包
 514   4          NeedZeroPacket=0; //清需要发送0长度数据包标志
 515   4         }
 516   3        }
 517   2       }
 518   1      }
 519          ////////////////////////End of function//////////////////////////////
 520          
 521          /********************************************************************
 522          函数功能:端点0输出中断处理函数。
 523          入口参数:无。
 524          返    回:无。
 525          备    注:无。
 526          ********************************************************************/
 527          void UsbEp0Out(void)
 528          {
 529   1      #ifdef DEBUG0
 530   1       Prints("USB端点0输出中断。\r\n");
 531   1      #endif
 532   1       //读取端点0输出最后传输状态,该操作清除中断标志
 533   1       //并判断第5位是否为1,如果是,则说明是建立包
 534   1       if(D12ReadEndpointLastStatus(0)&0x20)
 535   1       {
 536   2        D12ReadEndpointBuffer(0,16,Buffer); //读建立过程数据
 537   2        D12AcknowledgeSetup(); //应答建立包
 538   2        D12ClearBuffer(); //清缓冲区
 539   2        //将缓冲数据填到设备请求的各字段中
 540   2        bmRequestType=Buffer[0];
 541   2        bRequest=Buffer[1];
 542   2        wValue=Buffer[2]+(((uint16)Buffer[3])<<8);
 543   2        wIndex=Buffer[4]+(((uint16)Buffer[5])<<8);
 544   2        wLength=Buffer[6]+(((uint16)Buffer[7])<<8);
 545   2        //下面的代码判断具体的请求,并根据不同的请求进行相关操作
 546   2        //如果D7位为1,则说明是输入请求
 547   2        if((bmRequestType&0x80)==0x80)
 548   2        {
 549   3         //根据bmRequestType的D6~5位散转,D6~5位表示请求的类型
 550   3         //0为标准请求,1为类请求,2为厂商请求。
 551   3         switch((bmRequestType>>5)&0x03)
C51 COMPILER V8.05a   USBCORE                                                              04/21/2009 19:44:21 PAGE 10  

 552   3         {
 553   4          case 0:  //标准请求
 554   4           #ifdef DEBUG0
 555   4            Prints("USB标准输入请求:");
 556   4           #endif
 557   4           //USB协议定义了几个标准输入请求,我们实现这些标准请求即可
 558   4           //请求的代码在bRequest中,对不同的请求代码进行散转
 559   4           //事实上,我们还需要对接收者进行散转,因为不同的请求接收者
 560   4           //是不一样的。接收者在bmRequestType的D4~D0位中定义。
 561   4           //我们这里为了简化操作,有些就省略了对接收者的判断。
 562   4           //例如获取描述符的请求,只根据描述符的类型来区别。
 563   4           switch(bRequest)
 564   4           {
 565   5            case GET_CONFIGURATION: //获取配置
 566   5             #ifdef DEBUG0
 567   5              Prints("获取配置。\r\n");
 568   5             #endif
 569   5            break;
 570   5            
 571   5            case GET_DESCRIPTOR:  //获取描述符
 572   5             #ifdef DEBUG0
 573   5              Prints("获取描述符——");
 574   5             #endif
 575   5             //对描述符类型进行散转,对于全速设备,
 576   5             //标准请求只支持发送到设备的设备、配置、字符串三种描述符
 577   5             switch((wValue>>8)&0xFF)
 578   5              {
 579   6               case DEVICE_DESCRIPTOR: //设备描述符
 580   6                #ifdef DEBUG0
 581   6                 Prints("设备描述符。\r\n");
 582   6                #endif
 583   6                pSendData=DeviceDescriptor;  //需要发送的数据
 584   6                //判断请求的字节数是否比实际需要发送的字节数多
 585   6                //这里请求的是设备描述符,因此数据长度就是
 586   6                //DeviceDescriptor[0]。如果请求的比实际的长,
 587   6                //那么只返回实际长度的数据
 588   6                if(wLength>DeviceDescriptor[0])
 589   6                {
 590   7                 SendLength=DeviceDescriptor[0];
 591   7                 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
 592   7                 {
 593   8                  NeedZeroPacket=1; //需要返回0长度的数据包
 594   8                 }
 595   7                }
 596   6                else
 597   6                {
 598   7                 SendLength=wLength;
 599   7                }
 600   6                //将数据通过EP0返回
 601   6                UsbEp0SendData();
 602   6               break;
 603   6               
 604   6               case CONFIGURATION_DESCRIPTOR:  //配置描述符
 605   6                #ifdef DEBUG0
 606   6                 Prints("配置描述符。\r\n");
 607   6                #endif
 608   6                pSendData=ConfigurationDescriptor; //需要发送的数据为配置描述符
 609   6                //判断请求的字节数是否比实际需要发送的字节数多
 610   6                //这里请求的是配置描述符集合,因此数据长度就是
 611   6                //ConfigurationDescriptor[3]*256+ConfigurationDescriptor[2]。
 612   6                //如果请求的比实际的长,那么只返回实际长度的数据
 613   6                SendLength=ConfigurationDescriptor[3];
C51 COMPILER V8.05a   USBCORE                                                              04/21/2009 19:44:21 PAGE 11  

 614   6                SendLength=SendLength*256+ConfigurationDescriptor[2];
 615   6                if(wLength>SendLength)
 616   6                {
 617   7                 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
 618   7                 {
 619   8                  NeedZeroPacket=1; //需要返回0长度的数据包
 620   8                 }
 621   7                }
 622   6                else
 623   6                {
 624   7                 SendLength=wLength;
 625   7                }
 626   6                //将数据通过EP0返回
 627   6                UsbEp0SendData();
 628   6               break;
 629   6               
 630   6               case STRING_DESCRIPTOR:  //字符串描述符
 631   6                #ifdef DEBUG0
 632   6                 Prints("字符串描述符");
 633   6                #endif
 634   6                switch(wValue&0xFF)  //根据wValue的低字节(索引值)散转
 635   6                {
 636   7                 case 0:  //获取语言ID
 637   7                  #ifdef DEBUG0
 638   7                   Prints("(语言ID)。\r\n");
 639   7                  #endif
 640   7                  pSendData=LanguageId;
 641   7                  SendLength=LanguageId[0];
 642   7                 break;
 643   7                 
 644   7                 case 1:  //厂商字符串的索引值为1,所以这里为厂商字符串
 645   7                 #ifdef DEBUG0
 646   7                   Prints("(厂商描述)。\r\n");
 647   7                  #endif
 648   7                  pSendData=ManufacturerStringDescriptor;
 649   7                  SendLength=ManufacturerStringDescriptor[0];
 650   7                 break;
 651   7                 
 652   7                 case 2:  //产品字符串的索引值为2,所以这里为产品字符串
 653   7                 #ifdef DEBUG0
 654   7                   Prints("(产品描述)。\r\n");
 655   7                  #endif
 656   7                  pSendData=ProductStringDescriptor;
 657   7                  SendLength=ProductStringDescriptor[0];
 658   7                 break;
 659   7                 
 660   7                 case 3:  //产品序列号的索引值为3,所以这里为序列号
 661   7                 #ifdef DEBUG0
 662   7                   Prints("(产品序列号)。\r\n");
 663   7                  #endif
 664   7                  pSendData=SerialNumberStringDescriptor;
 665   7                  SendLength=SerialNumberStringDescriptor[0];
 666   7                 break;
 667   7                 
 668   7                 default :
 669   7                  #ifdef DEBUG0
 670   7                   Prints("(未知的索引值)。\r\n");
 671   7                  #endif
 672   7                  //对于未知索引值的请求,返回一个0长度的包
 673   7                  SendLength=0;
 674   7                  NeedZeroPacket=1;
 675   7                 break;
C51 COMPILER V8.05a   USBCORE                                                              04/21/2009 19:44:21 PAGE 12  

 676   7                }
 677   6                //判断请求的字节数是否比实际需要发送的字节数多
 678   6                //如果请求的比实际的长,那么只返回实际长度的数据
 679   6                if(wLength>SendLength)
 680   6                {
 681   7                 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
 682   7                 {
 683   8                  NeedZeroPacket=1; //需要返回0长度的数据包
 684   8                 }
 685   7                }
 686   6                else
 687   6                {
 688   7                 SendLength=wLength;
 689   7                }
 690   6                //将数据通过EP0返回
 691   6                UsbEp0SendData();         
 692   6               break;
 693   6      
 694   6               case REPORT_DESCRIPTOR:  //报告描述符
 695   6                #ifdef DEBUG0
 696   6                 Prints("报告描述符。\r\n");
 697   6                #endif
 698   6               break;
 699   6                       
 700   6               default:  //其它描述符
 701   6                #ifdef DEBUG0
 702   6                 Prints("其他描述符,描述符代码:");
 703   6                 PrintHex((wValue>>8)&0xFF);
 704   6                 Prints("\r\n");
 705   6                #endif
 706   6               break;
 707   6              }
 708   5             break;
 709   5            
 710   5            case GET_INTERFACE: //获取接口
 711   5             #ifdef DEBUG0
 712   5              Prints("获取接口。\r\n");
 713   5             #endif
 714   5            break;
 715   5            
 716   5            case GET_STATUS: //获取状态
 717   5             #ifdef DEBUG0
 718   5              Prints("获取状态。\r\n");
 719   5             #endif
 720   5            break;
 721   5            
 722   5            case SYNCH_FRAME: //同步帧
 723   5             #ifdef DEBUG0
 724   5              Prints("同步帧。\r\n");
 725   5             #endif
 726   5            break;
 727   5            
 728   5            default:  //未定义的标准请求
 729   5             #ifdef DEBUG0
 730   5              Prints("错误:未定义的标准输入请求。\r\n");
 731   5             #endif       
 732   5            break;
 733   5           }
 734   4          break;
 735   4          
 736   4          case 1:  //类请求
 737   4           #ifdef DEBUG0
C51 COMPILER V8.05a   USBCORE                                                              04/21/2009 19:44:21 PAGE 13  

 738   4            Prints("USB类输入请求:\r\n");
 739   4           #endif
 740   4          break;
 741   4          
 742   4          case 2:  //厂商请求
 743   4           #ifdef DEBUG0
 744   4            Prints("USB厂商输入请求:\r\n");
 745   4           #endif
 746   4          break;
 747   4          
 748   4          default: //未定义的请求。这里只显示一个报错信息。
 749   4           #ifdef DEBUG0
 750   4            Prints("错误:未定义的输入请求。\r\n");
 751   4           #endif
 752   4          break;
 753   4         }
 754   3        }
 755   2        //否则说明是输出请求
 756   2        else //if(bmRequestType&0x80==0x80)之else

⌨️ 快捷键说明

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