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,将⽂件⽬录信息读⼊内存

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。