#申请开发板# 本帖最后由 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盘的测评到此结束。
|