野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11914|回复: 6

例程“USB-OTG读写U盘”取消按键直接扫描文件会卡死

[复制链接]
发表于 2017-4-18 19:37:38 | 显示全部楼层 |阅读模式
  1.     //USB处理过程
  2.                 USBH_Process(&USB_OTG_Core, &USB_Host);
  3.                
  4.                 Key_RefreshState(&Key1);//刷新按键状态
  5.                 Key_RefreshState(&Key2);//刷新按键状态
  6.                 if(Key_AccessTimes(&Key1,KEY_ACCESS_READ)!=0)//按键被按下过
  7.                 {
  8.                         LED2_TOGGLE;

  9.       result = f_mount(&fs,"0:",1);        /* Mount a logical drive */
  10.       if(result != FR_OK)
  11.       {
  12.         printf("\r\n文件系统挂载失败!\r\n");
  13.         continue;
  14.       }
  15.       printf("\r\n扫描到的U盘文件:\r\n");
  16.       
  17.       scan_files(scan_path);
  18.       
  19.                         Key_AccessTimes(&Key1,KEY_ACCESS_WRITE_CLEAR);

  20.                 }
复制代码
遇到特别奇怪的地方,对于例程“USB-OTG读写U盘”,一点不做修改,单片机是可以正常按键读写文件的;一旦将“if(Key_AccessTimes(&Key1,KEY_ACCESS_READ)!=0)//按键被按下过”这句话注释掉,就会卡在LED2点亮之后,也就是说“result = f_mount(&fs,"0:",1);        /* Mount a logical drive */”这句执行不过去,单片机死机。
请问是怎么回事呢?
回复

使用道具 举报

 楼主| 发表于 2017-4-18 21:46:19 | 显示全部楼层
  1.                                 if (HCD_IsDeviceConnected(&USB_OTG_Core))
  2.                                 {
  3.                                         do
  4.                                         {
  5.                                                 status = USBH_MSC_Read10(&USB_OTG_Core, (uint8_t *)buff,sector,SECTOR_SIZE * count);
  6.             USBH_MSC_HandleBOTXfer(&USB_OTG_Core ,&USB_Host);

  7.                                                 if (!HCD_IsDeviceConnected(&USB_OTG_Core))
  8.                                                 {
  9.                                                         break;
  10.                                                 }
  11.                                         }
  12.                                         while (status == USBH_MSC_BUSY );
  13.                                 }
复制代码

通过单步调试,发现是在这里的while死循环了,永远是USBH_MSC_BUSY。但是,如果用原本的例程代码,按一下按键,后面的读写功能却一切正常。难道说非得按按键才能正常读写U盘?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-18 22:14:05 | 显示全部楼层
试了一晚上,找到了一个表面上的解决办法:

                if(Key_AccessTimes(&Key1,KEY_ACCESS_READ)!=0)//按键被按下过
这行换成
                for(i=1;i<=100;i++)USBH_Process(&USB_OTG_Core, &USB_Host);
就可以了。
这说明,并不是按键起的作用,而是在等待按键的间隙,while(1)只执行USBH_Process(&USB_OTG_Core, &USB_Host);这句话,只要这句话被执行了100次以上,后面的读写U盘就正常了。
为什么是100次以上,因为我从10000次,1000次,100次,可以;10次,20次,50次,就不行。
这说明是这句话必须被执行达到一定的次数(介于50次到100次之间的某个数),没有再试验具体是几次了。
之前看到有网友提问过,为什么这里必须让CPU轮询这句话,当时版主也说自己不清楚。
请问有没有能够解释的大神?
回复 支持 反对

使用道具 举报

发表于 2017-4-19 08:47:00 | 显示全部楼层
是不是注释掉之后有的程序卡在某些地方了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-19 08:57:51 | 显示全部楼层
随风 发表于 2017-4-19 08:47
是不是注释掉之后有的程序卡在某些地方了

不是的。
“按键被按下过”那一行,在你不按按键的情况下,它是不会执行的,整个while(1)中就只有
USBH_Process(&USB_OTG_Core, &USB_Host);
这行在反复执行。而恰恰是这一行要执行100次,后面的读写U盘才能正常运行下去,否则就会卡在f_mount里面死循环。
回复 支持 反对

使用道具 举报

发表于 2017-6-6 21:57:53 | 显示全部楼层
解决了没有,我也碰到这样的问题,我想每隔一分钟就自动在U盘里面记录一些数据。
把按键语句去掉,就不行了。
回复 支持 反对

使用道具 举报

发表于 2019-12-26 22:09:49 | 显示全部楼层
我也遇到类似的问题了,我是要串口发送一个字符,通过判断这个字符才不会卡死在USBH_MSC_BUSY这里,一旦串口那个判断去掉就不行了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-26 13:09 , Processed in 0.048784 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表