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

📄 usbcore.lst

📁 单片机上实现USB转串口程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
                     #endif       
 886   5             SendLength=0;
 887   5             NeedZeroPacket=1;
 888   5            break;
 889   5            
 890   5            default:
 891   5             #ifdef DEBUG0
                      Prints("未知类请求。\r\n");
                     #endif
 894   5             SendLength=0;
 895   5             NeedZeroPacket=1;
 896   5            break;
 897   5           }
 898   4          //判断请求的字节数是否比实际需要发送的字节数多
 899   4          //如果请求的比实际的长,那么只返回实际长度的数据
 900   4          if(wLength>SendLength)
 901   4          {
 902   5           if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
 903   5           {
 904   6            NeedZeroPacket=1; //需要返回0长度的数据包
 905   6           }
 906   5          }
 907   4          else
 908   4          {
 909   5           SendLength=wLength;
 910   5          }
 911   4          //将数据通过EP0返回
 912   4          UsbEp0SendData();
 913   4          break;
 914   4          
 915   4          case 2:  //厂商请求
 916   4           #ifdef DEBUG0
                    Prints("USB厂商输入请求:\r\n");
                   #endif
 919   4          break;
 920   4          
 921   4          default: //未定义的请求。这里只显示一个报错信息。
 922   4           #ifdef DEBUG0
                    Prints("错误:未定义的输入请求。\r\n");
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:07 PAGE 16  

                   #endif
 925   4          break;
 926   4         }
 927   3        }
 928   2        //否则说明是输出请求
 929   2        else //if(bmRequestType&0x80==0x80)之else
 930   2        {
 931   3         //根据bmRequestType的D6~5位散转,D6~5位表示请求的类型
 932   3         //0为标准请求,1为类请求,2为厂商请求。
 933   3         switch((bmRequestType>>5)&0x03)
 934   3         {
 935   4          case 0:  //标准请求
 936   4           #ifdef DEBUG0
                    Prints("USB标准输出请求:");
                   #endif
 939   4           //USB协议定义了几个标准输出请求,我们实现这些标准请求即可
 940   4           //请求的代码在bRequest中,对不同的请求代码进行散转
 941   4           switch(bRequest)
 942   4           {
 943   5            case CLEAR_FEATURE: //清除特性
 944   5             #ifdef DEBUG0
                      Prints("清除特性。\r\n");
                     #endif
 947   5            break;
 948   5            
 949   5            case SET_ADDRESS:  //设置地址
 950   5             #ifdef DEBUG0
                      Prints("设置地址。地址为:");
                      PrintHex(wValue&0xFF); //显示所设置的地址
                      Prints("\r\n");
                     #endif
 955   5             D12SetAddress(wValue&0xFF); //wValue中的低字节是设置的地址值
 956   5             //设置地址没有数据过程,直接进入到状态过程,返回一个0长度的数据包
 957   5             SendLength=0;
 958   5             NeedZeroPacket=1;
 959   5             //将数据通过EP0返回
 960   5             UsbEp0SendData();
 961   5            break;
 962   5            
 963   5            case SET_CONFIGURATION: //设置配置
 964   5             #ifdef DEBUG0
                      Prints("设置配置。\r\n");
                     #endif
 967   5             //使能非0端点。非0端点只有在设置为非0的配置后才能使能。
 968   5             //wValue的低字节为配置的值,如果该值为非0,才能使能非0端点。
 969   5             //保存当前配置值
 970   5             ConfigValue=wValue&0xFF;
 971   5             D12SetEndpointEnable(ConfigValue);
 972   5             //返回一个0长度的状态数据包
 973   5             SendLength=0;
 974   5             NeedZeroPacket=1;
 975   5             //将数据通过EP0返回
 976   5             UsbEp0SendData();
 977   5            break;
 978   5            
 979   5            case SET_DESCRIPTOR: //设置描述符
 980   5             #ifdef DEBUG0
                      Prints("设置描述符。\r\n");
                     #endif
 983   5            break;
 984   5            
 985   5            case SET_FEATURE: //设置特性
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:07 PAGE 17  

 986   5             #ifdef DEBUG0
                      Prints("设置特性。\r\n");
                     #endif
 989   5            break;
 990   5      
 991   5            case SET_INTERFACE: //设置接口
 992   5             #ifdef DEBUG0
                      Prints("设置接口。\r\n");
                     #endif
 995   5            break;      
 996   5            
 997   5            default:  //未定义的标准请求
 998   5             #ifdef DEBUG0
                      Prints("错误:未定义的标准输出请求。\r\n");
                     #endif       
1001   5            break;
1002   5           }
1003   4          break;
1004   4          
1005   4          case 1:  //类请求
1006   4           #ifdef DEBUG0
                    Prints("USB类输出请求:");
                   #endif
1009   4           switch(bRequest)
1010   4           {
1011   5            case SET_CONTROL_LINE_STATE:
1012   5             #ifdef DEBUG0
                      Prints("SET_CONTROL_LINE_STATE。\r\n");
                     #endif
1015   5             //该请求没有数据输出阶段,其中wValue字段的D0位表示DTR,
1016   5             //D1位表示RTS。但是我们的板上的串口并没有这两引脚,因而
1017   5             //对该请求我们仅是简单地返回一个0长度的状态过程数据包即可
1018   5             SendLength=0;
1019   5             NeedZeroPacket=1;
1020   5             //将数据通过EP0返回
1021   5             UsbEp0SendData();
1022   5            break;
1023   5            
1024   5            case SET_LINE_CODING:
1025   5            //该请求设置串口的属性,但是实际的数据并不在设置过程发出,
1026   5            //而是在之后的数据过程发出。这里不用做任何处理,在数据过程
1027   5            //完成后返回0长度的状态包。
1028   5             #ifdef DEBUG0
                      Prints("SET_LINE_CODING。\r\n");
                     #endif
1031   5             break;
1032   5             
1033   5            default:
1034   5             #ifdef DEBUG0
                      Prints("未知请求。\r\n");
                     #endif
1037   5            break;
1038   5           }
1039   4          break;
1040   4          
1041   4          case 2:  //厂商请求
1042   4           #ifdef DEBUG0
                    Prints("USB厂商输出请求:\r\n");
                   #endif
1045   4          break;
1046   4          
1047   4          default: //未定义的请求。这里只显示一个报错信息。
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:07 PAGE 18  

1048   4           #ifdef DEBUG0
                    Prints("错误:未定义的输出请求。\r\n");
                   #endif
1051   4          break;
1052   4         }
1053   3        }
1054   2       }
1055   1       //普通数据输出
1056   1       else //if(D12ReadEndpointLastStatus(0)&0x20)之else
1057   1       {
1058   2        UsbEp0DataOut();
1059   2       }
1060   1      }
1061          ////////////////////////End of function//////////////////////////////
1062          
1063          /********************************************************************
1064          函数功能:端点0输入中断处理函数。
1065          入口参数:无。
1066          返    回:无。
1067          备    注:无。
1068          ********************************************************************/
1069          void UsbEp0In(void)
1070          {
1071   1      #ifdef DEBUG0
               Prints("USB端点0输入中断。\r\n");
              #endif
1074   1       //读最后发送状态,这将清除端点0的中断标志位
1075   1       D12ReadEndpointLastStatus(1);
1076   1       //发送剩余的字节数
1077   1       UsbEp0SendData();
1078   1      }
1079          ////////////////////////End of function//////////////////////////////
1080          
1081          /********************************************************************
1082          函数功能:端点1输出中断处理函数。
1083          入口参数:无。
1084          返    回:无。
1085          备    注:无。
1086          ********************************************************************/
1087          void UsbEp1Out(void)
1088          {
1089   1      #ifdef DEBUG0
               Prints("USB端点1输出中断。\r\n");
              #endif
1092   1       //读端点最后状态,这将清除端点1输出的中断标志位
1093   1       D12ReadEndpointLastStatus(2);
1094   1       //清除端点缓冲区
1095   1       D12ClearBuffer();
1096   1      }
1097          ////////////////////////End of function//////////////////////////////
1098          
1099          /********************************************************************
1100          函数功能:端点1输入中断处理函数。
1101          入口参数:无。
1102          返    回:无。
1103          备    注:无。
1104          ********************************************************************/
1105          void UsbEp1In(void)
1106          {
1107   1      #ifdef DEBUG0
               Prints("USB端点1输入中断。\r\n");
              #endif
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:07 PAGE 19  

1110   1       //读最后发送状态,这将清除端点1输入的中断标志位
1111   1       D12ReadEndpointLastStatus(3);
1112   1       //端点1输入处于空闲状态
1113   1       Ep1InIsBusy=0;
1114   1      }
1115          ////////////////////////End of function//////////////////////////////
1116          
1117          /********************************************************************
1118          函数功能:端点2输出中断处理函数。
1119          入口参数:无。
1120          返    回:无。
1121          备    注:无。
1122          ********************************************************************/
1123          void UsbEp2Out(void)
1124          {
1125   1      #ifdef DEBUG0
               Prints("USB端点2输出中断。\r\n");
              #endif
1128   1       //如果缓冲区中的数据还未通过串口发送完毕,则暂时不处理该中断,直接返回。
1129   1       if(UsbEp2ByteCount!=0) return;
1130   1       
1131   1       //读最后接收状态,这将清除端点2输出的中断标志位。
1132   1       //注意端点2有个双缓冲机制,在清除中断之前,先检查是否两个缓冲区
1133   1       //是否全满了,如果两个缓冲区全满的话,就不用清除中断标志。只有当
1134   1       //两个缓冲区不全满的时候才需要清除中断标志。
1135   1       if((D12ReadEndpointStatus(4)&0x60)!=0x60)
1136   1       {
1137   2        D12ReadEndpointLastStatus(4);
1138   2       }
1139   1        
1140   1       //读取端点2的数据。返回值为实际读到的数据字节数
1141   1       UsbEp2ByteCount=D12ReadEndpointBuffer(4,BUF_LEN,UsbEp2Buffer);
1142   1       //清除端点缓冲区
1143   1       D12ClearBuffer();
1144   1       
1145   1       //输出位置设为0
1146   1       UsbEp2BufferOutputPoint=0;
1147   1      }
1148          ////////////////////////End of function//////////////////////////////
1149          
1150          /********************************************************************
1151          函数功能:端点2输入中断处理函数。
1152          入口参数:无。
1153          返    回:无。
1154          备    注:无。
1155          ********************************************************************/
1156          void UsbEp2In(void)
1157          {
1158   1      #ifdef DEBUG0
               Prints("USB端点2输入中断。\r\n");
              #endif
1161   1       //读最后发送状态,这将清除端点2输入的中断标志位
1162   1       D12ReadEndpointLastStatus(5);
1163   1       //端点2输入处于空闲状态
1164   1       Ep2InIsBusy=0;
1165   1      }
1166          ////////////////////////End of function//////////////////////////////


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1107    ----
   CONSTANT SIZE    =    231    ----
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:07 PAGE 20  

   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     24       5
   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 + -