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

📄 usb_main.lst

📁 PDIUSBD12与51接口的固件KEIL6.23调试通过
💻 LST
📖 第 1 页 / 共 5 页
字号:
 528   1                      outportdata(0);
 529   1      
 530   1              if(bEPPflags.bits.in_isr == 0)
 531   1                      ENABLE;
 532   1      }
 533          
 534          void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
 535          {
 536   1              if(bEPPflags.bits.in_isr == 0)
 537   1                      DISABLE;
 538   1              outportcmd(0xF3);
 539   1              outportdata(bConfig);
 540   1              outportdata(bClkDiv);
 541   1              if(bEPPflags.bits.in_isr == 0)
 542   1                      ENABLE;
 543   1      
 544   1      }
 545          
 546          void D12_SetDMA(unsigned char bMode)
 547          {
 548   1      
 549   1              if(bEPPflags.bits.in_isr == 0)
 550   1                      DISABLE;
 551   1              outportcmd(0xFB);
C51 COMPILER V6.23a  USB_MAIN                                                              12/24/2005 14:35:50 PAGE 10  

 552   1              outportdata(bMode);
 553   1              if(bEPPflags.bits.in_isr == 0)
 554   1                      ENABLE;
 555   1      
 556   1      }
 557          
 558          //unsigned char D12_GetDMA(void)
 559          //{
 560          // outportcmd(0xFB);
 561          // return(inportb());
 562          //}
 563          /*
 564          unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
 565          {
 566                  unsigned char c;
 567          
 568                  if(bEPPflags.bits.in_isr == 0)
 569                          DISABLE;
 570          
 571                  outportcmd(0x80 + bEndp);
 572                  c = inportb();
 573          
 574                  if(bEPPflags.bits.in_isr == 0)
 575                          ENABLE;
 576          
 577                  return c;
 578          }
 579          */
 580          void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
 581          {
 582   1              if(bEPPflags.bits.in_isr == 0)
 583   1                      DISABLE;
 584   1      
 585   1              outportcmd(0x40 + bEndp);
 586   1              outportdata(bStalled);
 587   1      
 588   1              if(bEPPflags.bits.in_isr == 0)
 589   1                      ENABLE;
 590   1      }
 591          
 592          
 593          
 594          //void D12_SendResume(void)
 595          //{
 596          // outportcmd(0xF6);
 597          //}
 598          
 599          
 600          unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
 601          {
 602   1              unsigned char i;
 603   1      
 604   1              if(bEPPflags.bits.in_isr == 0)
 605   1                      DISABLE;
 606   1              //---------------------
 607   1              outportcmd(endp);       //选择端点
 608   1              inportb();              //读入满/空状态
 609   1      
 610   1              outportcmd(0xF0);       //写缓冲区命令
 611   1              outportdata(0);
 612   1              outportdata(len);
 613   1      
C51 COMPILER V6.23a  USB_MAIN                                                              12/24/2005 14:35:50 PAGE 11  

 614   1              for(i=0; i<len; i++)
 615   1                      outportdata(*(buf+i));
 616   1      
 617   1              outportcmd(0xFA);       //驶购冲区有效
 618   1      
 619   1              //--------------------------------
 620   1              if(bEPPflags.bits.in_isr == 0)
 621   1                      ENABLE;
 622   1      
 623   1              return len;
 624   1      }
 625          void D12_AcknowledgeEndpoint(unsigned char endp)
 626          {
 627   1              outportcmd( endp);      //选择端点
 628   1              outportcmd(0xF1);       //应答设置
 629   1              if(endp == 0)
 630   1                      outportcmd(0xF2);       //缓冲区清零
 631   1      }
 632          unsigned char D12_ReadInterruptRegister(void)
 633          {
 634   1              unsigned char b1;
 635   1              unsigned int j;
 636   1              j=0;
 637   1              //outportb(D12_COMMAND, 0xF4);
 638   1              outportcmd(0xF4);
 639   1              b1 = inportb();
 640   1              j = inportb();
 641   1              return b1;
 642   1              //j = inportb();
 643   1              //j <<= 8;
 644   1              //j += b1;
 645   1              //return j;
 646   1      }
 647          
 648          unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
 649          {
 650   1              //outportb(D12_COMMAND, 0x40 + bEndp);
 651   1              outportcmd(0x40 + bEndp);
 652   1              return inportb();
 653   1      }
 654          unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
 655          {
 656   1              unsigned char i, j;
 657   1      
 658   1              if(bEPPflags.bits.in_isr == 0)
 659   1                      DISABLE;
 660   1              //--------------------------------
 661   1              outportcmd(endp);                       //选择端点
 662   1              if((inportb() & D12_FULLEMPTY) == 0) {  //如果缓冲区为空,则返回
 663   2                      if(bEPPflags.bits.in_isr == 0)
 664   2                              ENABLE;
 665   2                      return 0;
 666   2              }
 667   1      
 668   1              outportcmd(0xF0);                       //读缓冲区
 669   1              j = inportb();
 670   1              j = inportb();
 671   1      
 672   1              if(j > len)
 673   1                      j = len;
 674   1      
 675   1              for(i=0; i<j; i++)
C51 COMPILER V6.23a  USB_MAIN                                                              12/24/2005 14:35:50 PAGE 12  

 676   1                      *(buf+i) = inportb();
 677   1      
 678   1              outportcmd(0xF2);                               //缓冲区清空
 679   1              //-------------------------------
 680   1              if(bEPPflags.bits.in_isr == 0)
 681   1                      ENABLE;
 682   1      
 683   1              return j;
 684   1      }
 685          
 686          unsigned char D12_SelectEndpoint(unsigned char bEndp)
 687          {
 688   1              unsigned char c;
 689   1      
 690   1              if(bEPPflags.bits.in_isr == 0)
 691   1                      DISABLE;
 692   1      
 693   1              outportcmd(bEndp);
 694   1              c = inportb();
 695   1      
 696   1              if(bEPPflags.bits.in_isr == 0)
 697   1                      ENABLE;
 698   1      
 699   1              return c;
 700   1      }
 701          
 702          //P57命令接口-D12CI.C  ----结束
 703          //===============================================================
 704          //===============================================================
 705          
 706          
 707          //P61中断服务程序-ISR.C
 708          //===============================================================
 709          //===============================================================
 710          
 711          
 712          void bus_reset(void)
 713          {
 714   1      }
 715          //void dma_eot(void)
 716          //{
 717          //}
 718          //---------------------------------
 719          void ep0_rxdone(void)
 720          {
 721   1              unsigned char ep_last, i;
 722   1      
 723   1              ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag
 724   1              if (ep_last & D12_SETUPPACKET) {
 725   2      
 726   2                      ControlData.wLength = 0;
 727   2                      ControlData.wCount = 0;
 728   2              //判断端点是否满,如是,则取出
 729   2                      if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
 730   2                              (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
 731   3      
 732   3                              D12_SetEndpointStatus(0, 1);
 733   3                              D12_SetEndpointStatus(1, 1);
 734   3                              bEPPflags.bits.control_state = USB_IDLE;
 735   3      
 736   3                              return;
 737   3                      }
C51 COMPILER V6.23a  USB_MAIN                                                              12/24/2005 14:35:50 PAGE 13  

 738   2      
 739   2                      ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
 740   2                      ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
 741   2                      ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
 742   2      
 743   2                      // Acknowledge setup here to unlock in/out endp
 744   2              //向控制输出端点发送应答建立命令以重新使能下一个建立阶段
 745   2                      D12_AcknowledgeEndpoint(0);
 746   2                      D12_AcknowledgeEndpoint(1);
 747   2      
 748   2                      ControlData.wLength = ControlData.DeviceRequest.wLength;
 749   2                      ControlData.wCount = 0;
 750   2              //需要证实控制传输是控制读还是写,如果是读:
 751   2              //如果控制传输是一个控制读类型那就是说器件需要在下一个数据阶段向
 752   2              //主机发回数据包.MCU需要设置一个标志以指示USB 设备现在正处于传输
 753   2              //模式即准备在主机发送请求时发送数据
 754   2      
 755   2                      if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
 756   3                              bEPPflags.bits.setup_packet = 1;
 757   3                              bEPPflags.bits.control_state = USB_IDLE;                /* get command */
 758   3                          }
 759   2              //如果是写
 760   2                      else {
 761   3                              if (ControlData.DeviceRequest.wLength == 0) {
 762   4                                      bEPPflags.bits.setup_packet = 1;
 763   4                                      bEPPflags.bits.control_state = USB_IDLE;                /* set command */
 764   4                                   }
 765   3                              else {
 766   4                                      if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
 767   5                                              bEPPflags.bits.control_state = USB_IDLE;
 768   5                                              D12_SetEndpointStatus(0, 1);
 769   5                                              D12_SetEndpointStatus(1, 1);
 770   5                                              }
 771   4                                      else {
 772   5                                              bEPPflags.bits.control_state = USB_RECEIVE;     /* set command with OUT token */
 773   5                                            }
 774   4                                   } // set command with data
 775   3                            } // else set command
 776   2                 } // if setup packet
 777   1      
 778   1              else if (bEPPflags.bits.control_state == USB_RECEIVE) {
 779   2                      i =     D12_ReadEndpoint(0, EP0_PACKET_SIZE,
 780   2                              ControlData.dataBuffer + ControlData.wCount);
 781   2      
 782   2                      ControlData.wCount += i;
 783   2                      if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
 784   3                              bEPPflags.bits.setup_packet = 1;
 785   3                              bEPPflags.bits.control_state = USB_IDLE;
 786   3                      }
 787   2              }
 788   1      
 789   1              else {
 790   2                      bEPPflags.bits.control_state = USB_IDLE;
 791   2              }
 792   1      
 793   1      }
 794          //----------------------------------
 795          void ep0_txdone(void)

⌨️ 快捷键说明

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