CH376S 应用范例的文件结构


有关 U 盘和 SD 卡文件读写的例子主要由以下文件组成:
① 硬件抽象层,即 I/O 接口子程序,由单片机与 CH376 芯片之间的通讯接口方式决定
HAL.H 硬件抽象层头文件
HAL_BASE.C 硬件抽象层基本子程序,包括延时子程序,需要根据单片机实际速度修改

I/O 接口子程序必须根据实际的通讯方式选择以下其中一种并按实际硬件和参数进行修改
PARA_HW.C 是硬件总线 8 位并口连接方式;
PARA_SW.C 是软件模拟 8 位并口连接方式;
SPI_HW.C 是硬件 SPI 接口连接方式;
SPI_SW.C 是软件模拟 SPI 接口连接方式
UART_HW.C 是硬件异步串口连接方式,支持波特率从 9600bps 到 3Mbps。
文件系统层,将常用命令进行打包,提供了常用的文件管理子程序和一些不太常用的子程序
FILE_SYS.H 文件系统层头文件,子程序声明等;
FILE_SYS.C 文件系统层子程序,子程序源程序等,在第 5 节有详细说明。
对于 MCS51 单片机,可以使用针对其优化过的 FILE_SYS_C51.H 和 FILE_SYS_C51.C 文件。
为了节约单片机的程序 ROM 空间和数据 RAM 空间,默认情况下,不太常用的子程序会被禁止掉,
需要使用时,可以在 include
FILE_SYS.H include FILE_SYS.C 之间定义以下宏:
定义 NO_DEFAULT_CH376_INT 用于禁止默认的 Wait376Interrupt 子程序,禁止后,应用程序
必须自行定义一个同名子程序;
定义 DEF_INT_TIMEOUT 用于设置默认的 Wait376Interrupt 子程序中的等待中断的超时时间/
循环计数值,0 则不检查超时而一直等待;
定义 EN_DIR_CREATE 用于提供新建多级子目录的子程序,默认是不提供;
定义 EN_DISK_QUERY 用于提供磁盘容量查询和剩余空间查询的子程序,默认是不提供;
定义 EN_SECTOR_ACCESS 用于提供以扇区为单位读写文件的子程序,默认是不提供;
定义 EN_LONG_NAME 用于提供支持长文件名的子程序,默认是不提供,使用长文件名子程序必
须先定义全局缓冲区 GlobalBuf,长度不小于 64 字节,可以与其它子程序共用。
有些子程序要求输入文件名参数,有三种:
name 参数是指短文件名,通常是根目录下的文件(含有根目录符)或者当前目录下的文件,
不能含有路径分隔符,总长度不超过 1+8+1+3+1 字节,最末字节为数据 0;
PathName 参数是指全路径的短文件名,包括根目录符、多级子目录及路径分隔符、文件名
或者目录名;
LongName 参数是指长文件名,以 UNICODE 小端顺序编码,以两个 0 字节结束。
③ 辅助调试子程序,用于打印输出调试信息,以便检查程序运行结果,正式产品中必须删除之
DEBUG.H 辅助调试子程序头文件;
DEBUG.C 辅助调试子程序源程序等。
④ 应用程序主程序,针对一些常见的实际应用提供程序范例,分别位于 EXAM??各个子目录中。不同
单片机的 C 语言示例程序基本通用,尤其是 main 主程序基本上适用于所有单片机,只需要修改硬

件 I/O 相关部分,重新编译和链接就可以使用。在第 6 节有详细说明。


4.4. 文件读写的参考步骤
4.4.1. 初始化,进行任何一项文件操作之前的必要步骤
① 调用 mInitCH376Host 初始化,进入 USB-HOST 工作方式或者 SD 卡主机工作方式(模式 3)
② 等待 U 盘或者 SD 卡连接,U 盘可以由 CH376 自动检测并产生中断通知,或者由单片机调用子程序
CH376DiskConnect 定期查询,SD 卡必须由单片机自行检测
③ 调用 CH376DiskMount,初始化 U 盘或者 SD 卡,并测试磁盘是否就绪,失败后可以重试最多 5 次
④ 上述步骤只需执行一次,除非 U 盘或者 SD 卡断开后重新连接,那么必须回到步骤②


4.4.2. 顺序读文件
① 调用 CH376FileOpenPath,打开文件
② 多次调用 CH376ByteRead,读取数据
③ 调用 CH376FileClose,关闭文件,可选操作

4.4.3. 顺序改写文件(覆盖原数据,超过原文件长度后转变为追加数据)
① 调用 CH376FileOpenPath,打开文件
② 多次调用 CH376ByteWrite,写入数据
③ 调用 CH376FileClose,参数是 TRUE,关闭文件并允许自动更新文件长度

4.4.4. 向已有文件追加数据
① 调用 CH376FileOpenPath,打开文件
② 调用 CH376ByteLocate,参数是 0xFFFFFFFF,移动文件指针到文件末尾
③ 多次调用 CH376ByteWrite,写入数据
④ 调用 CH376FileClose,参数是 TRUE,关闭文件并允许自动更新文件长度

4.4.5. 新建文件并写入数据
① 调用 CH376FileCreatePath,新建文件
② 多次调用 CH376ByteWrite,写入数据
③ 调用 CH376FileClose,参数是 TRUE,关闭文件并允许自动更新文件长度

4.4.6. 先读文件再改写文件
① 调用 CH376FileOpenPath,打开文件
② 多次调用 CH376ByteRead,读取数据
③ 调用 CH376ByteLocate,参数是 0,移动文件指针到文件头部
④ 多次调用 CH376ByteWrite,写入数据
⑤ 调用 CH376FileClose,参数是 TRUE,关闭文件并允许自动更新文件长度

4.4.7. 如果文件已经存在则追加数据,如果文件不存在则新建文件再写入数据
① 调用 CH376FileOpenPath,打开文件,如果返回 ERR_MISS_FILE 说明文件不存在,那么转步骤③
② 调用 CH376ByteLocate,参数是 0xFFFFFFFF,移动文件指针到文件末尾,然后转步骤④
③ 调用 CH376FileCreatePath,新建文件
④ 多次调用 CH376ByteWrite,写入数据
⑤ 调用 CH376FileClose,参数是 TRUE,关闭文件并允许自动更新文件长度

4.4.8. 定期采集数据(数据量较小时参考 EXAM7,数据量较大时参考 EXAM8)
① 采集之前,调用 CH376FileCreatePath,新建文件
② 采集数据,转换为相应的格式,例如二进制数据、字符串等
③ 调用 CH376ByteWrite,写入数据,一次写不完,可以分多次写入
④ 如果要等很长时间才有下一组数据,为了避免在此期间发生断电、U 盘拔出等事件,导致文件长
度不正确,可以用 CH376ByteWrite 写入 0 长度的空数据,强制更新文件长度
⑤ 如果整个采集过程结束,或者文件已经太大,那么转到步骤⑥,否则转到步骤②
⑥ 调用 CH376FileClose,参数是 TRUE,关闭文件并允许自动更新文件长度
⑦ 如果是因为文件已经太大的原因,那么转到步骤①,新建另一个文件名不同的新文件后继续

4.4.9. 修改文件名、文件日期/时间、文件长度等文件目录信息
① 调用 CH376FileOpenPath,打开文件
② 调用 CH376DirInfoRead,将文件目录信息读入内存
③ 调用 CH376ReadBlock 读出原文件目录信息
④ 调用 CH376DirInfoRead,将文件目录信息读入内存




猜你喜欢

转载自blog.csdn.net/qingzhuyuxian/article/details/80050557