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

📄 usbcore.lst

📁 单片机上实现U盘功能
💻 LST
📖 第 1 页 / 共 4 页
字号:
 751   5            
 752   5            case SET_ADDRESS:  //设置地址
 753   5             #ifdef DEBUG0
                      Prints("设置地址。地址为:");
                      PrintHex(wValue&0xFF); //显示所设置的地址
                      Prints("\r\n");
                     #endif
 758   5             D12SetAddress(wValue&0xFF); //wValue中的低字节是设置的地址值
 759   5             //设置地址没有数据过程,直接进入到状态过程,返回一个0长度的数据包
 760   5             SendLength=0;
 761   5             NeedZeroPacket=1;
 762   5             //将数据通过EP0返回
 763   5             UsbEp0SendData();
 764   5            break;
 765   5            
 766   5            case SET_CONFIGURATION: //设置配置
 767   5             #ifdef DEBUG0
                      Prints("设置配置。\r\n");
                     #endif
 770   5             //使能非0端点。非0端点只有在设置为非0的配置后才能使能。
 771   5             //wValue的低字节为配置的值,如果该值为非0,才能使能非0端点。
 772   5             //保存当前配置值
 773   5             ConfigValue=wValue&0xFF;
 774   5             D12SetEndpointEnable(ConfigValue);
 775   5             //返回一个0长度的状态数据包
 776   5             SendLength=0;
 777   5             NeedZeroPacket=1;
 778   5             //将数据通过EP0返回
 779   5             UsbEp0SendData();
 780   5            break;
 781   5            
 782   5            case SET_DESCRIPTOR: //设置描述符
 783   5             #ifdef DEBUG0
                      Prints("设置描述符。\r\n");
                     #endif
 786   5            break;
 787   5            
 788   5            case SET_FEATURE: //设置特性
 789   5             #ifdef DEBUG0
                      Prints("设置特性。\r\n");
                     #endif
 792   5            break;
 793   5      
 794   5            case SET_INTERFACE: //设置接口
 795   5             #ifdef DEBUG0
                      Prints("设置接口。\r\n");
                     #endif
 798   5             //返回一个0长度的状态数据包
 799   5             SendLength=0;
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:19 PAGE 14  

 800   5             NeedZeroPacket=1;
 801   5             //将数据通过EP0返回
 802   5             UsbEp0SendData();
 803   5            break;
 804   5            
 805   5            default:  //未定义的标准请求
 806   5             #ifdef DEBUG0
                      Prints("错误:未定义的标准输出请求。\r\n");
                     #endif       
 809   5            break;
 810   5           }
 811   4          break;
 812   4          
 813   4          case 1:  //类请求
 814   4           #ifdef DEBUG0
                    Prints("USB类输出请求:");
                   #endif
 817   4           switch(bRequest)
 818   4           {
 819   5            case MASS_STORAGE_RESET:
 820   5             #ifdef DEBUG0
                      Prints("大容量存储设备复位。\r\n");
                     #endif
 823   5             
 824   5             //接下来的数据为命令阶段(CBW)
 825   5             TransportStage=COMMAND_STAGE;
 826   5             //返回一个0长度的数据包
 827   5             SendLength=0;
 828   5             NeedZeroPacket=1;
 829   5             //将数据通过EP0返回
 830   5             UsbEp0SendData();
 831   5            break;
 832   5            
 833   5            default:
 834   5             #ifdef DEBUG0
                      Prints("未知请求。\r\n");
                     #endif
 837   5            break;
 838   5           }
 839   4          break;
 840   4          
 841   4          case 2:  //厂商请求
 842   4           #ifdef DEBUG0
                    Prints("USB厂商输出请求:\r\n");
                   #endif
 845   4          break;
 846   4          
 847   4          default: //未定义的请求。这里只显示一个报错信息。
 848   4           #ifdef DEBUG0
                    Prints("错误:未定义的输出请求。\r\n");
                   #endif
 851   4          break;
 852   4         }
 853   3        }
 854   2       }
 855   1       //普通数据输出
 856   1       else //if(D12ReadEndpointLastStatus(0)&0x20)之else
 857   1       {
 858   2        D12ReadEndpointBuffer(0,16,Buffer);
 859   2        D12ClearBuffer();
 860   2       }
 861   1      }
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:19 PAGE 15  

 862          ////////////////////////End of function//////////////////////////////
 863          
 864          /********************************************************************
 865          函数功能:端点0输入中断处理函数。
 866          入口参数:无。
 867          返    回:无。
 868          备    注:无。
 869          ********************************************************************/
 870          void UsbEp0In(void)
 871          {
 872   1      #ifdef DEBUG0
               Prints("USB端点0输入中断。\r\n");
              #endif
 875   1       //读最后发送状态,这将清除端点0的中断标志位
 876   1       D12ReadEndpointLastStatus(1);
 877   1       //发送剩余的字节数
 878   1       UsbEp0SendData();
 879   1      }
 880          ////////////////////////End of function//////////////////////////////
 881          
 882          /********************************************************************
 883          函数功能:端点1输出中断处理函数。
 884          入口参数:无。
 885          返    回:无。
 886          备    注:无。
 887          ********************************************************************/
 888          void UsbEp1Out(void)
 889          {
 890   1      #ifdef DEBUG0
               Prints("USB端点1输出中断。\r\n");
              #endif
 893   1       //读端点最后状态,这将清除端点1输出的中断标志位
 894   1       D12ReadEndpointLastStatus(2);
 895   1       //清除端点缓冲区
 896   1       D12ClearBuffer();
 897   1      }
 898          ////////////////////////End of function//////////////////////////////
 899          
 900          /********************************************************************
 901          函数功能:端点1输入中断处理函数。
 902          入口参数:无。
 903          返    回:无。
 904          备    注:无。
 905          ********************************************************************/
 906          void UsbEp1In(void)
 907          {
 908   1      #ifdef DEBUG0
               Prints("USB端点1输入中断。\r\n");
              #endif
 911   1       //读最后发送状态,这将清除端点1输入的中断标志位
 912   1       D12ReadEndpointLastStatus(3);
 913   1       //端点1输入处于空闲状态
 914   1       Ep1InIsBusy=0;
 915   1      }
 916          ////////////////////////End of function//////////////////////////////
 917          
 918          /********************************************************************
 919          函数功能:端点2输出中断处理函数。
 920          入口参数:无。
 921          返    回:无。
 922          备    注:无。
 923          ********************************************************************/
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:19 PAGE 16  

 924          void UsbEp2Out(void)
 925          {
 926   1       uint8 Len;
 927   1       
 928   1      #ifdef DEBUG0
               Prints("USB端点2输出中断。\r\n");
              #endif
 931   1      
 932   1       //当双缓冲没有全满时,可以清除中断标志
 933   1       if((D12ReadEndpointStatus(4)&0x60)!=0x60)
 934   1       {
 935   2        //读最后发送状态,这将清除端点2输入的中断标志位
 936   2        D12ReadEndpointLastStatus(4);
 937   2       }
 938   1       if(TransportStage==COMMAND_STAGE)
 939   1       {
 940   2        //将数据读回到CBW缓冲区中
 941   2        Len=D12ReadEndpointBuffer(4,sizeof(CBW),CBW);
 942   2        //清除端点缓冲区
 943   2        D12ClearBuffer();
 944   2        if(Len==31) //如果接收到的数据长度是31字节,则说明是CBW
 945   2        {
 946   3         //检查CBW的签名是否正确,签名为“USBC”
 947   3         if((CBW[0]=='U')&&(CBW[1]=='S')&&(CBW[2]=='B')&&(CBW[3]=='C'))
 948   3         {
 949   4          //CBW签名正确,处理SCSI命令
 950   4          ProcScsiCommand();
 951   4         }
 952   3        }
 953   2       }
 954   1       else if(TransportStage==DATA_STAGE)
 955   1       {
 956   2        ProcScsiOutData(); //处理SCSI输出数据
 957   2       }
 958   1       else 
 959   1       {
 960   2        D12ReadEndpointBuffer(4,0,0);
 961   2        D12ClearBuffer();
 962   2       }
 963   1      }
 964          ////////////////////////End of function//////////////////////////////
 965          
 966          /********************************************************************
 967          函数功能:端点2输入中断处理函数。
 968          入口参数:无。
 969          返    回:无。
 970          备    注:无。
 971          ********************************************************************/
 972          void UsbEp2In(void)
 973          {
 974   1      #ifdef DEBUG0
               Prints("USB端点2输入中断。\r\n");
              #endif
 977   1       //读最后发送状态,这将清除端点2输入的中断标志位
 978   1       D12ReadEndpointLastStatus(5);
 979   1       Ep2SendData();  //发送数据
 980   1       //如果双缓冲区没有都满,还可以再写
 981   1       if((D12ReadEndpointStatus(5)&0x06)!=0x06)
 982   1       {
 983   2        Ep2SendData(); //再发一次数据,利用双缓冲
 984   2       }
 985   1      }
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:19 PAGE 17  

 986          ////////////////////////End of function//////////////////////////////


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    887    ----
   CONSTANT SIZE    =    191    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     18       1
   IDATA SIZE       =     60    ----
   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 + -