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

📄 chap_9.lst

📁 该代码是基于菲利普ISP1581USB接口芯片与STC89C51单片机的USB2.0开发代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
 211   1              //读取请求号
 212   1              USB_Device_Request.bRequest = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 213   1              //读取16bit请求数据
 214   1              USB_Device_Request.wValue = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 215   1              USB_Device_Request.wValue <<= 8;
 216   1              USB_Device_Request.wValue |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 217   1              //读取16bit请求索引
 218   1              USB_Device_Request.wIndex = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 219   1              USB_Device_Request.wIndex <<= 8;
 220   1              USB_Device_Request.wIndex |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 221   1              //读取16bit长度
 222   1              USB_Device_Request.wLength = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 223   1              USB_Device_Request.wLength <<= 8;
 224   1              USB_Device_Request.wLength |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 225   1              
 226   1              //长度处理(高低8位对调)
 227   1              Temp = USB_Device_Request.wLength;
 228   1              USB_Device_Request.wLength = 0;
 229   1              USB_Device_Request.wLength = (UC) Temp;
 230   1              USB_Device_Request.wLength <<= 8;
 231   1              Temp >>= 8;
 232   1              USB_Device_Request.wLength |= Temp;
 233   1              
 234   1              type = USB_Device_Request.bmRequestType & 0x60;
 235   1              req = USB_Device_Request.bRequest & 0x0f;
 236   1      
 237   1              //厂商请求
 238   1              if (type == 0x40)
 239   1              {
 240   2                      Vendor_Specific_Command();//厂商请求处理
C51 COMPILER V7.50   CHAP_9                                                                10/30/2007 16:17:28 PAGE 5   

 241   2              }
 242   1              else if (type == 0x00)
 243   1                      (*StandardDeviceRequest[req])();//调用标准请求
 244   1      }
 245          
 246          
 247          //厂商请求处理
 248          void Vendor_Specific_Command(void)
 249          {
 250   1              if(USB_Device_Request.bRequest == 0x0C)
 251   1              {
 252   2                      switch (USB_Device_Request.wIndex)
 253   2                      {
 254   3                      case GET_FIRMWARE_VERSION  ://获取固件版本
 255   3                              if(USB_Device_Request.wLength == 1)
 256   3                              {
 257   4                                      //选择端点1
 258   4                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 259   4                                      //设置数据长度为1B
 260   4                                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 1;
 261   4                                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
 262   4                                      //发送0x21版本号
 263   4                                      D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x21;//版本号
 264   4                                      wait_ep0tx();
 265   4                                      ep0out_ack();
 266   4                                      break;
 267   4                              }
 268   3                              
 269   3                      case SETUP_DMA_REQUEST :
 270   3                              //回复请求
 271   3                              wait_ep0rx();
 272   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
 273   3                              //
 274   3                              FileSize.Size.Address[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 275   3                              FileSize.Size.Address[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 276   3                              FileSize.Size.Address[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 277   3                              //读取传输字节数
 278   3                              Temp = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 279   3                              bytecount = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 280   3                              bytecount <<= 8;
 281   3                              bytecount |= Temp;
 282   3                              //读取传输方式
 283   3                              FileSize.Size.DIR = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 284   3                              ep0in_ack();
 285   3                              Kernel_Flag.BITS.Transfer_Start = 1;//标志传输数据开始
 286   3                              break;
 287   3                              
 288   3                      default :
 289   3                              if(USB_Device_Request.bmRequestType == 0xC0)
 290   3                              {
 291   4                                      ep0in_ack();
 292   4                                      break;                          
 293   4                              }
 294   3                              if(USB_Device_Request.bmRequestType == 0x40)
 295   3                              {       
 296   4                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
 297   4                                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
 298   4                                      while(!USB_Int_Flag.BITS.EP0SETUP)
 299   4                                      {
 300   5                                              //读取ISP1581中断寄存器
 301   5                                              USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
 302   5                                              //回写ISP1581中断寄存器
C51 COMPILER V7.50   CHAP_9                                                                10/30/2007 16:17:28 PAGE 6   

 303   5                                              D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
 304   5                                              if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
 305   5                                                      return;
 306   5                                      }
 307   4                                      USB_Int_Flag.BITS.EP0TX = 0;
 308   4                                      break;                          
 309   4                              }
 310   3                      }
 311   2              }
 312   1      }
 313          
 314          
 315          
 316          //保留函数
 317          void  reserved(void)
 318          {
 319   1      
 320   1      }
 321          
 322          
 323          //Get_Descriptor()获取描述符
 324          void get_descriptor(void)
 325          {
 326   1      
 327   1              switch(USB_Device_Request.wValue)
 328   1              {
 329   2              case  1://设备描述符
 330   2                      //选择描述符
 331   2                      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
 332   2                              Descriptor_Ptr = &Standard_Device_Descriptor[0];        //set pointer to device descriptor
 333   2                      if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
 334   2                              Descriptor_Ptr = &HS_Device_Descriptor[0];      //set pointer to device descriptor
 335   2                      count = *Descriptor_Ptr;                                                        //read in descriptor length
 336   2                      //选择端点号
 337   2                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 338   2                      //写下发送字节数
 339   2                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 0x12;
 340   2                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
 341   2                      //send descriptor
 342   2                      //发送描述符
 343   2                      while(count != 0)
 344   2                      {
 345   3                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 346   3                              count--;
 347   3                              Descriptor_Ptr++;
 348   3                      }
 349   2                      wait_ep0tx();
 350   2                      ep0out_ack();
 351   2                      break;
 352   2                      
 353   2              case  2        :  //获取配置描述符
 354   2                      USB_Int_Flag.BITS.EP0RX = 0;
 355   2                      Temp = 64;
 356   2                      Descriptor_Ptr = &Standard_Config_Descriptor[0];        //set pointer to configuration descriptor
 357   2                      count = *Descriptor_Ptr;                                                        //get configuration Descriptor length
 358   2                      //选择端点号1
 359   2                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 360   2                      //check if only configuration descriptor required
 361   2                      //检查描述符长度,决定是只发送配置描述符还是描述符集合
 362   2                      if(count >= USB_Device_Request.wLength)                         //Send only Configuration descriptor
 363   2                      {
 364   3                              //写入发送字节数
C51 COMPILER V7.50   CHAP_9                                                                10/30/2007 16:17:28 PAGE 7   

 365   3                              D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = (UC) USB_Device_Request.wLength;
 366   3                              D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = (UC) (USB_Device_Request.wLength >> 8);
 367   3                              //send descriptor
 368   3                              //发送描述符
 369   3                              for(count = 0 ; count < USB_Device_Request.wLength ; count++)
 370   3                              {
 371   4                                      D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 372   4                                      Descriptor_Ptr++;
 373   4                              }
 374   3                              wait_ep0tx();
 375   3                              ep0out_ack();
 376   3                      }
 377   2                      else //send Configuration,Interface and Endpoint descriptor
 378   2                      {
 379   3                              //发送描述符集合(配置+接口+端点)
 380   3                              if(USB_Device_Request.wLength >= 32)
 381   3                              {
 382   4                                      //写入配置描述符
 383   4                                      while(count != 0)
 384   4                                      {
 385   5                                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 386   5                                              count--;
 387   5                                              Descriptor_Ptr++;
 388   5                                      }
 389   4                                      //选择高速还是全速接口描述符
 390   4                                      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
 391   4                                              Descriptor_Ptr = &Bulk_Interface_Descriptor[0]; //set pointer to interface descriptor
 392   4                                      if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
 393   4                                              Descriptor_Ptr = &HS_Bulk_Interface_Descriptor[0]; //set pointer to interface descriptor
 394   4                                      count = *Descriptor_Ptr;        //get the descriptor count
 395   4                                      //写入接口描述符
 396   4                                      while(count != 0)
 397   4                                      {
 398   5                                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 399   5                                              count--;
 400   5                                              Descriptor_Ptr++;
 401   5                                      }
 402   4                                      //选择高速还是全速端点1IN描述符
 403   4                                      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
 404   4                                              Descriptor_Ptr = &Int_In_Descriptor[0]; //set pointer to interface descriptor
 405   4                                      if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
 406   4                                              Descriptor_Ptr = &HS_Int_In_Descriptor[0]; //set pointer to interface descriptor
 407   4                                      count = *Descriptor_Ptr;        //read in descriptor length
 408   4                                      //写入端点1IN描述符
 409   4                                      while(count != 0)
 410   4                                      {
 411   5                                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 412   5                                              count--;
 413   5                                              Descriptor_Ptr++;
 414   5                                      }
 415   4                                      //选择高速还是全速端点1OUT描述符
 416   4                                      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
 417   4                                              Descriptor_Ptr = &Int_Out_Descriptor[0]; //set pointer to interface descriptor
 418   4                                      if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
 419   4                                              Descriptor_Ptr = &HS_Int_Out_Descriptor[0]; //set pointer to interface descriptor
 420   4                                      count = *Descriptor_Ptr;        //read in descriptor length
 421   4                                      //写入端点1OUT描述符
 422   4                                      while(count != 0)
 423   4                                      {
 424   5                                              D14_Cntrl_Reg.D14_DATA_PORT_LSB = *Descriptor_Ptr;
 425   5                                              count--;
 426   5                                              Descriptor_Ptr++;
C51 COMPILER V7.50   CHAP_9                                                                10/30/2007 16:17:28 PAGE 8   

 427   5                                      }
 428   4                                      //选择高速还是全速端点2IN描述符

⌨️ 快捷键说明

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