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

📄 usb2uart.lst

📁 通过c语言实现将USB接口转换成串行接口
💻 LST
📖 第 1 页 / 共 5 页
字号:
 762   4                                  Control_Data.wCount=ManufacturerString[0];
 763   4                      Control_Data.pData=ManufacturerString;
 764   4                                  break;
 765   4      
 766   4                                 case 2:
 767   4                                 #ifdef debug
                                          Prints("            获取产品字符串.\r\n");
                                         #endif
 770   4                                  Control_Data.wCount=ProducterString[0];
 771   4                      Control_Data.pData=ProducterString;
 772   4                                  break;
 773   4      
 774   4                                 case 3:
 775   4                                 #ifdef debug
                               Prints("            获取设备序列号.\r\n");
                                         #endif
 778   4                                   Control_Data.wCount=device_serial_number[0];
 779   4                                   Control_Data.pData=device_serial_number;
 780   4                                 break;
 781   4      
 782   4                                 default:
 783   4                       Prints("            其它描述符(未知),描述符编码:");
 784   4                                       PrintHex(MSB(Control_Data.DeviceRequest.wValue));
 785   4                                       Prints("\r\n");
 786   4                       DispLineInf();
 787   4                     break;
 788   4                                }
 789   3                               break;
 790   3                       default:
 791   3                           Prints("       获取其它描述符..................描述符索引为:");
 792   3                               PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
 793   3                               Prints("\r\n"); 
 794   3                               DispLineInf();
 795   3                        break;
 796   3                      }
 797   2            if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
 798   2               }
C51 COMPILER V7.06   USB2UART                                                              12/11/2007 01:02:42 PAGE 14  

 799   1              //写数据到D12输入端点
 800   1          if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
 801   1           {
 802   2                write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
 803   2                Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
 804   2            Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
 805   2                if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
 806   2                 else usb_flags.flags.usb_endp0_in=0;
 807   2                return;
 808   2               }
 809   1          else
 810   1           {
 811   2                write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
 812   2            usb_flags.flags.setup_packet_in=0;
 813   2                usb_flags.flags.usb_endp0_in=0;
 814   2                return;
 815   2               }      
 816   1      }
 817          /******************************************************************************/
 818          
 819          /*********************发到接口的获取描述符**************************************/
 820          void get_descriptor_interface(void)
 821          {
 822   1      #ifdef debug
               Prints("    获取描述符(从接口).\r\n");
              #endif
 825   1        if(!usb_flags.flags.not_end)
 826   1           {
 827   2            switch(MSB(Control_Data.DeviceRequest.wValue))
 828   2                 {
 829   3              case HID_DESCRIPTOR:
 830   3                          #ifdef debug
                                   Prints("        获取HID描述符.\r\n");
                                      #endif
 833   3                       Control_Data.wCount=sizeof(HID_DESCRIPTOR_STRUCT);
 834   3                       //Control_Data.pData=(uint8 *)(&hid_descriptor);
 835   3                   break;
 836   3              case REPORT_DESCRIPTOR:
 837   3                          #ifdef debug
                                       Prints("        获取报告描述符.\r\n");
                                      #endif
 840   3                   break;
 841   3                      case PHYSICAL_DESCRIPTOR:
 842   3                          #ifdef debug
                                   Prints("        获取物理描述符.\r\n");
                                      #endif
 845   3                               break;
 846   3                       default:
 847   3                           Prints("       获取其它描述符..................描述符索引为:");
 848   3                               PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
 849   3                               Prints("\r\n");
 850   3                               DispLineInf();
 851   3                        break;
 852   3                      }
 853   2            if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
 854   2               }
 855   1              //写数据到D12输入端点
 856   1          if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
 857   1           {
 858   2                write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
 859   2                Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
 860   2            Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
C51 COMPILER V7.06   USB2UART                                                              12/11/2007 01:02:42 PAGE 15  

 861   2                if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
 862   2                 else usb_flags.flags.usb_endp0_in=0;
 863   2                return;
 864   2               }
 865   1          else
 866   1           {
 867   2                write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
 868   2            usb_flags.flags.setup_packet_in=0;
 869   2                usb_flags.flags.usb_endp0_in=0;
 870   2                return;
 871   2               }      
 872   1      }
 873          /******************************************************************************/
 874          
 875          //#define debug3
 876          /***************设置串口的数据阶段*********************************/
 877          void SetLineCodingD(void)
 878          {
 879   1      #ifdef debug3
               Prints("设置串口属性数据阶段");
              #endif
 882   1       read_endpoint_buff(0,7,(uint8*)&LineCoding);  //读出7字节的控制值
 883   1       LineCoding.dwDTERate=SWAP32(SetUartBitRate(SWAP32(LineCoding.dwDTERate)));  //设置波特率
 884   1       LineCoding.bCharFormat=0;           //1位停止位
 885   1       LineCoding.bParityType=0;           //无校验位
 886   1       LineCoding.bDataBits=8;             //8位数据格式
 887   1      }
 888          /*******************************************************************/
 889          
 890          //#define debug1
 891          /************************终端点0输出中断处理************************************/
 892          void endp0_out(void)
 893          {
 894   1      #ifdef debug1
               Prints("ep0 out status,last-status,status: ");
               PrintHex(read_endpoint_status(0));
              #endif
 898   1       Last_Status.Register=read_last_status(0);
 899   1      #ifdef debug1
               PrintHex(Last_Status.Register);
               PrintHex(read_endpoint_status(0));
               Prints("\r\n");
              #endif
 904   1      
 905   1       if(Last_Status.Status.setup_packet) //setup包 
 906   1       {
 907   2        Control_Data.wLength=0;
 908   2        Control_Data.wCount=0;
 909   2        if(read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(uint8 *)(&(Control_Data.DeviceRequest)))!=si
             -zeof(REQUESTCMD))
 910   2        {
 911   3         set_endpoint_status(0,0);
 912   3         set_endpoint_status(1,0);
 913   3         return;
 914   3        }
 915   2        Control_Data.DeviceRequest.wValue=SWAP16(Control_Data.DeviceRequest.wValue);
 916   2        Control_Data.DeviceRequest.wIndex=SWAP16(Control_Data.DeviceRequest.wIndex);
 917   2        Control_Data.DeviceRequest.wLength=SWAP16(Control_Data.DeviceRequest.wLength);
 918   2      
 919   2        ack_setup(0);
 920   2        ack_setup(1);
 921   2        select_endpoint(0);
C51 COMPILER V7.06   USB2UART                                                              12/11/2007 01:02:42 PAGE 16  

 922   2        clear_buffer();
 923   2        
 924   2        Control_Data.wLength=Control_Data.DeviceRequest.wLength;
 925   2        usb_flags.flags.not_end=0;
 926   2        usb_flags.flags.usb_endp0_in=1;
 927   2        if(Control_Data.DeviceRequest.bmRequestType&0x80)
 928   2        {
 929   3         usb_flags.flags.setup_packet_in=1;
 930   3         usb_flags.flags.setup_packet_out=0;
 931   3         return;
 932   3        }
 933   2        else 
 934   2        {
 935   3         usb_flags.flags.setup_packet_in=0;
 936   3         usb_flags.flags.setup_packet_out=1;
 937   3         if(Control_Data.wLength!=0)
 938   3         {
 939   4          usb_flags.flags.usb_endp0_in=0;
 940   4         }
 941   3         return;
 942   3        }
 943   2       }
 944   1       else
 945   1       {
 946   2        if(usb_flags.flags.setup_packet_out) 
 947   2        {
 948   3         usb_flags.flags.usb_endp0_in=1;
 949   3          switch(Control_Data.DeviceRequest.bmRequestType&0x60)
 950   3               {
 951   4                 case 0x00:  //标准请求
 952   4                 #ifdef debug
                         Prints("USB标准输出请求:数据阶段.\r\n");
                         #endif
 955   4                 switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
 956   4                  {
 957   5                       case 0:   //到设备
 958   5                   switch (Control_Data.DeviceRequest.bRequest)
 959   5                    {
 960   6                         case     CLEAR_FEATURE: /*ClearFeatureD(0);*/break;
 961   6                         case       SET_FEATURE: /*SetFeatureD(0);*/break;
 962   6                         case       SET_ADDRESS: /*SetUsbAddressD();*/break;          //set_address              
 963   6                         case    SET_DESCRIPTOR: /*SetDescriptorD();*/break;           //set_descriptor
 964   6                         case SET_CONFIGURATION: /*SetConfigurationD();*/ break;       //set_configurat                              
             -   
 965   6                         default: break;
 966   6                        }
 967   5                       break;
 968   5                       
 969   5                       case 1:   //到接口
 970   5                    switch (Control_Data.DeviceRequest.bRequest)
 971   5                         {
 972   6                          case CLEAR_FEATURE:  /*ClearFeatureD(1);*/break;
 973   6                          case   SET_FEATURE:  /*SetFeatureD(1);*/break;
 974   6                      case SET_INTERFACE: /*SetInterfaceD();*/break;
 975   6                          default: break;
 976   6                      }
 977   5                       break;
 978   5                       
 979   5                       case 2:   //到端点
 980   5                        switch (Control_Data.DeviceRequest.bRequest)
 981   5                         {
 982   6                          case CLEAR_FEATURE: /*ClearFeature(2);*/break;
C51 COMPILER V7.06   USB2UART                                                              12/11/2007 01:02:42 PAGE 17  

 983   6                          case   SET_FEATURE: /*SetFeature(2);*/break;
 984   6                      default: break;      
 985   6                         }
 986   5                       break;
 987   5      
 988   5                       default: break;
 989   5                  }
 990   4            break;
 991   4      
 992   4                case 0x20:  //类请求
 993   4                #ifdef debug
                    Prints("USB类输出请求:数据阶段.\r\n");
                        #endif
 996   4                 switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
 997   4                  {
 998   5                       case 0:    //接收者为设备
 999   5                   switch (Control_Data.DeviceRequest.bRequest)
1000   5                    {                           
1001   6                         default: break;
1002   6                        }
1003   5                       break;
1004   5      
1005   5                       case 1:   //接收者为接口
1006   5                    switch (Control_Data.DeviceRequest.bRequest)
1007   5                         {
1008   6                  case   SET_REPORT: /*SetReportD();*/   break; //设置报告
1009   6                  case     SET_IDLE: /*SetIdleD();*/     break; //设置空闲
1010   6                  case SET_PROTOCOL: /*SetProtocol();*/ break; //设置协议
1011   6                              case SET_CONTROL_LINE_STATE: /*SetControlLineStateD();*/ break; //设置控制线状态
1012   6                              case SET_LINE_CODING: SetLineCodingD(); break; //设置串口
1013   6                          default: break;
1014   6                      }
1015   5                       
1016   5                       break;

⌨️ 快捷键说明

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