打印

本人在ST官网上下载了STM32 的usb例程,望版主予以关注

[复制链接]
14188|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
desomond|  楼主 | 2011-6-17 09:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人在ST官网上下载了STM32 的usb例程,选择STM3210B_EVAL,device选STM32F103RB,其它没有变,下载到正立电子的开发部上,然后DEbug运行,发现有以下几个问题:
这是主函数:
int main(void)
{
  Set_System();
  Set_USBClock();
  Led_Config();
  USB_Interrupts_Config();
  USB_Init();
  while (bDeviceState != CONFIGURED);

  USB_Configured_LED();

  while (1)
  {}
}
1.枚举过程似乎只有过一次中断进入到函数  USB_Istr();为什么呢,根据usb的枚举过程,应该会发送许多次的命令来完成枚举的,为什么只有一次的中断呢?
2.虽然对枚举过程有疑问,但是,windows顺利的加载了相应的usb驱动,这是为什么呢?难道是枚举成功了吗?
3.debug运行中,按下stop,停止debug,程序一直停在 while (bDeviceState != CONFIGURED);按理难道不是应该在while(1){}循环中吗?

个人总结;本人认为是usb枚举过程并不完整,windows虽然能够加载到相应的驱动,但并不能传送数据,usb的传送管道并没有成功建立......望高人指点并寻求解决方案
沙发
香水城| | 2011-6-17 09:41 | 只看该作者
你怎么知道只有过一次中断进入到函数USB_Istr()呢?

使用特权

评论回复
板凳
desomond|  楼主 | 2011-6-17 09:43 | 只看该作者
在函数USB_Istr()设置了断点,只有一次进入,虽然断点有时候不可靠,但是这个在107的板上是用OTG USB,有多次中断中断

使用特权

评论回复
地板
香水城| | 2011-6-17 09:48 | 只看该作者
在函数USB_Istr()设置了断点,只有一次进入,虽然断点有时候不可靠,但是这个在107的板上是用OTG USB,有多次中断中断
desomond 发表于 2011-6-17 09:43


这就是问题的所在,程序在断点处停下来后,相当于中止枚举过程,PC端可不会因为你在断点处停下来也停下来等你,PC会认为设备出现故障做错误处理。

使用特权

评论回复
5
desomond|  楼主 | 2011-6-17 09:57 | 只看该作者
很认同版主的观点,我在USB_Istr()处设置断点的原因是想查看一下它的枚举的过程,看usb设备是否有返回正确的数据给host,若是正常的过程应该会首先获取数据包的长度;分配地址;主机向新地址发送Get_Device_Descriptor命令,此次读取其设备描述符的全部字段,以了解该设备的总体信息,如VID,PID;主机向设备循环发送Get_Device_Configuration命令;主机发送Get_Device_String命令..........这个过程应该会有很多个中断发生在USB_Istr(),可问题是只有一次,这也是一个疑惑.........
另外,即使枚举过程没有问题,可是下载到开发板上,程序一直停在while (bDeviceState != CONFIGURED);那是不是说明枚举有问题呢

使用特权

评论回复
6
香水城| | 2011-6-17 10:07 | 只看该作者
前面不是说了吗,中断只发生一次是因为PC端中止了枚举过程,既然已经中止,即PC不再继续与设备通信,你怎么可能有更多的中断呢?

使用特权

评论回复
7
vigia| | 2011-6-17 10:08 | 只看该作者
1, 只有一次USB_Istr();是不正常的
2, 按照你的说法,使用的不是STM3210B_EVAL开发板,那么程序是不可能正常运行的,因为例程的代码做了USB的虚拟插拔,也就是使用了一个I/O口来控制D+线的上拉,如果你使用了其他开发板,而这个开发板又和STM3210B_EVAL板所使用的I/O口不一致,那这个上拉使能就无效了,主机就检测不到设备的插入了,也不可能装驱动,也不可能枚举成功
3, 如果枚举成功了,程序当然在while(1){}中循环,如果枚举不成功bDeviceState != CONFIGURED就永远成立,当然一直在循环,bDeviceState 的值到底是什么,调试的时候一看就知道了。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
desomond + 1
8
desomond|  楼主 | 2011-6-17 10:11 | 只看该作者
可是,我用STM32F107的时候在中断函数入口设置中断却可以发生多次中断,难道是OTG和普通usb的差异?暂且搁置这个问题,应该如版主所言........
去除全部断点,程序运行到 while (bDeviceState != CONFIGURED); 这很让人不解

使用特权

评论回复
9
desomond|  楼主 | 2011-6-17 10:12 | 只看该作者
停止运行,每次都是运行到while (bDeviceState != CONFIGURED); 难道不应该是到while()循环的吗?如帖第三点所言

使用特权

评论回复
10
香水城| | 2011-6-17 10:17 | 只看该作者
“去除全部断点,程序运行到 while (bDeviceState != CONFIGURED); ”

这说明你的描述符有问题,或PC端没有正确地安装驱动;没有正确地安装驱动,有可能是找不到驱动。

使用特权

评论回复
11
desomond|  楼主 | 2011-6-17 12:11 | 只看该作者
本帖最后由 desomond 于 2011-6-17 12:14 编辑

7# vigia

vigia的回复相当的详细,也相当的到位,果然是usb的高手啊.......我的情况是,pc能够加载相应的驱动程序,也能够识别vid,pid;但是我发送数据发现有问题,上位机总是死,而下位机却一直停留在while(bDeviceState !=CONFIGURED);不知道有没有什么对策,或者如果有改好的官方例程就更好了,希望大家共享啊

使用特权

评论回复
12
香水城| | 2011-6-17 12:20 | 只看该作者
说了半天,LZ居然都没有说用的什么例程、什么功能,PC的驱动程序是什么;“发送数据发现有问题”,谁发送数据,什么数据,怎么发送数据。

你的提问太泛泛了!

使用特权

评论回复
13
desomond|  楼主 | 2011-6-17 14:39 | 只看该作者
例程有说吧,再具体点就是ST官方发布的USB的例程mass storage,STM32_USB-FS-Device_Lib_V3.3.0;产生将其接口描述符修改如/******************** Descriptor of Mass Storage interface ********************/
    /* 09 */ //接口描述符
    0x09,   /* bLength: Interface Descriptor size */
    0x04,   /* bDescriptorType: */
    /*      Interface descriptor type */
    0x00,   /* bInterfaceNumber: Number of Interface */
    0x00,   /* bAlternateSetting: Alternate setting */
    0x02,   /* bNumEndpoints*/
    0x00,   /* bInterfaceClass: MASS STORAGE Class修改为测试类型 */
    0x08,   /* bInterfaceSubClass : */
    0x01,   /* nInterfaceProtocol */
    4,          /* iInterface: */
    /* 18 */   //端点描述符
    0x07,   /*Endpoint descriptor length = 7*/
    0x05,   /*Endpoint descriptor type */
    0x81,   /*Endpoint address (IN, address 1) */
    0x02,   /*Bulk endpoint type */
    0x40,   /*Maximum packet size (64 bytes) */
    0x00,
    0x00,   /*Polling interval in milliseconds */
    /* 25 */
    0x07,   /*Endpoint descriptor length = 7 */
    0x05,   /*Endpoint descriptor type */
    0x02,   /*Endpoint address (OUT, address 2) */
    0x02,   /*Bulk endpoint type */
    0x40,   /*Maximum packet size (64 bytes) */
    0x00,
    0x00     /*Polling interval in milliseconds*/
    /*32*/
,其目的是为了测试PC发送数据以便STM32处理;pc的驱动程序已经在107上面有过测试,运行ok

使用特权

评论回复
14
香水城| | 2011-6-17 15:00 | 只看该作者
ST提供了多个USB例程,包括HID、CDC、DFU等,它们各不相同,只说例程怎么够?

前面也没有说修改了描述符,为什么要修改描述符?改了什么?

使用特权

评论回复
15
desomond|  楼主 | 2011-6-17 15:23 | 只看该作者
本帖最后由 desomond 于 2011-6-17 15:33 编辑

嗯,香主说得是.....本人用的是usb例程里头的mass storage,至于描述符的修改方面,本人再作一下解释......在没有修改描述符的时候,我拿开发板测,自动加载驱动程序(如U盘的插入),为usb mass storage device,因为例程本来就是装SD卡的作用,debug,发现其运行到while (bDeviceState != CONFIGURED);不往下执行..........修改描述符是为了加载我已测的目的驱动程序,并利用已有的上位机发送数据,修改的地方是0x00,   /* bInterfaceClass: MASS STORAGE Class修改为测试类型 */
    0x08,   /* bInterfaceSubClass : */
    0x01,   /* nInterfaceProtocol */
    4,          /* iInterface: */
也可以加载驱动,但debug,同样停在while (bDeviceState != CONFIGURED);

使用特权

评论回复
16
香水城| | 2011-6-17 17:06 | 只看该作者
描述符改成了测试类型,你需要PC端有相应的测试类型驱动做配合,同时PC端的驱动所执行的协议与设备端的设置是一致的。

因为不知道你的测试类型所执行的协议,所以无法判断你的问题是什么。但我在10楼说的依然有效:“这说明你的描述符有问题,或PC端没有正确地安装驱动;没有正确地安装驱动,有可能是找不到驱动”,另外再加一条,有可能正确地安装了驱动,但这个驱动与设备的协议对不上。

使用特权

评论回复
17
icecut| | 2011-6-18 08:40 | 只看该作者
建议lz好好理解usb协议。这种断点是不能随便下的。只要断点一产生。本次usb通信就失败了。。。。没有配置的原因就是没有驱动。你用bushond直接发0901那个字串,就会配置成功。。。。

使用特权

评论回复
18
desomond|  楼主 | 2011-6-18 10:05 | 只看该作者
虽然说很清楚在usb的枚举过程中不能设置中断,但是我之所以这么做是出于以牺牲本次枚举为代价来看看究竟会有多少次的中断....因为本人在STM32F107上面亲自测试过,把断点设在中断函数入口处会发生很多次的中断,原因是因为在枚举的过程中,PC会不断的发送命令到usb device........至于17楼所说的“你用bushond直接发0901那个字串,就会配置成功。。。。",是否能说得明白一点

使用特权

评论回复
19
desomond|  楼主 | 2011-6-18 10:51 | 只看该作者
1, 只有一次USB_Istr();是不正常的
2, 按照你的说法,使用的不是STM3210B_EVAL开发板,那么程序是不可能正常运行的,因为例程的代码做了USB的虚拟插拔,也就是使用了一个I/O口来控制D+线的上拉,如果你使用了其他 ...
vigia 发表于 2011-6-17 10:08

请问对于您回复的“因为例程的代码做了USB的虚拟插拔,也就是使用了一个I/O口来控制D+线的上拉”,假若想改到其他的板上,我用的是硬件上拉控制D+,该如何修改呢

使用特权

评论回复
20
desomond|  楼主 | 2011-7-21 15:57 | 只看该作者
本人在ST官网上下载了STM32 的usb例程,选择STM3210B_EVAL,device选STM32F103RB,其它没有变,下载到正立电子的开发部上,然后DEbug运行,发现有以下几个问题:
这是主函数:
int main(void)
{
  Set_System(); ...
desomond 发表于 2011-6-17 09:37

对于本人提的这几个问题,经过一段时间的思考,现本人做一小结,算是对以上三个问题的了结。
本人在103的板上,USB的D+上是硬件上拉的,用3.3V电压拉一1.5K电阻,如此一来一插上USB口的时候,PC就检测到了USB设备,完成相应的枚举过程,并加载了USB驱动。。。。。。
1:USB的枚举肯定是经过了很多的步骤的,它的过程具体是怎么样的,可以参考相应的资料;
2:枚举成功的标志是加载了相应的驱动,并且SET——CONFIGURATION,设置
3至于为什么会停在while(bDeviceState != CONFIGRED);这是因为我之前是用usb供电的,所以一定要插上USB才能Debug,但是由于是硬件上拉,一插上USB就完成了就完成了枚举过程,而DEBUG一步步执行的时候,再次会运行USB——Init(),改变了bDeviceState的值,因此不会再往下执行了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

109

帖子

3

粉丝