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

📄 pdiusbd12.lst

📁 HID 设备测试程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
 474   1              return len;
 475   1      }
 476          
 477          //===============================================================================//
 478          //== 函 数 名:disconnect_usb
 479          //== 功    能:断开USB连接
 480          //== 说    明:断开后要有一100ms的延时
 481          //== 时    间:2008.8.13 创建函数
 482          //== 入口参数:无
 483          //== 返 回 值:0
 484          //===============================================================================//
 485          unsigned char disconnect_usb(void)
 486          {
 487   1              unsigned int i;
 488   1      
 489   1              #ifdef __DEBUG__        //== 打印调试信息
C51 COMPILER V7.50   PDIUSBD12                                                             11/24/2008 09:12:37 PAGE 9   

 490   1                      Print_Msg("Runing disconnect_usb()!\r\n");
 491   1              #endif
 492   1      
 493   1              #ifdef __DEBUG__        //== 打印调试信息
 494   1                      Print_Msg("     断开USB连接........................\r\n");
 495   1              #endif
 496   1      
 497   1              write_D12_command(0xf3);
 498   1              write_a_D12_data(0x0e);
 499   1              write_a_D12_data(0x47);                                         
 500   1              for (i=0; i<50000; i++);        //== 延时100ms
 501   1              return 0;
 502   1      }
 503          
 504          //===============================================================================//
 505          //== 函 数 名:connect_usb
 506          //== 功    能:连接USB
 507          //== 说    明:连接USB后并设置D12的输出时钟频率
 508          //--0xF3  设置模式 写入两个字节
 509          //--1、配置字节  D7,D6(00):端点配置 模式0:非同步模式  模式1:同步输出模式
 510          //---------------                    模式2:同步输入模式 同步输入/输出模式
 511          //---------------D5(0): 保留位
 512          //---------------D4(0): softConnect 1:VBUS可用 上行数据上拉电阻被连接
 513          //---------------D3(1): 中断模式  1:表示报告所有的错误和”NKing”并产生一个中
 514          //---------------                 0:表示只有"OK"被报告
 515          //---------------D2(1):时钟运行,1:表示在挂起状态下仍然有时钟和PLL,0表示无
 516          //---------------D1(1): 无LAZYCLOCK 1:表示CLKOUT不会切换到LazyClock
 517          //---------------                    0:表示CLKOUT在Suspend变高之后切换到LazyClock
 518          //---------------D0(0):  保留位
 519          //--2、时钟分频系数字节
 520          //---------------D7(0): SOF-ONLY中断模式
 521          //---------------1:表示仅当桢时钟的起始(SOF)时刻引起中断的产生,而不管引脚中断模式的设定
 522          //---------------D6(0):SET_TO_ONE模式
 523          //---------------D5,D4(00):    保留位
 524          //---------------D3,2,1,0(1011):N表示分频系数输出频率为48MHz/(N+1)
 525          //== 时    间:2008.8.13 创建函数
 526          //== 入口参数:无
 527          //== 返 回 值:0
 528          //===============================================================================//
 529          unsigned char connect_usb(void)
 530          {
 531   1              #ifdef __DEBUG__        //== 打印调试信息
 532   1                      Print_Msg("Runing connect_usb()!\r\n");
 533   1              #endif
 534   1      
 535   1              #ifdef __DEBUG__        //== 打印调试信息
 536   1                      Print_Msg("     连接USB...............\r\n");
 537   1              #endif
 538   1      
 539   1              write_D12_command(0xf3);                        //== 初始化USBD12
 540   1              write_a_D12_data(0x1e);                         //== 连接USB
 541   1              write_a_D12_data(0x47);                         //== 设置频率
 542   1              return 0;
 543   1      }
 544          
 545          //===============================================================================//
 546          //== 函 数 名:init_usb
 547          //== 功    能:初始化D12
 548          //== 说    明:
 549          //== 时    间:2008.8.13 创建函数
 550          //== 入口参数:无
 551          //== 返 回 值:0
C51 COMPILER V7.50   PDIUSBD12                                                             11/24/2008 09:12:37 PAGE 10  

 552          //===============================================================================//
 553          unsigned char init_usb(void)               
 554          {
 555   1              #ifdef __DEBUG__        //== 打印调试信息
 556   1                      Print_Msg("Runing init_usb()!\r\n");
 557   1              #endif
 558   1      
 559   1              #ifdef __DEBUG__        //== 打印调试信息
 560   1                      Print_Msg("     set+enable D12 address!\r\n");
 561   1              #endif
 562   1      
 563   1              set_usb_addr(0);
 564   1              set_endpoint_enable();
 565   1              return 0;
 566   1      }
 567          
 568          //===============================================================================//
 569          //== 函 数 名:D12_ReadChipID
 570          //== 功    能:读取D12版本号
 571          //== 说    明:
 572          //== 时    间:2008.8.13 创建函数
 573          //== 入口参数:无
 574          //== 返 回 值:0
 575          //===============================================================================//
 576          unsigned char D12_ReadChipID(void)
 577          {
 578   1              unsigned char Chip_ID[2];
 579   1              #ifdef __DEBUG__        //== 打印调试信息
 580   1                      Print_Msg("D12_ReadChipID()!\r\n");
 581   1              #endif
 582   1              write_D12_command(Read_ChipID);
 583   1              Chip_ID[0] = read_a_D12_data();
 584   1              Chip_ID[1] = read_a_D12_data();
 585   1              Print_Msg("     Chip_ID:");
 586   1              Print_Hex(Chip_ID, 2);
 587   1              Print_Msg("!\r\n");
 588   1              return 0;
 589   1      }
 590          //===============================================================================//
 591          //== 函 数 名:endp0_out
 592          //== 功    能:终端点0输出中断处理
 593          //== 说    明:
 594          //== 时    间:2008.8.13 创建函数
 595          //== 入口参数:无
 596          //== 返 回 值:0
 597          //===============================================================================//
 598          unsigned char endp0_out(void)
 599          {
 600   1              unsigned char i;
 601   1              #ifdef __DEBUG__        //== 打印调试信息
 602   1                      Print_Msg("Runing endp0_out()!\r\n");
 603   1              #endif
 604   1      
 605   1              D12_last_status.Register = read_last_status(0); //== 读取端点0的最后状态寄存器并清中断标志
 606   1      
 607   1              if (D12_last_status.Status.setup_packet)                //== 如果收到建立(setup)包
 608   1              {
 609   2                      Control_Data.wLength = 0;                                       //== 传输字节总数清零
 610   2                      Control_Data.wCount = 0;                                        //== 传输字节计数器清零
 611   2                      if (read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(unsigned char *)(&(Control_Data.DeviceReque
             -st))) != sizeof(REQUESTCMD))
 612   2                      {                                                                                       //== 如果从端点0读取8个字节失败
C51 COMPILER V7.50   PDIUSBD12                                                             11/24/2008 09:12:37 PAGE 11  

 613   3                              set_endpoint_status(0,0);                               //== 停止控制端点0
 614   3                              set_endpoint_status(1,0);                               //== 停止控制端点1
 615   3                              bEPPflags.bits.control_state = USB_IDLE;
 616   3                              return 1;
 617   3                      }
 618   2      
 619   2                      Print_Hex((unsigned char*)(&(Control_Data.DeviceRequest)), 8);
 620   2                      Print_Msg("!\r\n");
 621   2      
 622   2                      Control_Data.DeviceRequest.wValue = SWAP16(Control_Data.DeviceRequest.wValue);
 623   2                      Control_Data.DeviceRequest.wIndex = SWAP16(Control_Data.DeviceRequest.wIndex);
 624   2                      Control_Data.DeviceRequest.wLength = SWAP16(Control_Data.DeviceRequest.wLength);
 625   2      
 626   2                      Print_Hex((unsigned char*)(&(Control_Data.DeviceRequest)), 8);
 627   2                      Print_Msg("!\r\n");
 628   2      
 629   2                      ack_setup(0);                                                                                           //== 对控制端点0 进行建立包应答
 630   2                      ack_setup(1);                                                                                           //== 对控制端点1 进行建立包应答
 631   2      
 632   2                      Control_Data.wLength = Control_Data.DeviceRequest.wLength;      //== 取出要传输数据的总字节数
 633   2                      Control_Data.wCount = 0;                                                                        //== 传输字节计数器清零
 634   2      
 635   2                      if (Control_Data.DeviceRequest.bmRequestType&0x80)                      //== 如果控制传输是控制读取(设备到主机)
 636   2                      {
 637   3                              bEPPflags.bits.setup_packet_in = 1;                                             //== 通知处理Setup 包,get command
 638   3                              bEPPflags.bits.control_state = USB_IDLE;
 639   3                      }
 640   2                      else                                                                                                            //== 控制输出(主机到设备),不过要向主机返回一个长度为0的数据包
 641   2                      {
 642   3                              if (Control_Data.DeviceRequest.wLength == 0)                    //== set command 返回信息的字节长度是0
 643   3                              {
 644   4                                      bEPPflags.bits.setup_packet_out = 1;
 645   4                                      bEPPflags.bits.control_state = USB_IDLE;
 646   4                              }
 647   3                              else
 648   3                              {
 649   4                                      if (Control_Data.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)  //== 主机发给设备的令牌包的数据
 650   4                                      {                                                                                                                               //-- 长度不能大于8个字节
 651   5                                              bEPPflags.bits.control_state = USB_IDLE;
 652   5                                              set_endpoint_status(0,1);                                                                       //== 运行控制端点0
 653   5                                              set_endpoint_status(1,1);                                                                       //== 运行控制端点1
 654   5                                      }
 655   4                                      else
 656   4                                      {
 657   5                                              bEPPflags.bits.control_state = USB_RECEIVE;                             //== set command with OUT token
 658   5                                      }
 659   4                              }                                                                                                                                       //== set command with data
 660   3                      }                                                                                                                                               //== else set command
 661   2              }                                                                                                                                                       //== if setup packet
 662   1              else
 663   1              {
 664   2                      if (bEPPflags.bits.control_state == USB_RECEIVE)
 665   2                      {
 666   3                              i = read_endpoint_buff(0, EP0_PACKET_SIZE, Control_Data.dataBuffer + Control_Data.wCount);
 667   3                              Control_Data.wCount += i;
 668   3                              if ((i != EP0_PACKET_SIZE) || (Control_Data.wCount >= Control_Data.wLength))
 669   3                              {
 670   4                                      bEPPflags.bits.setup_packet_out = 1;
 671   4                                      bEPPflags.bits.control_state = USB_IDLE;
 672   4                              }
 673   3                      }
 674   2                      else
C51 COMPILER V7.50   PDIUSBD12                                                             11/24/2008 09:12:37 PAGE 12  

 675   2                      {
 676   3                              bEPPflags.bits.control_state = USB_IDLE;
 677   3                      }
 678   2              }
 679   1              select_endpoint(0);             //== 这是必须的
 680   1              clear_buffer();
 681   1      
 682   1              return 0;
 683   1      }
 684          
 685          //===============================================================================//
 686          //== 函 数 名:endp0_in
 687          //== 功    能:终端点0输入处理
 688          //== 说    明:
 689          //== 时    间:2008.8.13 创建函数
 690          //== 入口参数:无
 691          //== 返 回 值:0
 692          //===============================================================================//
 693          unsigned char endp0_in(void)
 694          {
 695   1              short i;
 696   1      
 697   1              #ifdef __DEBUG__        //== 打印调试信息
 698   1                      Print_Msg("Runing endp0_in()!\r\n");
 699   1              #endif
 700   1              bEPPflags.bits.usb_endp0_in = 1;
 701   1              i = Control_Data.wLength - Control_Data.wCount;
 702   1              D12_last_status.Register = read_last_status(1);         //== Clear interrupt flag
 703   1              if (bEPPflags.bits.control_state != USB_TRANSMIT)
 704   1                      return 1;
 705   1      
 706   1              if (i >= EP0_PACKET_SIZE)                                                       //== 一次没传完
 707   1              {
 708   2                      write_endpoint_buff(1, EP0_PACKET_SIZE, Control_Data.pData + Control_Data.wCount);
 709   2      
 710   2                      if (bEPPflags.bits.first_get_descriptor)
 711   2                      {
 712   3                              bEPPflags.bits.control_state = USB_IDLE;        //== 第一次传控制端点最大缓冲区的字节数就可以(在这里是16)

⌨️ 快捷键说明

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