打印

stm32F205使用USB读写时出现问题,求救香版主

[复制链接]
7789|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
handlike|  楼主 | 2013-5-3 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
usb驱动版本 V2.1.0,配置是全速usb USE_USB_OTG_FS
系统读取一段USB上的内容后处理,然后再读取一段再处理......发现随机性的死机,跟踪发现
函数disk_read和disk_write陷入死循环,这两个函数返回值一直是USBH_MSC_BUSY
我们的系统运行时有一个2ms中断和一个8ms中断,还有其它几个中断(如串口中断、外部PIN中断)。关掉中断可以长时间的读写,不会出现死机现象,但工作时又不能关闭这些中断,这个问题困扰我们好长时间了。求香版主给个解决方案。
如方便给个联系方式。谢谢。
沙发
jemlz| | 2013-5-22 16:14 | 只看该作者
能给我看看你的usb的部分的原理图吗

使用特权

评论回复
板凳
cjhk| | 2013-5-22 19:09 | 只看该作者
将原理图上来   让大家看看   这样解决起来   相对比较快一点

使用特权

评论回复
地板
香水城| | 2013-5-23 14:19 | 只看该作者
本帖最后由 香水城 于 2013-5-23 14:20 编辑

在disk_read和disk_write过程中,USB Host开启了基于BOT协议的SCSI命令传输并应答过程:
/***********************************************************************************************/
    do
    {
      status = USBH_MSC_Read10(&USB_OTG_Core, buff,sector,512 * count);
      USBH_MSC_HandleBOTXfer(&USB_OTG_Core ,&USB_Host);   
    } while(status == USBH_MSC_BUSY );
/***********************************************************************************************/
在第一次进入Read10()时初始化了status = USBH_MSC_BUSY;
直到此次SCSI命令交互结束,正确收到CSW,并解释出OK后,再把status = USBH_MSC_OK; 从而以上do-while循环可以执行结束。如果该status一直在USBH_MSC_BUSY,那么显然此次Read10操作没有正确完成。那么可以检测几个状态机变量看看执行到哪一步了,比如USBH_MSC_BOTXferParam.CmdStateMachine,USBH_MSC_BOTXferParam.BOTState

那么现在就要查出为何中断的打断,使得USB的通信不能如期进行。

使用特权

评论回复
5
临时账户| | 2013-6-11 11:36 | 只看该作者
香主: 放我遇到了同样的问题
配置如下:
define STM32F10X_CL
USE_USB_OTG_FS
我把两个宏的定义放在了配置项里面, 但是仍然出现这个问题
我和最新的库V2.1.0比较了一下 代码都是相同的,很奇怪。
我用的是8M的外部晶振

初始化代码为USBH_Init(&USB_OTG_Core,USB_OTG_FS_CORE_ID,&USB_Host,&USBH_MSC_cb,&USR_cb);

我的是有时候好用有时候不好用。

不好用的原因是:USBH_MSC_HandleBOTXfer 函数中:

URB_Status = HCD_GetURB_State(pdev , MSC_Machine.hc_num_out);  
返回为URB_IDLE。

不明白为什么?
在网上搜,发现很多人都遇到了这个问题,但最后都没有解决方案。
还请指导。

使用特权

评论回复
6
hxh1986| | 2013-10-14 12:03 | 只看该作者
香水城 发表于 2013-5-23 14:19
在disk_read和disk_write过程中,USB Host开启了基于BOT协议的SCSI命令传输并应答过程:
/**************** ...

按香主说的检查中断,确实是被其他中断打断了,把USB中断优先级设为最高,解决:lol

使用特权

评论回复
7
ar3000a| | 2013-12-6 18:30 | 只看该作者
设为最高解决了?
我的感觉是,读文件这种操作,属于耗费时间很长,实时性要求不高的任务,应该低一些优先级。但是USB做HOST的时候,能不能控制U盘也慢一些呢? 还是需要即时响应U盘才可以? 费解。

使用特权

评论回复
8
ar3000a| | 2013-12-6 18:31 | 只看该作者
本帖最后由 ar3000a 于 2013-12-6 19:52 编辑

那岂不是跟作为device时候一样了,没有主动性了呀。按照楼主的需求,1-2ms一个中断,类似扫描点阵或者采集某些信号,或者测量脉宽,都是些关键处理,这样被USB打断,不是完美实现啊。

使用特权

评论回复
9
tt朝花夕拾| | 2017-1-20 13:35 | 只看该作者
确实和usb的中断优先级有关,当优先级比较低的时候,会出现usb host  USBH_LL_GetURBState 一直为idle的情况;

使用特权

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

本版积分规则

个人签名:男怕入错行,女怕嫁错郎。 我是来灌水的,顺便采点蘑菇。

12

主题

661

帖子

2

粉丝