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

📄 usb.lst

📁 一个通过D12与计算机进行USB通信的单片机程序,开发者可以参考
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V7.20   USB                                                                   07/30/2004 10:23:30 PAGE 9   

 488   2                      single_transmit(0, 0);
 489   2              }
 490   1              else
 491   1                      stall_ep0();
 492   1      }
 493          
 494          //特性设置
 495          void set_feature(void)
 496          {
 497   1              unsigned char endp;
 498   1              unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 499   1      
 500   1              if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
 501   1              {                                                                                       //设置远程唤醒功能
 502   2                      DISABLE;
 503   2                      bEPPflags.bits.remote_wakeup = 1;
 504   2                      ENABLE;
 505   2                      single_transmit(0, 0);
 506   2              }
 507   1              else if (bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT
             -_STALL)
 508   1              {                                                                                       //设置端点stall
 509   2                      endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 510   2                      if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 511   2                              /* clear TX stall for IN on EPn. */
 512   2                              D12_SetEndpointStatus(endp*2 + 1, 1);
 513   2                      else
 514   2                              /* clear RX stall for OUT on EPn. */
 515   2                              D12_SetEndpointStatus(endp*2, 1);
 516   2                      single_transmit(0, 0);
 517   2              }
 518   1              else
 519   1                      stall_ep0();
 520   1      }
 521          
 522          //设置地址
 523          void set_address(void)
 524          {
 525   1              D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK), 1);
 526   1              single_transmit(0, 0);
 527   1      }
 528          
 529          //获取描述符
 530          void get_descriptor(void)
 531          {
 532   1              unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
 533   1              if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
 534   1              {                                                                                       //获取设备描述符
 535   2                      code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
 536   2              }
 537   1              else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
 538   1              {                                                                                       //获取配置描述符
 539   2                      code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
 540   2              }
 541   1              else
 542   1                      stall_ep0();
 543   1      }
 544          //获取配置状态
 545          void get_configuration(void)
 546          {
 547   1              unsigned char c = bEPPflags.bits.configuration;
 548   1              single_transmit(&c, 1);
C51 COMPILER V7.20   USB                                                                   07/30/2004 10:23:30 PAGE 10  

 549   1      }
 550          
 551          //设置配置状态
 552          void set_configuration(void)
 553          {
 554   1              if (ControlData.DeviceRequest.wValue == 0)
 555   1              {
 556   2                      //设备进入未配置状态
 557   2                      single_transmit(0, 0);
 558   2                      DISABLE;
 559   2                      bEPPflags.bits.configuration = 0;
 560   2                      ENABLE;
 561   2                      init_unconfig();
 562   2              }
 563   1              else if (ControlData.DeviceRequest.wValue == 1)
 564   1              {
 565   2                      //配置设备
 566   2                      single_transmit(0, 0);
 567   2                      
 568   2                      init_unconfig();
 569   2                      init_config();
 570   2                      DISABLE;
 571   2                      bEPPflags.bits.configuration = 1;
 572   2                      ENABLE;
 573   2              }
 574   1              else
 575   1                      stall_ep0();
 576   1      }
 577          
 578          //获取接口状态
 579          void get_interface(void)
 580          {
 581   1              unsigned char txdat = 0;        /* Only/Current interface = 0 */
 582   1              single_transmit(&txdat, 1);
 583   1      }
 584          
 585          //设置接口状态
 586          void set_interface(void)
 587          {
 588   1              if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)     single_transmit(0, 0)
             -;
 589   1              else
 590   1                      stall_ep0();
 591   1      }
 592          
 593          //设置地址使能
 594          void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)
 595          {
 596   1              if(bEPPflags.bits.in_isr == 0)  DISABLE;
 597   1              outportb(D12_COMMAND, 0xD0);                    //输出指令
 598   1              if(bEnable)     bAddress |= 0x80;
 599   1              outportb(D12_DATA, bAddress);                   //设置地址
 600   1              if(bEPPflags.bits.in_isr == 0)  ENABLE;
 601   1      }
 602          
 603          //设置端点使能
 604          void D12_SetEndpointEnable(unsigned char bEnable)
 605          {
 606   1              if(bEPPflags.bits.in_isr == 0)
 607   1                      DISABLE;
 608   1      
 609   1              outportb(D12_COMMAND, 0xD8);//输出指令
C51 COMPILER V7.20   USB                                                                   07/30/2004 10:23:30 PAGE 11  

 610   1              if(bEnable)
 611   1                      outportb(D12_DATA, 1);//设置端点允许
 612   1              else
 613   1                      outportb(D12_DATA, 0);//设置端点禁止
 614   1      
 615   1              if(bEPPflags.bits.in_isr == 0)
 616   1                      ENABLE;
 617   1      }
 618          
 619          //模式设置
 620          void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
 621          {
 622   1              if(bEPPflags.bits.in_isr == 0)
 623   1                      DISABLE;
 624   1              outportb(D12_COMMAND, 0xF3);//设置模式
 625   1              outportb(D12_DATA, bConfig);
 626   1              outportb(D12_DATA, bClkDiv);
 627   1              if(bEPPflags.bits.in_isr == 0)
 628   1                      ENABLE;
 629   1      }
 630          
 631          //DMA工作方式设置
 632          void D12_SetDMA(unsigned char bMode)
 633          {
 634   1              if(bEPPflags.bits.in_isr == 0)
 635   1                      DISABLE;
 636   1              outportb(D12_COMMAND, 0xFB);//设置DMA工作方式
 637   1              outportb(D12_DATA, bMode);
 638   1              if(bEPPflags.bits.in_isr == 0)
 639   1                      ENABLE;
 640   1      }
 641          
 642          //读取中断寄存器
 643          unsigned short D12_ReadInterruptRegister(void)
 644          {
 645   1              unsigned char b1;
 646   1              unsigned int j;
 647   1              outportb(D12_COMMAND, 0xF4);//读取中断寄存器
 648   1              b1 = inportb(D12_DATA);
 649   1              j = inportb(D12_DATA);
 650   1              j <<= 8;
 651   1              j += b1;
 652   1              return j;
 653   1      }
 654          
 655          //端点选择
 656          unsigned char D12_SelectEndpoint(unsigned char bEndp)
 657          {
 658   1              unsigned char c;
 659   1              if(bEPPflags.bits.in_isr == 0)
 660   1                      DISABLE;
 661   1              outportb(D12_COMMAND, bEndp);   //端点选择
 662   1              c = inportb(D12_DATA);
 663   1              if(bEPPflags.bits.in_isr == 0)
 664   1                      ENABLE;
 665   1              return c;
 666   1      }
 667          
 668          //读取最后传输状态
 669          unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
 670          {
 671   1              outportb(D12_COMMAND, 0x40 + bEndp);//返回最后传输状态
C51 COMPILER V7.20   USB                                                                   07/30/2004 10:23:30 PAGE 12  

 672   1              return inportb(D12_DATA);
 673   1      }
 674          
 675          //读取端点状态
 676          unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
 677          {
 678   1              unsigned char c;
 679   1              if(bEPPflags.bits.in_isr == 0)
 680   1                      DISABLE;
 681   1              outportb(D12_COMMAND, 0x80 + bEndp);//读取端点状态
 682   1              c = inportb(D12_DATA);
 683   1              if(bEPPflags.bits.in_isr == 0)
 684   1                      ENABLE;
 685   1              return c;
 686   1      }
 687          
 688          //设置端点状态
 689          void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
 690          {
 691   1              if(bEPPflags.bits.in_isr == 0)
 692   1                      DISABLE;
 693   1      
 694   1              outportb(D12_COMMAND, 0x40 + bEndp);//设置端点状态
 695   1              outportb(D12_DATA, bStalled);
 696   1      
 697   1              if(bEPPflags.bits.in_isr == 0)
 698   1                      ENABLE;
 699   1      }
 700          
 701          //传输恢复
 702          void D12_SendResume(void)
 703          {
 704   1              outportb(D12_COMMAND, 0xF6);//设置发送恢复
 705   1      }
 706          
 707          //读取当前帧号
 708          unsigned short D12_ReadCurrentFrameNumber(void)
 709          {
 710   1              unsigned short i,j;
 711   1      
 712   1              if(bEPPflags.bits.in_isr == 0)
 713   1                      DISABLE;
 714   1      
 715   1              outportb(D12_COMMAND, 0xF5);//读取当前帧数目
 716   1              i= inportb(D12_DATA);
 717   1              j = inportb(D12_DATA);
 718   1              i += (j<<8);
 719   1      
 720   1              if(bEPPflags.bits.in_isr == 0)
 721   1                      ENABLE;
 722   1      
 723   1              return i;
 724   1      }
 725          
 726          unsigned short D12_ReadChipID(void)
 727          {
 728   1              unsigned short i,j;
 729   1      
 730   1              if(bEPPflags.bits.in_isr == 0)
 731   1                      DISABLE;
 732   1      
 733   1              outportb(D12_COMMAND, 0xFD);

⌨️ 快捷键说明

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