硬汉嵌入式论坛

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

[有问必答] USB host 与fatfs读写问题

[复制链接]

1

主题

0

回帖

1

积分

新手上路

积分
1
发表于 2016-9-20 20:20:53 | 显示全部楼层 |阅读模式
我用的v5的开发版跑的 V5-107C-FatFS(U盘)的例程,在改写程序的时候发现如果不使用 comGetChar(com1,&cmd),例程就无法对U盘进行文件操作管理,不知道串口1对U盘有什么影响吗?小白求指导,我就是想做一个上电直接新建文件夹的小程序,可是删掉串口的命令就不行了,大神帮忙看下,谢谢!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117563
QQ
发表于 2016-9-21 10:29:22 | 显示全部楼层
你要保证你挂载成功了才可以操作的,主程序大循环里面有个USBH_Process的函数,这个是要循环调用的,从实现挂载。挂载成功后以后的函数也得需要他。
你的问题估计是没有挂载成功就进行操作了。
回复

使用道具 举报

3

主题

11

回帖

3

积分

新手上路

积分
3
发表于 2016-9-22 20:18:30 | 显示全部楼层
这个问题我知道,因为是我帮题注解决的。。。

V5-107C-FatFS(U盘)的例程里,对U盘进行操作,是在demofatfs()  函数里。需要对串口写入一个1-6的字符,芯片才会执行相应的程序。

当把程序改成上电直接运行之后,对U盘进行枚举的函数,USBH_Process(XX,XX),在上电之后得第一次运行是需要一定时间的,而例程里本身没有这个延时操作,是靠串口输入本身存在一个人输入的延时来完成的。

所以解决方法就是,对上电直接操作的程序,在枚举函数后面加上一个定时器函数,要注意不能用Delay函数,必须用定时器函数,比如bsp_Timer.c里边的StartTimer(x,xx)。

之所以不能用Delay函数,是因为Delay函数是依靠主循环的while(1)占用来实现的,而占用了主时钟的话枚举函数是无法完成操作的,因此需要另外开启一个定时器,将定时器的标志位作为延时完成的标志,也就是用CheckTimer()的返回值作为允许下一步程序运行的前提条件。

以上啦。

//////////////////////////////////2016.10.20//////////////////////////////////////
进一步的研究发现,应该是使用usb_usr.c里边的回调函数,其中有个 int USBH_USR_MSC_Application(void) 的函数,在里边写上标志位(或者直接调用你写的函数),当u盘枚举完成并且所有状态准备好之后,就会执行该函数,就能通过标志位来决定是否完成枚举,能否进一步执行了。

回复

使用道具 举报

3

主题

11

回帖

3

积分

新手上路

积分
3
发表于 2016-10-20 19:57:34 | 显示全部楼层
进一步的研究发现,应该是使用usb_usr.c里边的回调函数,其中有个 int USBH_USR_MSC_Application(void) 的函数,在里边写上标志位(或者直接调用你写的函数),当u盘枚举完成并且所有状态准备好之后,就会执行该函数,就能通过标志位来决定是否完成枚举,能否进一步执行了。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117563
QQ
发表于 2016-10-21 01:29:10 | 显示全部楼层

回 dakong 的帖子

dakong:进一步的研究发现,应该是使用usb_usr.c里边的回调函数,其中有个 int USBH_USR_MSC_Application(void) 的函数,在里边写上标志位(或者直接调用你写的函数),当u盘枚举完成并且所有状态准备好之后,就会执行该函数,就能通过标志位来决定是否完成枚举,能否进一步执行了。
 (2016-10-20 19:57) 
在USBH_USR_MSC_Application(void) 里面做应用是官方的实例的做法,操作不方便。通过函数
函数USBH_USR_Configuration_DescAvailable  做插入标志
函数USBH_USR_DeviceDisconnected 做拔出标志
回复

使用道具 举报

3

主题

11

回帖

3

积分

新手上路

积分
3
发表于 2016-10-21 19:04:32 | 显示全部楼层

回 eric2013 的帖子

eric2013:在USBH_USR_MSC_Application(void) 里面做应用是官方的实例的做法,操作不方便。通过函数
函数USBH_USR_Configuration_DescAvailable  做插入标志
函数USBH_USR_DeviceDisconnected 做拔出标志

....... (2016-10-21 01:29)
函数USBH_USR_Configuration_DescAvailable  做插入标志”  是指u盘插入还是u盘已经准备好呢?

这个函数也是在usbh_usr.c里的回调函数,把标志位放在这两个函数里的区别是什么呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117563
QQ
发表于 2016-10-22 10:39:25 | 显示全部楼层

回 dakong 的帖子

dakong:“函数USBH_USR_Configuration_DescAvailable  做插入标志”  是指u盘插入还是u盘已经准备好呢?

这个函数也是在usbh_usr.c里的回调函数,把标志位放在这两个函数里的区别是什么呢?
 (2016-10-21 19:04) 
这个帖子的末尾,我写了点
https://forum.anfulai.cn/forum.p ... 65&page=e#a
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 16:18 , Processed in 0.044515 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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