打印

STM32_USB-FS-Device_Lib_V3.3.0库及其demo中的一个隐患

[复制链接]
5384|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32_USB-FS-Device_Lib_V3.3.0库 的Demo Custom_HID 中,在ADC、EXIT中断中使用EP1IN向主机发送report, ADC、EXIT中断发生在USB device出示化之前,则肯定会丢数据。
更通用的case下, 如在main 函数中循环发送数据, 如
while (1)
  {
    if (PrevXferComplete)
    {
      extern unsigned char Send_Buffer[];
      Send_Buffer[0] = HID_USB_CAN_IN_REPORT_ID;  //Report ID
      
      /* Write the descriptor through the endpoint */
      USB_SIL_Write(HID_USB_CAN_EP_OUT, (uint8_t*) Send_Buffer, HID_USB_CAN_IN_REPORT_LEN + 1);
        PrevXferComplete = 0;
  }
若发送时usb device 还没有被枚举,而PrevXferComplete已等于0, 则永远不能发生出数据。
一家之言,与专家商榷。
沙发
gary_wang| | 2012-3-2 09:25 | 只看该作者
我也遇到这个问题,这是库文件的bug,用hid和JoyStickMouse例程都有这个问题,用EP1IN  PC机重启后,device设备获取完报告描述符后就不动了,感觉是在中断里一直没出来,必须重新插拔USB后EP1IN, EP2OUT才能正常

使用特权

评论回复
板凳
gary_wang| | 2012-3-2 09:28 | 只看该作者
关注此问题,希望ST技术支持的回复和解决

使用特权

评论回复
地板
香水城| | 2012-3-2 10:08 | 只看该作者
请LZ先说说那个Demo的功能,然后再说一下为什么有隐患不能实现所要求的功能。

如果没有功能定位,隐患又从何谈起呢?

使用特权

评论回复
5
yifanfeng|  楼主 | 2012-3-2 11:28 | 只看该作者
该库及其HID_Mouse demo 肯定无法避免如下情况的发生, 即
1. 有可能在USB被初始化之前USB_SIL_Write()被调用,此种情况肯定会丢数据。
2. 在USB设备被枚举之前USB_SIL_Write()被调用, 此种情况从软件的角度来讲也是应避免的。

建议ST在该库中增加查询DEVICE状态的接口,以便用户在查询设备已被正确枚举后在发送数据。

使用特权

评论回复
6
yifanfeng|  楼主 | 2012-3-2 11:43 | 只看该作者
我也遇到这个问题,这是库文件的bug,用hid和JoyStickMouse例程都有这个问题,用EP1IN  PC机重启后,device设备获取完报告描述符后就不动了,感觉是在中断里一直没出来,必须重新插拔USB后EP1IN, EP2OUT才能正常 ...
gary_wang 发表于 2012-3-2 09:25


Hi gary_wang,
在使用IAR自带的STM320F107VC例子时,也发生如你所诉的情况,一些莫名其妙的中断不断发生,这些中断应该只在Host状态下发生才对。 该例子中的USB库版本太老,换如题所述版本后,该问题消失。 希望以上信息对你有帮助。

使用特权

评论回复
7
香水城| | 2012-3-2 12:04 | 只看该作者
本帖最后由 香水城 于 2012-3-2 12:08 编辑
该库及其HID_Mouse demo 肯定无法避免如下情况的发生, 即
1. 有可能在USB被初始化之前USB_SIL_Write()被调用,此种情况肯定会丢数据。
2. 在USB设备被枚举之前USB_SIL_Write()被调用, 此种情况从软件的角度来讲也是 ...
yifanfeng 发表于 2012-3-2 11:28


在UM0424中,已经写明:这个Demo的目的是演示如何创建一个HID设备与PC端的HID驱动通信,LZ说的问题确实有可能出现,但那不是这个Demo要考虑的问题,而是在你参考这个Demo时需要考虑的;现在你考虑了,说明你动脑子了, :lol



关于“增加查询DEVICE状态的接口,以便用户在查询设备已被正确枚举后在发送数据”这个问题,在Custom_HID这个Demo中已经考虑到了,建议你看看这个枚举类型:
 
typedef enum _DEVICE_STATE
{
  UNCONNECTED,
  ATTACHED,
  POWERED,
  SUSPENDED,
  ADDRESSED,
  CONFIGURED
} DEVICE_STATE;
再观察变量bDeviceState的变化,应该知道怎么做了。

使用特权

评论回复
8
gary_wang| | 2012-3-2 13:17 | 只看该作者
HI  yifanfeng.
我已经换了最新版本的库文件,用JoyStickMouse例程,只要PC机重启,获取完报告描述符,就没反应了,应该是进中断出不来了,PC机已经识别到HID-compliant device。  但是EP1_IN和EP2_OUT就是没有数据,必须重新插拔USB才可以,不知道你遇到的是不是这个问题。有可能是host  影响,还没法跟进去程序。

使用特权

评论回复
9
yifanfeng|  楼主 | 2012-3-2 13:18 | 只看该作者
感谢香版主的回复,bDeviceState读代码是没有注意到。
另,在demo的 main函数中
int main(void)
{
  uint32_t i = 0;
  Set_System();  //EXIT和ADC中断在此打开
  
  USB_Interrupts_Config();
  Set_USBClock();
  while(1);
}
其先打开EXIT和ADC中断在初始化USB, 有可能EXIT和ADC中断先于USB初示化,则USB_SIL_Write()会被调用。
虽然文档中已注明这是一个简单的demo,但这并不能成为其有bug的理由,况且该Bug也很容易Fixed

  USB_Init();

使用特权

评论回复
10
gary_wang| | 2012-3-2 13:19 | 只看该作者
我用STM32F103板子同样的代码只是库文件用的STM32F103的库就没有问题,很奇怪的问题

使用特权

评论回复
11
香水城| | 2012-3-2 13:59 | 只看该作者
感谢香版主的回复,bDeviceState读代码是没有注意到。
另,在demo的 main函数中
int main(void)
{
  uint32_t i = 0;
  Set_System();  //EXIT和ADC中断在此打开
  
  USB_Interrupts_Config();
  Set_USBClock();
  while(1);
}
其先打开EXIT和ADC中断在初始化USB, 有可能EXIT和ADC中断先于USB初示化,则USB_SIL_Write()会被调用。
虽然文档中已注明这是一个简单的demo,但这并不能成为其有bug的理由,况且该Bug也很容易Fixed
...
yifanfeng 发表于 2012-3-2 13:18


我的意思是说,Demo的目的是演示正确的数据传输,而不是演示正确的数据采集,你说那是一个Bug也好,不是一个Bug也好,并不影响实现Demo的目的。所以我们也没有必要纠缠于此。

使用特权

评论回复
12
nongfuxu| | 2012-5-1 07:31 | 只看该作者
STM32F芯片的USB,就是一个**肋.

使用特权

评论回复
13
johnsonz99| | 2012-5-2 08:46 | 只看该作者
可以按DEMO修改达到自己的要求就可以了阿。

使用特权

评论回复
14
vigia| | 2012-5-2 14:53 | 只看该作者
确实,其他例程都有
    if (bDeviceState == CONFIGURED)
或者
  while (bDeviceState != CONFIGURED);
之类的语句,唯独Custom_HID没有,有点考虑不周

使用特权

评论回复
15
nongfuxu| | 2012-5-2 19:35 | 只看该作者
强烈建议ST公司改善USB的使用例子,强化二姨家的USB技术支持!

使用特权

评论回复
16
a305566| | 2012-5-2 22:08 | 只看该作者
遇到同样问题,期待解决方案

使用特权

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

本版积分规则

4

主题

16

帖子

0

粉丝