本帖最后由 HonestQiao 于 2022-5-25 21:22 编辑
在CH32V307评估板上,提供了两个连接主芯片USB2.0高速通信接口的端口,可以通过Type-C接口,连上U盘操作。其具体的接口,见下图中的7和8:
我这边实际连接时,使用Type-C转普通USB A母头,然后再连接上普通的U盘。
支持的U盘文件格式,包括FAT12/FAT16/FAT32,一般使用FAT32就成。
在"CH32V307EVT 应用例程"中,EXAM/USB/USBHS/HOST_Udisk例程,即为U盘读写的例程。
U盘操作部分,需要调用EXAM/USB/USBHS/Udisk_Lib 操作库。
其中核心的部分,为以下四个方面:
一、挂载U盘,检查状态:
上述代码中,涉及到U盘操作的部分,主要有:
- USBHS_Hostinit(ENABLE):启用USB Host模式,可以操作USB设备;DISABLE则表示取消Host模式;一个来回,就表示再次挂载
- USBHS_HostEnum():枚举挂载的USB设备
- CHRV3DiskReady():检查USB DISK是否准备好
一旦检测到USB DISK已经准备好了,就可以进行下一步操作,开始U盘的读写了。
二、写数据到U盘文件:
在上述代码中,关键的调用为:
- CHRV3FileOpen():打开U盘文件
- CHRV3FileCreate():如果打开失败,我们可以创建一个新的文件
- CHRV3ByteWrite():写入数据,
- CHRV3FileModify():修改文件属性
- CHRV3FileClose():关闭U盘文件
在上述代码中,有一个非常关键的全局量mCmdParam,关系到对U盘的各项具体操作,其定义如下:
在上述U盘写数据操作部分的代码中,涉及到mCmdParam的如下几个属性:
- mCmdParam.Open.mPathName:要打开的文件的路径
- mCmdParam.Create.mPathName:要创建的文件的路径
- mCmdParam.ByteWrite.mByteCount:写入时的数据长度
- mCmdParam.ByteWrite.mByteBuffer:写入时的数据buf
- mCmdParam.Modify.mFileAttr:文件属性,如为0xFF则不修改属性
- mCmdParam.Modify.mFileTime:文件修改时间,如为0xFFFF则不修改
- mCmdParam.Modify.mFileDate:新的文件日期,需要使用MAKE_FILE_DATE( 2022, 5, 25 )生成
- mCmdParam.Modify.mFileSize:新的文件长度,如为0xffffffff则表示不修改,但可有下一个属性自动设置
- mCmdParam.Close.mUpdateLen:关闭时,自动计算文件长度,通常应该设置为1
三、追加数据到U盘文件:
对于一个已经存在的文件,我们可以追加数据到其尾部,操作的代码如下:
其中有一个关键的设置:
- mCmdParam.ByteLocate.mByteOffset:表示在文件数据中的指针,如为0xffffffff,则表示在文件尾部
其对应的调用为:
- CHRV3ByteLocate( ):表示根据上述设置的值,定位到文件数据中的具体位置,后续操作就在该位置开始进行
四、从U盘文件中读取数据:
现在,U盘文件中,已经包含了数据,我们就可以读取其中的数据了“
在首次读取U盘文件数据时,最好先使用mCmdParam.ByteLocate.mByteOffset设定偏移指针,并使用CHRV3ByteLocate( )定位。
在上述代码中,关键的调用为:
为了配合读取数据,我们还需要设置mCmdParam对应的属性:
- mCmdParam.ByteRead.mByteCount:要读取的数据长度
- mCmdParam.ByteRead.mByteBuffer:读取后存放数据的buf
在读取调用后,mCmdParam.ByteRead.mByteCount表示当前实际读取的数据长度,如果其长度小于调用前的设置,表示已经读取到了文件尾部了。
通过以上的操作,我们就可以很方便的操作U盘,使用U盘存储数据,和提供需要处理的数据了。