打印
[IDE]

【CH32F103测评报告】+USBHD_HOSTUDISK实验

[复制链接]
1169|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
USB, ST, os, hd, AC
#申请开发板# 本帖最后由 qjp1988113 于 2020-9-22 15:48 编辑

CH32F103自带2路USB2.0全速接口,可以用来直接USB通讯,也可以作为USBHOST OTG功能。用它来外接U盘进行读写,甚至升级固件,都是个极好的选择。打开官方自带的例子:

发现工程结构没上次那个模拟CH372的复杂了,几乎都是用的本身自带的库文件。

关键的一些U盘操作文件,沁恒仅提供了库。但对于我们使用者而言,其实并没什么大碍。
做完这个实验,我感觉沁恒CH32工作人员把最大的精力和耐心都献给了UDISK这个系列程序。


程序每个步骤注释的都很详细,一些变量联系上下文也能看得懂。
U盘的每一步状态注释的也很详细:
/* 磁盘及文件状态 */
#define DISK_UNKNOWN                        0x00        /* 尚未初始化,未知状态 */
#define DISK_DISCONNECT                0x01        /* 磁盘没有连接或者已经断开 */
#define DISK_CONNECT                        0x02        /* 磁盘已经连接,但是尚未初始化或者无法识别该磁盘 */
#define DISK_USB_ADDR                        0x04        /* 磁盘已经分配USB设备地址,但是尚未配置USB和初始化磁盘 */
#define DISK_MOUNTED                        0x05        /* 磁盘已经初始化成功,但是尚未分析文件系统或者文件系统不支持 */
#define DISK_READY                                0x10        /* 已经分析磁盘的文件系统并且能够支持 */
#define DISK_OPEN_ROOT                        0x12        /* 已经打开根目录,扇区模式,只能以扇区为单位读写目录的内容,使用后必须关闭,注意FAT12/FAT16根目录是固定长度 */
#define DISK_OPEN_DIR                        0x13        /* 已经打开子目录,扇区模式,只能以扇区为单位读写目录的内容 */
#define DISK_OPEN_FILE                        0x14        /* 已经打开文件,扇区模式,可以以扇区为单位进行数据读写 */
#define DISK_OPEN_FILE_B                0x15        /* 已经打开文件,字节模式,可以以字节为单位进行数据读写 */
一般U盘操作的具体流程:
U盘操作流程:USB总线复位、U盘连接、获取设备描述符和设置USB地址、可选的获取配置描述符、U盘初始化、分析磁盘的文件系统并且能够支持
然后下面就可以进行读写,创建删除了。
从它的代码的风格来看:
strcpy( (PCHAR)mCmdParam.Open.mPathName, "/C51/NEWFILE.C" );
感觉沁恒挂载了自己的文件系统,而且封装在了库里面,没有提供具体的代码。
程序还把USB作为主机和设备的一些常见功能进行了了封装。
执行过程中发现其对U盘的格式有一定的要求,必须是FAT(16/32)的格式。
U盘中无指定文件时的情况:

查看U盘里面文档,确实写入正常。

U盘中有指定文件的情况:

发现读出的前100个字节,无显示。
这里可能是我个人U盘的缘故,我试了好几遍都不行。
屏蔽前面的写代码直接读,发现能够正常显示:

在写和读两个步骤间加上先关闭文件再开启一下的代码:
////////NEW ADD  BEGIN
//先关闭
printf( "Close
" );
mCmdParam.Close.mUpdateLen = 1;
i = CH103FileClose( );                                    /* 关闭文件 */
mStopIfError( i );
//再开启
/* 读文件 */
strcpy( (PCHAR)mCmdParam.Open.mPathName, "/C51/NEWFILE.C" );     //设置将要操作的文件路径和文件名/C51/NEWFILE.C
s = CH103FileOpen( );
mStopIfError( s );                                                //打开文件
///////NEW ADD  END
///////////二、读取文件前N字节/////////////////////////////////////////
然后再看串口输出:

显示正常。
至于为啥要改一下,可能我U潘有问题吧。
好了,U盘的测评到此结束。









使用特权

评论回复

相关帖子

沙发
WCHTech2| | 2020-9-22 17:35 | 只看该作者
       您好,这个不是U盘的原因,如果文件存在,例程中将文件指针移动到文件尾部,开始写入数据,文件指针自动向后偏移,此时读取文件内容时,也是从当前文件指针处开始读取,而此时文件指针在文件尾部,所以读出的内容为空。您可以将文件指针移动头文件头部,或自定义的位置,再次读取即可(如图所示)。
      关闭文件再重新打开后,文件指针默认在文件的头部,所以可以读取并打印出内容。

使用特权

评论回复
板凳
qjp1988113|  楼主 | 2020-9-23 08:05 | 只看该作者
WCHTech2 发表于 2020-9-22 17:35
您好,这个不是U盘的原因,如果文件存在,例程中将文件指针移动到文件尾部,开始写入数据,文件指针 ...

原来是这样,明白了。那那个官方自带的例程得改一下了。

使用特权

评论回复
地板
WCHTech2| | 2020-9-23 09:44 | 只看该作者
qjp1988113 发表于 2020-9-23 08:05
原来是这样,明白了。那那个官方自带的例程得改一下了。

嗯嗯,提交修改计划了

使用特权

评论回复
5
名字是啥样| | 2020-10-14 16:30 | 只看该作者
程序每个步骤注释的都很详细,一些变量联系上下文也能看得懂。

使用特权

评论回复
6
jinglixixi| | 2020-10-15 09:44 | 只看该作者
我也遇到类似的情况,问题是写入的是“Note:这个程序是以字节为单位进行U盘文件读写,简单演示功能。”,可怎么读取得前100个字符却与写入的没一点关系的100个“CCCCCCCCCC...”那,问题出在什么地方?
你的测试也是这样吗?

使用特权

评论回复
7
jinglixixi| | 2020-10-15 09:48 | 只看该作者
此外,为什么CH579M-R1开发板的DEMO中,U盘的读写就只有了写,而删去了读?是否是因为读取存在问题?

使用特权

评论回复
8
便携手到老| | 2020-10-15 10:03 | 只看该作者
这个可以用keil4进行开发吗?

使用特权

评论回复
9
WCHTech2| | 2020-10-15 10:06 | 只看该作者
便携手到老 发表于 2020-10-15 10:03
这个可以用keil4进行开发吗?

可以,ARM版本即可

使用特权

评论回复
10
便携手到老| | 2020-10-15 10:53 | 只看该作者
WCHTech2 发表于 2020-10-15 10:06
可以,ARM版本即可

里面的设置需要更改一下吗?

使用特权

评论回复
11
WCHTech2| | 2020-10-15 13:11 | 只看该作者
便携手到老 发表于 2020-10-15 10:53
里面的设置需要更改一下吗?

设置不需要更改,这边推荐您使用keil5

使用特权

评论回复
12
鱿鱼丝| | 2020-10-31 22:54 | 只看该作者
是不是楼主的U盘有问题呀?

使用特权

评论回复
13
鱿鱼丝| | 2020-10-31 22:55 | 只看该作者
里面的设置都不需要更改的吗?

使用特权

评论回复
14
便携手到老| | 2020-11-11 09:32 | 只看该作者
鱿鱼丝 发表于 2020-10-31 22:55
里面的设置都不需要更改的吗?

设置不需要更改的,就可以直接使用的。

使用特权

评论回复
15
liangshuang95| | 2020-11-20 18:45 | 只看该作者
感谢楼主分享经验。

使用特权

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

本版积分规则

111

主题

627

帖子

2

粉丝