OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12259|回复: 13

STM32F429的USB读取U盘的问题,挂载总是失败,返回FR_NOT_ENABLED,可能是哪里的问题呢?

[复制链接]

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-6-13
在线时间
19 小时
发表于 2017-3-21 23:47:02 | 显示全部楼层 |阅读模式
10金钱
我用的是STM32F429ZET6,用的uCosII系统,文件系统是FATFS,uCosII和文件系统都已经移植成功,因为外接的Flash芯片可以正常使用FATFS操作.没有用HAL库,USB是移植的原子的F407的<<实验53 USB U盘(Host)实验>>,串口打印提示检测到了U盘,但是f_mount时始终返回FR_NOT_ENABLED,可能是哪里的问题呢?我使用原子的F429的例程<<实验56 USB U盘(Host)实验>>测试可以正常操作U盘,读写格式化都没问题,这就说明我硬件都是没问题的.我将F429例程的的USB相关的全部移植到我自己的代码,貌似就时钟和库不一样,我时钟用的180M,标准固件库,不是HAL库,结果还是不行,一样的错误.看原子教程文档写的USB时钟使用的48M,但是没看到有分频函数啊(原子F429的教程使用的是192M),是哪里将USB时钟设置成了48M呢?F407的也没看到有将USB时钟配置成48M.USB的时钟必须使用48M吗?我的U盘f_mount总是失败是不是就是这个问题呢?烦请大家帮我看看是什么问题.

最佳答案

查看完整内容[请看2#楼]

谢谢你的详细分析!U盘挂载和读写都调通了,昨天挂载失败原因今天一步步追踪f_mount函数,发现貌似就是FATFS头文件里面的#define _VOLUMES 2 //支持2个磁盘但是我用的原子的例程f_mount(fs[3],"3:",1),所以出现挂载失败,返回12.但是今天测试发现有时候f_read成功,但是有时候会死在什么地方,有时候f_write也会死在什么地方,不知道什么原因....
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-6-13
在线时间
19 小时
 楼主| 发表于 2017-3-21 23:47:03 | 显示全部楼层
ytuljj 发表于 2017-3-22 15:23
你这个问题前不久我也遇到了,你重点检查一下文件系统里面的disk.c文件的U盘初始化驱动以及读写驱动是不是 ...

谢谢你的详细分析!U盘挂载和读写都调通了,昨天挂载失败原因今天一步步追踪f_mount函数,发现貌似就是FATFS头文件里面的#define _VOLUMES        2        //支持2个磁盘但是我用的原子的例程f_mount(fs[3],"3:",1),所以出现挂载失败,返回12.但是今天测试发现有时候f_read成功,但是有时候会死在什么地方,有时候f_write也会死在什么地方,不知道什么原因....
回复

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-6-13
在线时间
19 小时
 楼主| 发表于 2017-3-21 23:48:22 | 显示全部楼层
呼叫原子大哥支援啊,从早上搞到现在都没查出问题在哪里.......
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2017-3-22 01:38:04 | 显示全部楼层
在系统时钟设置函数,就决定了USB的频率,必须是48Mhz
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2016-11-23
在线时间
23 小时
发表于 2017-3-22 08:01:23 | 显示全部楼层
修改PLLM PLLn PLLp PLLq这几个参数就行
回复

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-6-13
在线时间
19 小时
 楼主| 发表于 2017-3-22 14:53:33 | 显示全部楼层
正点原子 发表于 2017-3-22 01:38
在系统时钟设置函数,就决定了USB的频率,必须是48Mhz

在系统时钟设置函数,就决定了USB的频率...这是什么意思?不是单独设置USB的时钟,分频为48M吗?不是48M会有什么问题?返回FR_NOT_ENABLED的问题已经查出来了,是FATFS头文件里支持的磁盘个数是2,但是我移植的原子例程盘符是3导致的,我现在时钟是180M,但还是可以操作U盘,我现在已经可以读写U盘了,只是感觉还不太稳定,有时候读快了就会出问题.
回复

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-6-13
在线时间
19 小时
 楼主| 发表于 2017-3-22 14:54:41 | 显示全部楼层
liuqishigou 发表于 2017-3-22 08:01
修改PLLM PLLn PLLp PLLq这几个参数就行

这几个参数是设置主系统时钟的吧,我主系统时钟用的是180M,
HSE_SetSysClock(8,360,2,7);
回复

使用道具 举报

6

主题

20

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2016-5-25
在线时间
12 小时
发表于 2017-3-22 15:23:56 | 显示全部楼层
你这个问题前不久我也遇到了,你重点检查一下文件系统里面的disk.c文件的U盘初始化驱动以及读写驱动是不是都正确,你调用f_mount(fs[2],"2:",1)应该返回1或者3就对了,此时你再调用把该函数的第三个参数换成0测试一下应该就能返回0了,我认为的原因是,U盘的执行初始化USBH_Init函数以后,会发生多次枚举,我记得U盘与FATFS相关的读写驱动是受一个好像叫做bAppState的变量控制的,枚举期间这个变量的状态是会发生变化的,所以你在这期间选择立即挂载U盘应当是返回3的(存储设备的底层实现发生错误)总之,你返回12不大正常,你可以检查一下底层读写U盘的驱动,然后挂载函数的最后一个参数换为0,试一下,应该就能返回FR_OK(0)了
回复

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-6-13
在线时间
19 小时
 楼主| 发表于 2017-3-22 15:45:18 | 显示全部楼层
隨颩洏過 发表于 2017-3-22 14:54
这几个参数是设置主系统时钟的吧,我主系统时钟用的是180M,
HSE_SetSysClock(8,360,2,7);

嗯 时钟搞清楚了,抄在下面,以方便新人
以外接8M晶振为例。
(1)确保HSE_VALUE 的值为:8000000
(2)配置主PLL由高速外部时钟HSE提供
(3)#define  PLL_M     8
        #define  PLL_N    336
        #define  PLL_P     2
        #define  PLL_Q     7
计算:如果配置系统的时钟源为PLL,则系统的时钟为
PLLP=8MHz*PLL_N/(PLL_M*PLL_P)=8MHz*336/(8*2)=168MHz。
楼主还要确保自己所用的芯片是否支持这么高的时钟频率。

OTG的时钟是由PLL_Q决定的。
PLLQ=8MHz*PLL_N/(PLL_M*PLL_Q)=8MHz*336/(8*7)=48MHz
回复

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-6-13
在线时间
19 小时
 楼主| 发表于 2017-3-22 17:10:06 | 显示全部楼层
正点原子 发表于 2017-3-22 01:38
在系统时钟设置函数,就决定了USB的频率,必须是48Mhz

谢谢你的提醒,时钟搞清楚了.
F407的FATFS版本的
typedef struct {
        FATFS*        fs;                                /* Pointer to the related file system object (**do not change order**) */
        WORD        id;                                /* Owner file system mount ID (**do not change order**) */
        BYTE        flag;                        /* Status flags */
        BYTE        err;                        /* Abort flag (error code) */
        DWORD        fptr;                        /* File read/write pointer (Zeroed on file open) */
        DWORD        fsize;                        /* File size */
        DWORD        sclust;                        /* File start cluster (0:no cluster chain, always 0 when fsize is 0) */
        DWORD        clust;                        /* Current cluster of fpter (not valid when fprt is 0) */
        DWORD        dsect;                        /* Sector number appearing in buf[] (0:invalid) */
#if !_FS_READONLY
        DWORD        dir_sect;                /* Sector number containing the directory entry */
        BYTE*        dir_ptr;                /* Pointer to the directory entry in the win[] */
#endif
#if _USE_FASTSEEK
        DWORD*        cltbl;                        /* Pointer to the cluster link map table (Nulled on file open) */
#endif
#if _FS_LOCK
        UINT        lockid;                        /* File lock ID origin from 1 (index of file semaphore table Files[]) */
#endif
#if !_FS_TINY
        BYTE        buf[_MAX_SS];        /* File private data read/write window */
#endif
} FIL;
F429的U盘例程里面的FATFS版本
typedef struct {
        _FDID        obj;                        /* Object identifier */
        BYTE        flag;                        /* File status flags */
        BYTE        err;                        /* Abort flag (error code) */
        FSIZE_t        fptr;                        /* File read/write pointer (Zeroed on file open) */
        DWORD        clust;                        /* Current cluster of fpter (not valid when fprt is 0) */
        DWORD        sect;                        /* Sector number appearing in buf[] (0:invalid) */
#if !_FS_READONLY
        DWORD        dir_sect;                /* Sector number containing the directory entry */
        BYTE*        dir_ptr;                /* Pointer to the directory entry in the win[] */
#endif
#if _USE_FASTSEEK
        DWORD*        cltbl;                        /* Pointer to the cluster link map table (Nulled on file open) */
#endif
#if !_FS_TINY
        BYTE        buf[_MAX_SS];        /* File private data read/write window */
#endif
} FIL;
没有了fsize,这个是新版本的没有这个了还是人为去掉了呢?
这个可以获取文件大小,用来实现在文件后面追加数据,很方便.
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2017-3-22 20:21:55 | 显示全部楼层
隨颩洏過 发表于 2017-3-22 14:53
在系统时钟设置函数,就决定了USB的频率...这是什么意思?不是单独设置USB的时钟,分频为48M吗?不是48M会有 ...

不是48M就无法正常工作
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2017-3-22 20:22:51 | 显示全部楼层
隨颩洏過 发表于 2017-3-22 17:10
谢谢你的提醒,时钟搞清楚了.
F407的FATFS版本的
typedef struct {

恭喜。
最新版本的,多了一个结构体,去掉了fsize。你看我们阿波罗的代码,就知道了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-6-13
在线时间
19 小时
 楼主| 发表于 2017-3-22 22:15:36 | 显示全部楼层
正点原子 发表于 2017-3-22 20:22
恭喜。
最新版本的,多了一个结构体,去掉了fsize。你看我们阿波罗的代码,就知道了

谢谢原子哥,再问一个问题,USBH_Process(&USB_OTG_Core, &USB_Host);这个必须要不停的调用吗?有什么用呢?我放在任务里面200ms调用一次可以吗?
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2021-9-23
在线时间
40 小时
发表于 2022-4-12 22:16:28 | 显示全部楼层
隨颩洏過 发表于 2017-3-22 22:15
谢谢原子哥,再问一个问题,USBH_Process(&USB_OTG_Core, &USB_Host);这个必须要不停的调用吗?有什么用呢? ...

这个函数在开发指南中的解释是这样的:“如果是:USB SLAVE 通信,在只需要调用 USBD_Init 函数即可,不过 USB HOST 则还需要调用另外一个函数 USBH_Process,该函数用于实现 USB 主机通信的核心状态机处理,该函数必须在主函数里面,被循环调用,而且调用频率得比较快才行(越快越好),以便及时处理各种事务。注意,USBH_Process 函数仅在 U 盘识别阶段,需要频繁反复调用,但是当 U 盘被识别后,剩下的操作(U 盘读写),都可以由 USB 中断处理。”
主要就是实现USB主机通信的核心状态机。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 21:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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