硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6421|回复: 25
收起左侧

[有问必答] 求助,如何正确读写U盘?

[复制链接]

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
发表于 2015-11-15 21:48:00 | 显示全部楼层 |阅读模式
U盘读写问题:

由于本人的项目需要U盘读写数据,所以做了下U盘读写实验,但是总是遇到问题,跟踪程序发现程序在diskio.c如下程序段死循环,麻烦朋

友们帮我看下是什么原因,谢谢!

do
{
    status = USBH_MSC_Write10(&USB_OTG_Core,(BYTE*)buff,sector, 512 * count);
    USBH_MSC_HandleBOTXfer(&USB_OTG_Core, &USB_Host);

    if(!HCD_IsDeviceConnected(&USB_OTG_Core))
    {
        break;
    }
}while(status == USBH_MSC_BUSY );

实验使用安富莱_STM32-V5开发板(7寸电阻屏),基于μCOS-III+STemWin+FatFs+Lwip+UIP+USB综合程序V1.2c版本修改。

U盘使用的是朗科U235 8G(此U盘使用“./01.开发板例程\02.高级篇例程(裸机)\V5-107c_FatFS文件系统例程(U盘)(V1.2)\V5-

107c_FatFS文件系统例程(U盘)”这个例程可以正常读写)。

所修改代码如下:

//---------------------------------------------第一种尝试--------------------------------------
//USB图标按下时的响应代码添加如下(位于MainTask.c 519行):
/* USB********************************************************************/
case 15:
    printf("USB Task Running.\n");

    /*打开根文件夹*/
    result = f_opendir(&DirInf, "2:/");
    if (result == FR_OK)
    {
        printf("打开根目录成功\r\n");
    }
    else
    {
        printf("打开根目录失败(%d)\r\n", result);
        return;
    }

    /*打开文件*/
    result = f_open(&file, "armfly.txt", FA_CREATE_ALWAYS | FA_WRITE);
    if (result == FR_OK)
    {
        printf("文件打开成功\r\n");
    }
    else
    {
        printf("文件打开失败(%d)\r\n", result);
        return;
    }

    /*写一串数据*/
    result = f_write(&file, "111", sizeof("111"), &bw);
    if (result == FR_OK)
    {
        printf("armfly.txt 文件写入成功\r\n");
    }
    else
    {
        printf("armfly.txt 文件写入失败\r\n");
        return;
    }

    /*关闭文件*/
    f_close(&file);

    break;

//---------------------------------------------第二种尝试--------------------------------------
//将原有K1按键截图的程序修改为保存在U盘(位于Main.c 330行)
    sprintf(buf,"2:/PicSave/%d.bmp",Pic_Name);
    OSSchedLock(&err);

    /*如果SD卡中没有PicSave文件夹,会进行创建*/
    result = f_mkdir("2:/PicSave");
    /*创建截图*/
    result = f_open(&file,buf, FA_WRITE|FA_CREATE_ALWAYS);
    /*向SD卡绘制BMP图片*/
    GUI_BMP_Serialize(_WriteByte2File, &file);

    /*创建完成后关闭file*/
    result = f_close(&file);

附件里是我修改好的代码和问题描述,麻烦帮我看下是什么原因,谢谢!

U盘读写问题.txt

3 KB, 下载次数: 139

μCOS-III+STemWin+FatFs+Lwip+UIP+USB综合程序V1.2c(U盘读写问题).zip

35.47 MB, 下载次数: 103

回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
 楼主| 发表于 2015-11-16 08:31:04 | 显示全部楼层
自己顶一下...
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2015-11-16 08:45:25 | 显示全部楼层

回 zhaoxing_ 的帖子

zhaoxing_:自己顶一下... (2015-11-16 08:31) 
使用emWin的综合程序的原始代码,能够正确识别你的U盘不。
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
 楼主| 发表于 2015-11-16 09:55:09 | 显示全部楼层

回 eric2013 的帖子

eric2013:使用emWin的综合程序的原始代码,能够正确识别你的U盘不。 (2015-11-16 08:45) 
指的是V1.0版本的吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2015-11-16 09:56:16 | 显示全部楼层

回 zhaoxing_ 的帖子

zhaoxing_:指的是V1.0版本的吗? (2015-11-16 09:55) 
那个版本都行,就试试这个1.2c吧,看看能够正常识别不,第二个图标打开后可以读取U盘内容列表的。
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
 楼主| 发表于 2015-11-16 10:02:56 | 显示全部楼层

回 eric2013 的帖子

eric2013:那个版本都行,就试试这个1.2c吧,看看能够正常识别不,第二个图标打开后可以读取U盘内容列表的。 (2015-11-16 09:56) 
U盘可以正常识别
在1.2几版中发现个问题:AppTaskCOM任务中
            if(HCD_IsDeviceConnected(&USB_OTG_Core))            
            {
              USBH_Process(&USB_OTG_Core, &USB_Host);
           }
不应该加设备连接识别,否则U盘插上后拔掉,再插上就无法识别了。
因为运行不到USBH_Process函数,事件无法再被处理。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2015-11-16 10:06:31 | 显示全部楼层

回 zhaoxing_ 的帖子

zhaoxing_:U盘可以正常识别
在1.2几版中发现个问题:AppTaskCOM任务中
            if(HCD_IsDeviceConnected(&USB_OTG_Core))            
  &n .. (2015-11-16 10:02) 
就是这样的,防止不必要的运行USBH_Process(&USB_OTG_Core, &USB_Host);
增加系统消耗。

还是就是如果需要热插拔的话,建议在USB的回调消息里面做处理
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
 楼主| 发表于 2015-11-16 10:11:08 | 显示全部楼层

回 eric2013 的帖子

eric2013:就是这样的,防止不必要的运行USBH_Process(&USB_OTG_Core, &USB_Host);
增加系统消耗。

还是就是如果需要热插拔的话,建议在USB的回调消息里面做处理 (2015-11-16 10:06) 
明白了,谢谢。我运行了V1.2C版本,点击Computer图标后程序卡在那不动了,不插入U盘没有问题,应该还是U盘操作出问题了,我跟踪下。
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
 楼主| 发表于 2015-11-16 10:12:43 | 显示全部楼层

回 eric2013 的帖子

eric2013:就是这样的,防止不必要的运行USBH_Process(&USB_OTG_Core, &USB_Host);
增加系统消耗。

还是就是如果需要热插拔的话,建议在USB的回调消息里面做处理 (2015-11-16 10:06) 
还是卡在
do
{
    status = USBH_MSC_Write10(&USB_OTG_Core,(BYTE*)buff,sector, 512 * count);
    USBH_MSC_HandleBOTXfer(&USB_OTG_Core, &USB_Host);

    if(!HCD_IsDeviceConnected(&USB_OTG_Core))
    {
        break;
    }
}while(status == USBH_MSC_BUSY );
这个循环出不来。。。
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
 楼主| 发表于 2015-11-16 10:31:56 | 显示全部楼层

回 eric2013 的帖子

eric2013:就是这样的,防止不必要的运行USBH_Process(&USB_OTG_Core, &USB_Host);
增加系统消耗。

还是就是如果需要热插拔的话,建议在USB的回调消息里面做处理 (2015-11-16 10:06) 
串口显示找到U盘,并且打印了U盘信息
USB OTG HS MSC Host
> USB Host library started.
     USB Host Library v2.1.0
> Device Attached
> USBH_USR_ResetDevice
> Full speed device detected
> VID : 0DD8h
> PID : 173Ch
> Mass storage device connected
> Manufacturer : Netacr
> Product : OnlyDisk
> Serial Number : ff03EC0028E3DDFFFF97
> Enumeration completed
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
 楼主| 发表于 2015-11-16 11:12:50 | 显示全部楼层
谁来帮帮忙啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2015-11-16 11:15:51 | 显示全部楼层

回 zhaoxing_ 的帖子

zhaoxing_:谁来帮帮忙啊 (2015-11-16 11:12)
换个U盘试试。ST搞的那个U盘的HOST库兼容性较差。有时候也是着急。
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
 楼主| 发表于 2015-11-16 11:41:03 | 显示全部楼层

回 eric2013 的帖子

eric2013:换个U盘试试。ST搞的那个U盘的HOST库兼容性较差。有时候也是着急。
 (2015-11-16 11:15) 
您哪里做实验用的是哪个厂商的U盘?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2015-11-16 11:42:15 | 显示全部楼层

回 zhaoxing_ 的帖子

zhaoxing_:您哪里做实验用的是哪个厂商的U盘? (2015-11-16 11:41) 
对了,测试的时候,先把U盘插上再上电,试试看。
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
 楼主| 发表于 2015-11-16 11:47:48 | 显示全部楼层

回 eric2013 的帖子

eric2013:对了,测试的时候,先把U盘插上再上电,试试看。 (2015-11-16 11:42) 
试了,现象一样。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2015-11-16 11:49:16 | 显示全部楼层

回 zhaoxing_ 的帖子

zhaoxing_:试了,现象一样。。。 (2015-11-16 11:47)
晚上有时间我试试吧,以前测试还凑活,估计是ST库识别你的U盘有些问题。
注意,1.2c的例子不要做任何修改,就是在原始的例子上面试试。
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
 楼主| 发表于 2015-11-16 13:05:57 | 显示全部楼层

回 eric2013 的帖子

eric2013:晚上有时间我试试吧,以前测试还凑活,估计是ST库识别你的U盘有些问题。
注意,1.2c的例子不要做任何修改,就是在原始的例子上面试试。
 (2015-11-16 11:49) 
使用“高级篇例程(裸机)”中的“V5-107c_FatFS文件系统例程(U盘)(V1.2)”这个例程是可以正常读写的。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2015-11-17 00:27:40 | 显示全部楼层

回 zhaoxing_ 的帖子

zhaoxing_:使用“高级篇例程(裸机)”中的“V5-107c_FatFS文件系统例程(U盘)(V1.2)”这个例程是可以正常读写的。。。 (2015-11-16 13:05) 
我刚刚测试了下,测试了3个U盘,两个可以,另外一个闪迪的8G U盘不行,点击了界面后就没有反应了。
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
 楼主| 发表于 2015-11-17 08:28:08 | 显示全部楼层

回 eric2013 的帖子

eric2013:我刚刚测试了下,测试了3个U盘,两个可以,另外一个闪迪的8G U盘不行,点击了界面后就没有反应了。 (2015-11-17 00:27) 
您测试的U盘是哪个厂家的啊?我也买个试试。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2015-11-17 08:51:15 | 显示全部楼层

回 zhaoxing_ 的帖子

zhaoxing_:

您测试的U盘是哪个厂家的啊?我也买个试试。

上面两个U盘可用
1.png
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
 楼主| 发表于 2015-11-17 08:58:55 | 显示全部楼层

回 eric2013 的帖子

eric2013:上面两个U盘可用


....... (2015-11-17 08:51) 
额。。。可以选点主流的测试下吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2015-11-17 08:59:53 | 显示全部楼层

回 zhaoxing_ 的帖子

zhaoxing_:额。。。可以选点主流的测试下吗? (2015-11-17 08:58) 
手头上没有别的U盘了。。。
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
 楼主| 发表于 2015-11-17 09:07:35 | 显示全部楼层

回 eric2013 的帖子

eric2013:手头上没有别的U盘了。。。 (2015-11-17 08:59) 
还有个问题,我的这个U盘使用“高级篇例程(裸机)”中的“V5-107c_FatFS文件系统例程(U盘)(V1.2)”这个例程是可以正常读写的,但综合例程却不行,有可能是哪里的原因呢?
难道USBLIB库运行在UCOS上会出现错误???
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2015-11-17 09:12:19 | 显示全部楼层

回 zhaoxing_ 的帖子

zhaoxing_:还有个问题,我的这个U盘使用“高级篇例程(裸机)”中的“V5-107c_FatFS文件系统例程(U盘)(V1.2)”这个例程是可以正常读写的,但综合例程却不行,有可能是哪里的原因呢?
难道USBLIB库运行在UCOS上会出现错误??? (2015-11-17 09:07) 
不这个太清楚是什么回事了,以前我也是直接从裸机移植过来,如果这个例子可以识别,你直接基于这个例子移植一个UCOS即可。
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
 楼主| 发表于 2015-11-17 09:14:53 | 显示全部楼层

回 eric2013 的帖子

eric2013:不这个太清楚是什么回事了,以前我也是直接从裸机移植过来,如果这个例子可以识别,你直接基于这个例子移植一个UCOS即可。 (2015-11-17 09:12) 
我试试,非常感谢!!!
回复

使用道具 举报

1

主题

16

回帖

19

积分

新手上路

积分
19
QQ
 楼主| 发表于 2015-11-19 17:04:48 | 显示全部楼层
唉~被U盘例程坑死了。。。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-8 08:05 , Processed in 0.265939 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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