USB 设备枚举 三大主机厂没有发获取 厂商描述符?

这个可能是主板内部hub中的某一个usb设备功能异常,你可以把这个设备卸载掉,然后重新扫描看看是否能解决。出现这个问题就是说有D+的数据线被外部电源拉高了,然后usb检测到有设备挂载进行枚举,然后设备没有相应主机的枚举过程,就出现了这个错误。

  首先,我们来看看usb的工作过程。

0)传送到主机的。获取各种描述信息后,操作系统会为其配置相应的资源。这样主机就可以与设备之间进行通信了。

  usb通讯有四种通讯方式控制(control)、中断(interrupt)、批量(bulk)和同步( synchronous)。usb通讯是通过管道(pipe)实现的。管道是一个抽象的概念,指的是主机与设备之间通讯的虚拟链路。不如说一个usb通讯 主机A和设备B,其中有bulk in(批量输入)、bulk out(批量输出)、control out(控制输出)三种通讯方式,那么A与B之间的通讯管道就有三个。(这里明确一个概念,在usb通信中数据流向都是相对设备来说的,in表示设备向主 机传送数据,out表示表示主机箱设备传输数据)。在设备一端,每个管道对应一个端点,端点配置相关的寄存器和缓冲区。在通讯之前需对端点进行相关设置。 在通信中,只需向缓冲写或读数据,并置位相关比特位即可。

  下面具体从usb的中断输入输出来讲述基于keil C mdk开发环境的stm32的USB接口单片机程序设计。值得一提的是,st或相关公司给我们提供许多封装函数和相关例子,我们可以根据其中的例子并进行修改即可实现我们自己需要的usb通讯程序。

  1.usb描述符配置

  从上面的讲述可以看出,usb描述符是usb通讯的前提。主机必须先了解设备后才能与其进行通讯。在st提供的例子中,描述符都在usb_des.c文件进行定义,下面就其中的Joystick例子说明usb描述负的配置。

  0x40, /*最大数据包大小为64字节(对于端点0而言)*/

  设备描述符两个重要参数是生产商ID和产品ID,主机将根据以上两个ID为设备选择相应驱动程序。在我们的应用中,我们一般只需修改例子中的这儿两个参数即可完成设备描述符的设置。

  0x00, /*描述该配置的字符串的索引值*/

  0, /*接口描述符索引值*/

  配置描述符中包括了接口、端点的配置。如果设备为HID设备,在配置描述符中还应加入HID描述,具体描述可以参照Joystick例子的配置。

  还有一些其他配置可以参可相关资料与例子加以理解。

2、USB通讯的执行过程。

USB_LP_CAN_RX0_IRQHandler。在这个函数中继续调用USB_Istr()函数,这个函数是usb通讯的关键。它接收到主机命令, 指派调度相应函数进行处理。对于这一点,详细过程我现在还不是很明白。如果以后搞懂了再补述。

  当USB设备接入主机时,主机要枚举该USB设备,他将要求USB设备提供自身相关信息,这是通过endpoint0实现的。endpoint0是 一个特殊的端点,每一个接口(interface)必须有endpoint0。一般情况下,我们需要使用多个端点(如前所述,配置描述符定义了端点的数 目、类型、传输数据大小等)。在使用端点前需对端点进行初始化。这个过程在usb_prop.c文件中的xxx_reset()函数定义。如我定义端点1 的两种传输方式:

  在定义完端点后,我们就可以使用端点进行数据传输了。

  向主机输入数据(in):IN传输过程是

  1.向缓冲区填入数据;

  2.设定USB数据计数器:

  3.设置USB输出有效。

  注意一般情况下,端点的输入输出缓冲区地址没有定义,须在usb_conf.h中定义具体定义可以参考端点0的定义。

  读从主机输出的数据(out):out传输过程是

  1.定义out回调函数;

  2.从缓冲区读出数据:

  3.设置USB输入有效。

  总结,在此将stm32芯片的usb通讯进行了简单的阐述。本人水平有限,以上难免会有错误,希望大家积极留言,共同探讨,共同进步。这篇文章是断 断续续写的,给大家带来不便,在此向大家道歉了。不管怎样希望这篇文章能够对那些还在对stm32usb编程初步摸索的朋友有一点帮助。

我要回帖

更多关于 电脑厂商 的文章

 

随机推荐