首页 CH375HF

CH375HF

举报
开通vip

CH375HF CH375的 U盘文件级子程序库 1 USB-HOST芯片 CH375的 U盘文件级子程序库说明 版本:2C http://wch.cn 1、概述 很多数码产品以及单片机系统都需要存储器,当前,U 盘(含闪盘、USB 闪存盘、USB 移动硬盘 等,下同)已经成为很常用的移动存储设备,其价格仅比相同容量的闪存略高,而远比闪存易于采购 和易于携带,并且 U盘的规格通用,具有多种容量可供选用。所以,数码产品以及单片机系统可以直 接采用 U盘作为大容量的移动存储器。 CH375是 USB总线的 H...

CH375HF
CH375的 U盘文件级子程序库 1 USB-HOST芯片 CH375的 U盘文件级子程序库说明 版本:2C http://wch.cn 1、概述 很多数码产品以及单片机系统都需要存储器,当前,U 盘(含闪盘、USB 闪存盘、USB 移动硬盘 等,下同)已经成为很常用的移动存储设备,其价格仅比相同容量的闪存略高,而远比闪存易于采购 和易于携带,并且 U盘的规格通用,具有多种容量可供选用。所以,数码产品以及单片机系统可以直 接采用 U盘作为大容量的移动存储器。 CH375是 USB总线的 HOST主机及 DEVICE设备双用接口芯片,单片机可以通过 CH375读写 U盘中 的数据,由于很多产品最终会与使用 WINDOWS操作系统的个人计算机交换数据,所以为了方便数据交 换,U盘中的数据应该符合 WINDOWS的文件系统格式。 CH375提供了 U盘文件级子程序库,单片机可以直接调用子程序读写 U盘中的文件数据,硬件上 只需要在原单片机系统中增加一个 CH375芯片,综合成本较低。CH375的 U盘文件级子程序库支持常 用的 FAT12、FAT16和 FAT32文件系统,支持 U盘最大容量 100GB。 单片机不需要考虑文件系统,只需要了解文件名、文件长度等基础知识。一个 U盘中可以有多个 文件,每个文件都是一组数据的集合,以文件名区分和识别。文件长度是指文件中有效数据的长度, 而实际占用的磁盘空间通常大于或者等于文件长度,实际文件数据的存放可能不是连续的,而是通过 一组“指针”链接的多个块(也就是分配单元或簇),从而能够根据需要随时增大文件长度以容纳更 多数据。目录是为了便于分类管理,管理者可以人为指定将多个文件归档在一起,例如 2004 年的文 件归到一个目录中。 2、子程序库分类 子程序库有两种文件路径表示方式,一种是完整全路径,另一种是逐级路径。目前子程序库主要 使用“完整全路径”方式,而普及版源程序的方式是“逐级路径”。 子程序库按功能分为三个版本: 简易版,支持 FAT12和 FAT16文件系统,只支持读文件,不支持新建和写文件。 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 版,支持 FAT12和 FAT16文件系统,支持文件读写、删除和新建等。 增强版,支持 FAT12、FAT16和 FAT32文件系统,支持文件读写、删除和新建等,占用程序空 间比标准版增加约 10%,占用存储器 RAM空间增加约 5%。 单片机的资源和速度有限,通常在处理 FAT16文件系统的 U盘时效率最高,而在处理 FAT32时效 率最低(约低 5%到 20%)。使用 U盘文件级子程序库实现同样的功能,简易版效率最高,增强版效率 最低(约低 5%到 20%),所以应该优先选用简易版子程序库。 各子程序库的子程序调用方式完全统一,同一种单片机的示例程序完全通用,只需要在链接时指 定不同的子程序库就可以实现不同的功能。不同单片机的 C语言示例程序基本通用,只需要修改硬件 相关部分,重新编译和链接就可以使用。 3、当前版本 使用 U盘文件级子程序库,单片机系统需要具备以下硬件资源:不少于 4KB到 7KB的程序空间, 不少于 600字节的随机存储器 RAM。对于 MCS-51单片机,600字节的 RAM包括不少于 86字节的内部 RAM和 512字节的外部 RAM,不同的子程序库对内部 RAM的占用稍有不同。 目前的 U盘文件级子程序库只支持第一个逻辑盘,支持 8+3格式的大写字母的短文件名,可以支 持中文文件名,通过外加程序可以支持小写字母及长文件名。 目前可以提供以下 U盘文件级子程序库: MCS51 单片机的简易版子程序库,文件名是 CH375HF3.LIB,网站上可以下载该子程序库。子 目录是 FILELIB3,提供多个示例程序。 MCS51 单片机的标准版子程序库,文件名是 CH375HF4.LIB,网站上可以下载该子程序库。子 CH375的 U盘文件级子程序库 2 目录是 FILELIB4,提供多个示例程序 CH375HFT.C。根据 CH375的 INT#连接方式分为 查询方式和中断方式,根据外部 RAM的数据复制方式分为“单 DPTR复制”、“双 DPTR 复制”和“单 DPTR和 P2+R0复制”以及“外部子程序”,根据文件数据块读写方式分 为扇区模式和字节模式。另外,还提供汇编示例程序 CH375HFT.ASM。 MCS51 单片机的增强版子程序库,文件名是 CH375HF6.LIB,可以在订购芯片或者评估板时提 供。子目录是 FILELIB6,提供多个示例程序。 MCS51 单片机非总线 I/O 的增强版子程序库,文件名是 CH375HF5.LIB,可以在订购芯片或者 评估板时提供。子目录是 FILELIB5,提供示例程序。适用于非标准或者高速的 MCS51 单片机、或者单片机通过普通 I/O引脚模拟并口连接 CH375、或者单片机通过串口连 接 CH375等应用。 MCS51单片机的增强版子程序库,只使用外部 RAM,完全不用内部 RAM,文件名是 CH375HFA.LIB, 可以在订购芯片或者评估板时提供。子目录是 FILELIBA。 MCS51单片机非总线 I/O的增强版子程序库,只使用外部 RAM,完全不用内部 RAM,文件名是 CH375HFC.LIB,可以在订购芯片或者评估板时提供。子目录是 FILELIBC。适用于非 标准或者高速的 MCS51单片机、或者单片机通过普通 I/O引脚模拟并口连接 CH375、 或者单片机通过串口连接 CH375等应用。 X86PC/8086 单片机的标准版&增强版子程序库,文件名是 CH375HF7.LIB,可以在订购芯片或 者评估板时提供。子目录是 FILELIB7,提供示例程序。 X86PC/8086单片机的标准版&增强版子程序库,采用 Huge编译模式,文件名是 CH375HFG.LIB, 可以在订购芯片或者评估板时提供。子目录是 FILELIBG。 MSP430单片机的标准版&增强版子程序库,文件名是 CH375HF8.LIB和 CH375HFF.LIB,前者支 持 V2xx的 IAR-C编译环境,后者支持 V3xx的 IAR-C编译环境,可以在订购芯片或者 评估板时提供。子目录是 FILELIB8和 FILELIBF,提供示例程序。 32位 ARM单片机的标准版&增强版子程序库,文件名是 CH375HF9.LIB和 CH375HFH.LIB,前者 支持 ADS编译环境,后者支持 SDT编译环境,均为小端数据格式,可以在订购芯片或 者评估板时提供。子目录是 FILELIB9和 FILELIBH,提供示例程序。另外,对于 ADS 编译环境,还提供子程序库 CH375HFI.LIB用于大端数据格式,子目录是 FILELIBI。 AVR单片机的标准版&增强版子程序库,文件名是 CH375HFB.LIB,可以在订购芯片或者评估板 时提供。子目录是 FILELIBB,提供示例程序。 AVR 单片机的精简标准版子程序库,代码更为精简,文件名是 CH375HFD.LIB,可以在订购芯 片或者评估板时提供,只支持 CH375A芯片。子目录是 FILELIBD。 批量用户可以预定其它单片机或者 DSP的 U盘文件级子程序库。 4、一般说明 使用 U盘文件级子程序库,单片机系统需要具有不少于 600字节的随机存储器 RAM,其中 512字 节用于磁盘数据缓冲区,除此之外,根据操作方式的不同,可能还需要文件数据缓冲区,通常情况下, RAM越多读写效率越高。 为了使用子程序库,应该在源程序中包含子程序库的头文件 CH375HF?.H,该头文件可以为 CH375 子程序库分配必要的 I/O及内存资源,并产生必要的与硬件有关的目标代码,如果该文件是被工程项 目的多个源程序包含作为头文件,那么应该只允许一个头文件分配资源和产生代码,除此之外的头文 件应该被事先定义 CH375HF_NO_CODE常量,从而禁止该头文件产生重复的目标代码。例如: #define CH375HF_NO_CODE 1 // 禁止分配资源或产生代码 #include CH375HF?.H 4.1. 存取模式 子程序库对 U盘文件的读写方式分为两种:扇区模式和字节模式。 扇区模式下,以扇区(每扇区通常是 512字节)为基本单位对 U盘文件进行读写,所以读写速度 较快,但是通常情况下需要额外的文件数据缓冲区(如果与磁盘数据缓冲区合用则效率不高),额外 CH375的 U盘文件级子程序库 3 的文件数据缓冲区必须是扇区长度 512的整数倍,所以适用于 RAM多、数据量大、频繁读写数据的单 片机系统。 字节模式下,以字节为基本单位对 U盘文件进行读写,读写速度较慢,但是不需要额外的文件数 据缓冲区(实际上是与磁盘数据缓冲区合用),使用方便,适用于 RAM 少、数据量小或者数据零碎、 不经常读写数据的单片机系统。如果频繁地向 U盘写入零碎的数据,可能会缩短 U盘中闪存的使用寿 命(因为闪存只能进行有限次擦写)。 查看子程序库的全局变量“磁盘及文件状态 CH375DiskStatus”可以获取当前的文件模式:为 DISK_OPEN_FILE则代表扇区模式,为 DISK_OPEN_FILE_B则代表字节模式。 每次新建或者打开一个文件后,默认为扇区模式,支持以扇区为单位的文件操作子程序 CH375FileRead和 CH375FileWrite及 CH375FileLocate。当执行一次以字节为单位的操作命令后将自 动进入字节模式(只有关闭文件后再重新打开才能恢复扇区模式),支持以字节为单位的操作子程序 CH375ByteRead和 CH375ByteWrite及 CH375ByteLocate。对于已打开的同一个文件,不能混用两种模 式的操作子程序。 4.2. 文件长度 在 FAT文件系统中,磁盘容量以簇为基本单位进行分配,而簇的大小总是扇区的倍数,所以文件 的占用空间总是簇的倍数,也是扇区的倍数。虽然文件占用的空间是扇区的倍数,是 512的倍数,但 是在实际应用中,保存在文件中的有效数据的长度却不一定是 512的倍数,所以 FAT文件系统在 FDT 文件目录表中专门 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 了当前文件中有效数据的长度,也就是通常所说的文件长度,文件长度总是小 于或者等于文件占用的空间。 在对文件写入数据后,如果是覆盖了原数据,那么文件长度可能不发生变化,当超过原文件长度 后,变为追加数据,那么文件长度应该发生变化(增大)。如果向文件追加数据后,没有修改 FDT 中 的文件长度,那么 FAT文件系统会认为超过文件长度的数据是无效的,正常情况下,计算机无法读出 超过文件长度的数据,虽然数据实际存在。 写数据子程序 CH375FileWrite和 CH375ByteWrite用于将数据写到文件所占用的磁盘空间中,如 果是追加数据并且超过原文件长度后,子程序会自动更新全局变量“文件长度 CH375vFileSize”。 如果数据量少或者数据不连续,那么可以在每次追加数据后立即更新 FDT中的文件长度,但是, 如果数据量大并且需要连续写入数据,立即更新 FDT会降低效率,并且频繁修改 FDT也会缩短 U盘中 闪存的使用寿命(因为闪存只能进行有限次擦写),所以在这种情况下,应该在连续写入多组数据后 再更新一次 FDT 中的文件长度,或者一直等到关闭文件时再更新文件长度,CH375FileClose 总是用 “全局变量 CH375vFileSize”更新 FDT中的文件长度。在全局变量 CH375LibConfig中,可以设定在 添加数据后是否立即更新 FDT中的文件长度,默认情况下是不更新文件长度。 在字节模式下,子程序库能够自动处理任意的文件长度,在 CH375FileClose 关闭文件时,总是 用“文件长度 CH375vFileSize”自动更新 FDT 中的文件长度,确保文件长度真实反应文件中有效数 据的长度。在字节模式下修改文件长度有 3种方法: 方法 1:调用 CH375ByteWrite,写入 0字节数据,强制更新文件长度 方法 2:调用 CH375FileClose,关闭文件,总是自动更新文件长度 方法 3:调用 CH375FileModify,指定修改文件长度 在扇区模式下,子程序库只能自动处理 512倍数的文件长度,在关闭文件时,可以选择自动更新 文件长度或者不更新,如果文件中有效数据的长度是 512的倍数,那么可以指定自动更新,如果有效 数据的长度不是 512的倍数,那么可以由 CH375FileModify修改文件长度。在扇区模式下修改文件长 度有 3种方法: 方法 1:调用 CH375FileWrite,写入 0 扇区数据,强制更新文件长度,如果希望文件长度不 是 512的倍数,那么应该事先人为修改 CH375vFileSize 方法 2:调用 CH375FileClose,关闭文件,指定自动更新文件长度,如果希望文件长度不是 512的倍数,那么应该事先人为修改 CH375vFileSize 方法 3:调用 CH375FileModify,指定修改文件长度 虽然子程序库最大支持 1GB的文件,但是为了提高效率,建议单个文件的长度不要超过 100MB, 通常在几 KB到几 MB范围是比较正常的。 CH375的 U盘文件级子程序库 4 5、操作步骤 5.1. 子程序库提供的子程序总表 子程序分类 子程序简称 用途和概述(详细说明见后) CH375Init 初始化 CH375芯片,可以用 CH375LibInit代替 CH375DiskConnect 查询 U盘是否连接,建议不要频繁查询 CH375DiskReady 查询 U盘是否准备就绪,通常在就绪后才能读写 CH375FileOpen 打开指定名称的文件或者目录 CH375FileEnumer 搜索枚举指定目录下的文件,返回文件名 CH375FileCreate 新建文件并打开,如果文件已存在则先删除再新建 常用的 基本子程序 CH375FileClose 关闭当前文件 CH375FileLocate 以扇区为单位移动当前文件指针 CH375FileReadX 以扇区为单位从当前文件读取数据 扇区模式 读写文件 CH375FileWriteX 以扇区为单位向当前文件写入数据 CH375ByteLocate 以字节为单位移动当前文件指针,进入字节模式 CH375ByteRead 以字节为单位从当前文件读取数据,进入字节模式 字节模式 读写文件 CH375ByteWrite 以字节为单位向当前文件写入数据,进入字节模式 CH375FileQuery 查询当前文件的信息:长度,日期,时间等 查询修改 文件信息 CH375FileModify 查询或修改当前文件的信息:长度,日期,时间等 CH375DirtyBuffer 清除磁盘缓冲区,如果临时用过 DISK_BASE_BUF CH375DiskSize 查询磁盘总容量:U盘/闪盘/移动硬盘的物理容量 CH375DiskQuery 查询磁盘信息:U盘总容量,U盘剩余容量等 偶尔用到 CH375FileErase 删除文件并关闭 CH375GetVer 获取当前子程序库的版本号 CH375Reset 复位 CH375芯片 备用 CH375BulkOnlyCmd 执行基于 BulkOnly 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 的命令 5.2. 常用步骤简述,可以根据实际情况进行调整 5.2.1. 初始化(进行任何一种文件操作之前的必要步骤) ⑴ CH375Init,进入 USB-HOST工作方式 ⑵ 等待 U盘连接(中断方式依靠 CH375事件 通知 关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知 ,查询方式依靠主动查询) ⑶ CH375DiskReady,可选步骤,建议执行此步骤 ⑷ CH375DiskSize,可选步骤,通常不需要 5.2.2 顺序读文件 ⑴ CH375FileOpen,打开文件 ⑵ 多次 CH375FileRead或 CH375ByteRead,读取数据 ⑶ CH375FileClose,关闭文件 5.2.3 读文件的指定位置 ⑴ CH375FileOpen,打开文件 ⑵ CH375FileLocate或 CH375ByteLocate,移动文件指针到指定位置 ⑶ 多次 CH375FileRead或 CH375ByteRead,读取数据,期间还可以移动文件指针 ⑷ CH375FileClose,关闭文件 CH375的 U盘文件级子程序库 5 5.2.4 顺序改写文件(覆盖原数据,超过原文件长度后转变为追加数据) ⑴ CH375FileOpen,打开文件 ⑵ 多次 CH375FileWrite或 CH375ByteWrite,写入数据 ⑶ 如果是追加数据导致文件长度增大,那么需要参考修改文件长度的几种方法 ⑷ CH375FileClose,关闭文件,如果是字节模式,将自动更新文件长度 5.2.5 改写文件的指定位置(覆盖原数据,超过原文件长度后转变为追加数据) ⑴ CH375FileOpen,打开文件 ⑵ CH375FileLocate或 CH375ByteLocate,移动文件指针到指定位置 ⑶ 多次 CH375FileWrite或 CH375ByteWrite,写入数据,期间还可以移动文件指针 ⑷ 如果是追加数据导致文件长度增大,那么需要参考修改文件长度的几种方法 ⑸ CH375FileClose,关闭文件,如果是字节模式,将自动更新文件长度 5.2.6 向已有文件追加数据 ⑴ CH375FileOpen,打开文件 ⑵ CH375FileLocate或 CH375ByteLocate,移动文件指针到末尾,0xFFFFFFFF ⑶ 多次 CH375FileWrite或 CH375ByteWrite,写入数据 ⑷ 如果是追加数据导致文件长度增大,那么需要参考修改文件长度的几种方法 ⑸ CH375FileClose,关闭文件,如果是字节模式,将自动更新文件长度 5.2.7 新建文件 ⑴ CH375FileCreate,新建文件 ⑵ 多次 CH375FileWrite或 CH375ByteWrite,写入数据 ⑶ 如果是追加数据导致文件长度增大,那么需要参考修改文件长度的几种方法 ⑷ CH375FileClose,关闭文件,如果是字节模式,将自动更新文件长度 5.2.8 先读文件再改写文件 ⑴ CH375FileOpen,打开文件 ⑵ 多次 CH375FileRead或 CH375ByteRead,读取数据 ⑶ CH375FileLocate或 CH375ByteLocate,移动文件指针到头部,00000000 ⑷ 多次 CH375FileWrite或 CH375ByteWrite,写入数据,覆盖原数据 ⑸ 如果是追加数据导致文件长度增大,那么需要参考修改文件长度的几种方法 ⑹ CH375FileClose,关闭文件,如果是字节模式,将自动更新文件长度 5.2.9 先写文件再读文件复查 ⑴ CH375FileOpen,打开文件 ⑵ 多次 CH375FileWrite或 CH375ByteWrite,写入数据 ⑶ CH375FileLocate或 CH375ByteLocate,移动文件指针到头部,00000000 ⑷ 多次 CH375FileRead或 CH375ByteRead,读取数据,复查 ⑸ 如果是追加数据导致文件长度增大,那么需要参考修改文件长度的几种方法 ⑹ CH375FileClose,关闭文件,如果是字节模式,将自动更新文件长度 5.2.10 如果文件已经存在则追加数据,如果文件不存在则新建文件再写入数据 ⑴ CH375FileOpen,打开文件,如果返回 ERR_MISS_FILE文件不存在,则转到步骤⑷ ⑵ CH375FileLocate或 CH375ByteLocate,移动文件指针到末尾,0xFFFFFFFF ⑶ 转到步骤⑸,准备追加数据 ⑷ CH375FileCreate,新建文件,准备写入数据 ⑸ 多次 CH375FileWrite或 CH375ByteWrite,写入数据 ⑹ 如果是追加数据导致文件长度增大,那么需要参考修改文件长度的几种方法 ⑺ CH375FileClose,关闭文件,如果是字节模式,将自动更新文件长度 CH375的 U盘文件级子程序库 6 5.2.11 定期采集数据(适用于数据量较小的情况) ⑴ 采集之前,CH375FileCreate,新建文件 ⑵ 采集数据,转换为相应的格式,例如二进制数据、字符串等 ⑶ CH375ByteWrite,写入数据,一次写不完,可以分多次写入 ⑷ 如果要等很长时间才有下一组数据,为了避免在此期间发生断电、U 盘拔出等事件,导致文件长 度不正确,可以用 CH375ByteWrite写入空数据,强制更新文件长度 ⑸ 如果整个采集过程结束,或者文件已经太大,那么转到步骤⑹,否则转到步骤⑵ ⑹ CH375FileClose,关闭文件,自动更新文件长度 ⑺ 如果是因为文件已经太大的原因,那么转到步骤⑴,新建另一个文件继续 6、变量和子程序 6.1 子程序库提供的全局变量 CH375IntStatus; /* CH375操作的中断状态 */ 由 CH375执行的非即时操作,通常是 CH375在执行完成后,以中断方式通知单片机,INT#引脚输 出低电平,直到单片机发出 GET-STATUS命令才恢复高电平。单片机也可以用查询方式查询 CH375 的 INT#引脚,如果是低电平则说明 CH375操作完成,然后再用 GET-STATUS命令获取状态。如果 是中断方式,则该单元由中断服务程序刷新;如果是查询方式,则由查询程序刷新。 CH375DiskStatus; /* 磁盘及文件状态 */ CH375 的子程序以及中断服务程序或者查询程序共同维护一个全局变量,用于表示当前 CH375 以 及磁盘的工作状态。子程序根据这个状态决定是否执行某操作,或者决定是否重新初始化。只有 CH375 的初始化程序和各个 U 盘文件级子程序,以及中断服务程序或者查询程序可以修改该单元 的数值,其它程序不应该修改但可以查询,以便了解当前 CH375或 U盘的工作状态。 CH375LibConfig; /* CH375程序库配置 */ 位 7:保留(原为 CH375的 INT#引脚连接方式:0=“查询方式”,1=“中断方式”) 位 5:在写操作结束后是否延时: 0=“写后延时”(建议),1=“不延时” 位 4:在添加数据后是否自动更新文件长度:0=“不更新”,1=“自动更新” 位 3 位 2:针对文件读写的多扇区数据的复制方式:00=“外部子程序”,01=“单 DPTR 复制”, 10=“双 DPTR复制”,11=“单 DPTR和 P2+R0复制”,后 3种只针对 MCS51单片机 位 1位 0:针对磁盘读写的单扇区数据的复制方式:00=“单 DPTR复制”,01=“单 DPTR复制”, 10=“双 DPTR复制”,11=“单 DPTR和 P2+R0复制”,这 4种只针对 MCS51单片机 由于 MCS51单片机复制外部 RAM中的数据时比较慢,所以子程序库提供几种优化速度的方式,而对于 其它单片机,方式 1、2、3相同,不需要区分。以下是 MCS51单片机的数据复制方式: 方式 0:“外部子程序”,只适用于文件读写时的数据复制(只用于 CH375FileRead和 CH375FileWrite 两个子程序),是指由子程序 xWriteToExtBuf 和 xReadFromExtBuf 进行数据复制,这两个 子程序是在应用程序中定义的,被 CH375的子程序库调用 方式 1:“单 DPTR复制”,最常规的数据复制方式,使用一个 DPTR来回切换,每传输一个字节需要 16个机器周期,速度最慢,适用于所有 MCS51单片机 方式 2:“双 DPTR复制”,针对特定硬件的数据复制方式,使用两个 DPTR,每传输一个字节需要 10 个机器周期,速度较快,适用于 ATMEL/PHILIPS/SST等具有双 DPTR及 DPS的单片机 方式 3:“单 DPTR和 P2+R0复制”,用 P2+R0指向 CH375的 I/O端口并且用 DPTR指向外部 RAM进行 数据复制,每传输一个字节需要 6.25个机器周期,速度最快,适用于所有标准的 MCS51单 片机,但是某些单片机在启用内置的外部 RAM时会关闭 P2+R0的功能,所以可能不适用 对于以扇区为单位的文件数据读写,也就是应用程序调用 CH375FileRead和 CH375FileWrite子程序 CH375的 U盘文件级子程序库 7 时:在方式 0下,由应用程序在 xWriteToExtBuf和 xReadFromExtBuf子程序中自行管理缓冲区,设 定缓冲区初值等;在方式 1、2、3下,应用程序每次调用 CH375FileRead和 CH375FileWrite时,CH375 的程序库都会从 FILE_DATA_BUF的起始地址开始读写数据。 下面的全局变量用于特定用途,通常情况下,应用程序不会用到,并且绝对不应该修改。 CH375vDiskFat; /* 当前逻辑盘的 FAT标志:1=FAT12,2=FAT16,3=FAT32 */ CH375vSecPerClus; /* 当前逻辑盘的每簇扇区数 */ CH375vStartCluster; /* 当前文件或者目录的起始簇号 */ CH375vFileSize; /* 当前文件的长度,必要时可以人为修改 */ CH375vCurrentOffset; /* 当前文件指针,当前读写位置的字节偏移 */ 如果在包含头文件 CH375HF?.H之前定义了 EN_CH375LIB_MORE常量,那么还提供以下全局变量。 CH375Version2; /* 芯片版本:0-CH375,1-CH375A */ CH375vDataStart; /* 逻辑盘的数据区域的起始 LBA */ CH375vFdtLba; /* 当前 FDT所在的 LBA地址 */ CH375vFdtOffset; /* 当前 FDT在扇区内的偏移地址 */ CH375vDiskRoot; /* 对于 FAT16为根目录占用扇区数,对于 FAT32为根目录起始簇号 */ 6.2 子程序库提供的子程序 CH375GetVer( ); /* 获取当前子程序库的版本号 */ CH375Reset( ); /* 复位 CH375,如果工作环境差易受干扰,可以在使用 CH375前调用 */ CH375Init( ); /* 初始化 CH375,在开机后或者复位 CH375之后,应该初始化 */ CH375DiskConnect( ); /* 检查磁盘是否连接 */ 检查 USB磁盘是否连接。示例: i=CH375DiskConnect( ); /* 查询 U盘是否连接 */ if ( i!=ERR_SUCCESS ) /* 已经断开 */ else /* 已经连接 */ CH375DiskReady( ); /* 查询磁盘是否准备好 */ 检查 USB磁盘是否准备好,大多数 U盘不需要这一步,但是某些 U盘必须要执行这一步才能允许 数据读写,所以建议在 U盘连接后先执行该命令,再进行文件读写。示例: i=CH375DiskReady( ); /* 查询 U盘是否准备好,有些 U盘必须要调用一次该子程序 */ if ( i!=ERR_SUCCESS ) /* 还未准备好 */ else /* 准备好了,可以读写数据 */ CH375FileOpen( ); /* 打开文件或者目录,或者枚举文件 */ ① 打开文件 调用前,应该在 mCmdParam.Open.mPathName中提供文件名,包括完整的路径名,例如 C:\WINDOWS/SYSTEM/MYLIB.DLL \TODAY1.TXT \YEAR2004\MONTH05\DATE18.DAT 路径名和文件名的格式与 DOS 文件名格式相同,但是盘符和冒号可以省略,左斜杠与右斜杠等 效,所有字符必须是大写,不能使用通配符,文件名长度不超过 11个字符,其中主文件名不超 过 8个字符,扩展名不超过 3个字符,如果有扩展名,则用小数点与主文件名隔开。由于单片 机 RAM有限,路径名有长度限制,最大长度是 MAX_PATH_LEN-1个字符,所以子目录的深度不宜 超过 5级,如果是为 RAM较大的单片机定制子程序库,则可以没有长度限制。示例: strcpy( mCmdParam.Open.mPathName, "\\YEAR2004\\CH375HFT.C" ); CH375FileOpen( ); /* 打开文件 */ CH375的 U盘文件级子程序库 8 如果路径名太长,那么可以分多次逐级打开,首先打开子目录,直到最后再打开文件,其中, 首次打开必须是从根目录开始,所以路径名首字符必须是斜杠,以后接着前级再打开时的首字 符必须不是斜杠。示例:打开文件"/YEAR2004/MONTH05/DATE18/HOUR08/ADC.TXT" strcpy( mCmdParam.Open.mPathName, "/YEAR2004/MONTH05/DATE18" ); /* 目录名 */ i=CH375FileOpen( ); /* 因为路径名太长,所以分两次打开,先打开前 3级子目录 */ if ( i==ERR_SUCCESS ) { /* 前 3级子目录成功打开,下面接着打开下级目录及文件 */ strcpy( mCmdParam.Open.mPathName, "HOUR08/ADC.TXT" ); /* 首字符不是斜杠 */ i=CH375FileOpen( ); /* 打开第 4级子目录和文件 */ } if ( i!=ERR_SUCCESS ) /* 出错 */ else /* 成功打开文件 */ 如果文件名参数为"/"则可以打开根目录,从而便于自行处理长文件名,用完后必须关闭。如果 打开的是子目录,那么文件长度 CH375vFileSize总是 0xFFFFFFFF,否则为真正的文件长度。 ② 枚举文件(查询文件),与 CH375FileEnumer相同,但是返回值不同(ERR_FOUND_NAME) CH375FileEnumer( ); /* 枚举文件 */ 如果需要查询文件,可以通过该子程序进行枚举,方法是,以通配符*代替需要查询的文件名中的 全部或者部分字符,通配符*后面不能再有字符,而必须跟有枚举序号,例如 C:\WINDOWS\SYSTEM\* 枚举 C:\WINDOWS\SYSTEM\目录下的所有文件,例如 ABC.EXE或者 NEW.TXT等 \TODAY1.* 枚举根目录下以 TODAY1为主文件名的所有文件,例如 TODAY1.C或者 TODAY1 \YEAR2004\MONTH05\DATE1* 枚举\YEAR2004\MONTH05\目录下以 DATE1开头的所有文件,例如 DATE12.TXT或者 DATA1 由于符合条件的文件名通常会很多,所以需要指定序号,序号指定在通配符*之后,例如 \TODAY1.*\x0 (这是 C语言表达方式,“\x0”代表一字节数据 00H) 枚举根目录下以 TODAY1为主文件名的文件,返回搜索到的第 1个匹配文件名 \TODAY1.*\x5 (这是 C语言表达方式,“\x5”代表一字节数据 05H) 枚举根目录下以 TODAY1为主文件名的文件,返回搜索到的第 6个匹配文件名 \YEAR2004\DATE1*\x10 (这是 C语言表达方式,“\x10”代表一字节数据 10H) 枚举\YEAR2004\目录下以 DATE1为开头的文件,返回搜索到的第 17个匹配文件名 \YEAR2004\DATE1*\xFF (这是 C语言表达方式,“\xFF”代表一字节数据 255) 枚举\YEAR2004\目录下以 DATE1为开头的文件,返回搜索到的由 CH375vFileSize指定序 号的匹配文件名,即当通配符*后的序号为 255时,将由变量 CH375vFileSize指定序号 如果调用 CH375FileEnumer时指定带有通配符*的文件名,那么该子程序将枚举文件名,并且计数 到通配符*后的序号再返回搜索到的匹配文件名。枚举文件并不会打开文件,如果需要对搜索到的 文件进行读写,可以再调用 CH375FileOpen打开返回的文件名。在评估板资料 FILELIB3子目录下 的 CH375HFT.C中有枚举程序示例,可以显示根目录或者子目录下的所有文件。示例: for ( c=0; c<255; c++ ) { /* 最多搜索前 255个文件 */ strcpy( mCmdParam.Enumer.mPathName, "\\C51\\CH375*" ); /* 在 C51子目录下搜索以 CH375开头的文件名,*为通配符 */ i = strlen( mCmdParam.Enumer.mPathName ); /* 计算文件名长度,指向结束符 */ mCmdParam.Enumer.mPathName[i] = c; /* 将结束符替换为搜索的序号,从 0到 254 */ i=CH375FileEnumer( ); /* 文件名中含有通配符*,枚举/搜索文件而不打开 */ if ( i==ERR_MISS_FILE ) break; /* 再也搜索不到匹配文件,已经没有匹配的文件名 */ if ( i!=ERR_SUCCESS ) break; /* 出错 */ printf( "found name %d#: %s\n", (unsigned int)c, mCmdParam.Enumer.mPathName ); /* 搜索到相匹配的文件名,显示序号和搜索到的匹配文件名或者子目录名 */ } 枚举更多数量的文件的例子: for ( int count=0; count<20000; count++ ) { /* 最多搜索前 20000个文件 */ CH375的 U盘文件级子程序库 9 strcpy( mCmdParam.Enumer.mPathName, "\\*" ); /* 在根目录下搜索所有文件名 */ i = strlen( mCmdParam.Enumer.mPathName ); /* 计算文件名长度,指向结束符 */ mCmdParam.Enumer.mPathName[i] = 0xFF; /* 将结束符替换为 255说明序号在变量中 */ CH375vFileSize = count; /* 指定搜索的序号,几乎没有上限 */ i=CH375FileEnumer( ); /* 文件名中含有通配符*,枚举/搜索文件而不打开 */ if ( i==ERR_MISS_FILE ) break; /* 再也搜索不到匹配文件,已经没有匹配的文件名 */ if ( i!=ERR_SUCCESS ) break; /* 出错 */ printf( "found name %d#: %s\n", count, mCmdParam.Enumer.mPathName ); /* 搜索到相匹配的文件名,显示序号和搜索到的匹配文件名或者子目录名 */ if ( CH375vFileSize!=0xFFFFFFFF ) printf( "this is a file\n" ); /* 枚举到文件 */ else printf( "this is a directory\n" ); /* 枚举到子目录 */ } CH375FileClose( ); /* 关闭当前文件 */ 打开文件使用完毕后,应该关闭文件。对于读操作,关闭文件是可选操作。对于写操作,关闭文 件的同时,可以让子程序自动更新文件长度。在扇区模式下,自动更新的文件长度是以扇区为单 位计算的,所以文件长度通常是 512的倍数,mCmdParam.Close.mUpdateLen为 1时自动更新文件 长度(如果已经对该文件执行写操作添加了数据),为 0时不要自动更新文件长度。在字节模式下, 自动更新的文件长度是以字节为单位,所以可以获得适当的长度。在扇区模式下,如果希望文件 长度不是 512的倍数,那么单片机可以在关闭文件前调用 CH375FileModify修改文件为指定的长 度,并且在关闭文件时指定不要自动更新文件长度。对于以字节为单位的文件读写,关闭文件时 能够自动更新为适当的文件长度,所以不需要调用 CH375FileModify修改文件长度。 CH375FileQuery( ); /* 查询当前文件的信息 */ 查询当前已打开文件的属性、日期、时间、长度等信息。返回时 mCmdParam.Modify.mFileSize中是文件的长度,以字节为单位,长度可以是 0 mCmdParam.Modify.mFileDate中是文件修改时间,格式参考 CH375HF?.H中的说明 mCmdParam.Modify.mFileTime中是文件修改时间,格式参考 CH375HF?.H中的说明 mCmdParam.Modify.mFileAttr中是文件属性,例如数值 01H说明该文件是只读文件 CH375FileModify( ); /* 查询或者修改当前文件的信息 */ 与 CH375FileQuery对应,该子程序用于修改当前已打开文件的属性、日期、时间、长度等。输入 参数中,如果参数的新值指定为 0xFFFFFFFF,那么该参数将保持原值,否则将被修改为新值。 mCmdParam.Modify.mFileSize指定新的文件长度,为 0FFFFFFFFH则不修改,返回原长度 mCmdParam.Modify.mFileDate指定新的文件日期,为 0FFFFH则不修改,返回原日期 mCmdParam.Modify.mFileTime指定新的文件时间,为 0FFFFH则不修改,返回原时间 mCmdParam.Modify.mFileAttr指定新的文件属性,为 0FFH则不修改,返回原属性 例如在 mCmdParam.Modify.mFileSize中指定 1105,而在其它单元中指定 0FFFFH,则将已打开文 件的长度修改为 1105,但是不修改文件属性、时间和日期。示例: mCmdParam.Modify.mFileAttr = ATTR_READ_ONLY; /* 指定新的文件属性为只读 */ mCmdParam.Modify.mFileTime = 0xffff; /* 不修改原文件时间 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2006, 3, 28 ); /* CH375HF?.H宏定义 */ /* 指定新的文件日期是 2006.03.28 */ mCmdParam.Modify.mFileSize = 1105; /* 指定新的文件长度是 1105字节 */ CH375FileModify( ); /* 修改当前文件的信息,修改属性、日期和长度 */ CH375FileLocate( ); /* 以扇区为单位移动当前文件指针 */ 移动当前已打开文件的指针,用于从指定位置读取数据,或者向指定位置写入数据。例如,单片 机希望跳过文件的前 1024字节再读取数据,那么可以在 mCmdParam.Locate.mSectorOffset参数 中输入 2,调用该子程序将文件指针移动到 2个扇区后,也就是从 1024字节开始。对于写操作, CH375的 U盘文件级子程序库 10 如果单片机打算在原文件的尾部继续添加数据,而不希望影响前面的原有数据,那么可以指定一 个很大的扇区偏移,例如在 mCmdParam.Locate.mSectorOffset 参数中输入 0FFFFFFFFH,将文件 指针移动原文件的末尾,以便追加数据。该子程序将文件长度 CH375vFileSize取整转换为扇区数 后作为最大文件指针,如果文件长度不是 512的倍数,那么文件尾部不足一个扇区的零碎数据部 分将被忽略。该子程序返回时,mCmdParam.Locate.mSectorOffset为当前文件指针所指向的数据 在磁盘中的 LBA扇区号,如果是 0FFFFFFFFH则说明已到文件尾。 CH375FileRead( ); /* 以扇区为单位从当前文件读取数据,建议用 CH375FileReadX */ 从当前已打开文件中读取数据,每次读取后自动移动文件指针,第二次调用时将从第一次读取数 据的后面继续读取数据。在调用该子程序前,应该在 mCmdParam.Read.mSectorCount中指定需要 读取的扇区数,所以读取数据的长度总是 512的倍数。该子程序会根据 CH375vFileSize自动检查 文件是否结束,如果文件已经结束,那么返回时在 mCmdParam.Read.mSectorCount中为实际读出 的扇区数,所以判断 mCmdParam.Read.mSectorCount如果变小就说明文件已经结束。如果文件长 度不是 512的倍数,那么文件尾部不足一个扇区的零碎数据部分将被忽略,如果必须读出文件尾 部不足一个扇区的零碎数据,那么可以临时增大 CH375vFileSize以读出最后一个扇区(实际有效 数据不足一个扇区),然后再恢复原 CH375vFileSize,注意此时的文件指针已经无效。 早期版本的子程序只检查文件结束簇,所以有可能会返回结束簇的所有数据,而不管其是否超过 文件长度,单片机应该查询文件长度,以免将文件结束簇中的无效数据当作有效数据处理。 如果在程序库配置 CH375LibConfig中指定文件读写的多扇区数据的复制方式为“外部子程序”, 那么 CH375FileRead子程序将调用应用程序中定义的子程序 xWriteToExtBuf从 CH375读出数据到 外部的文件数据缓冲区中,否则 CH375FileRead子程序自行向文件数据缓冲区保存数据。 只有在定义 FILE_DATA_BUF_LEN时,子程序库才支持 CH375FileRead,建议用 CH375FileReadX代 替,后者支持双缓冲区读操作,而前者不支持。 CH375FileReadX( ); /* 以扇区为单位从当前文件读取数据到指定缓冲区 */ 与 CH375FileRead的唯一区别是可以在 mCmdParam.ReadX.mDataBuffer中指定缓冲区起始地址, 子程序返回后更新为当前缓冲区地址(也就是起始地址加上已经读取的长度)。 CH375ByteLocate( ); /* 以字节为单位移动当前文件指针,进入字节模式 */ 移动当前已打开文件的指针,用于从指定位置读取数据,或者向指定位置写入数据。例如,单片 机希望跳过文件的前 18字节再读取数据,那么可以在 mCmdParam.ByteLocate.mByteOffset参数 中输入 18,调用该子程序将文件指针移动到 18 个字节后,也就是紧接在后面的读写操作将从第 18字节开始。对于写操作,如果单片机打算在原文件的尾部继续添加数据,而不希望影响前面的 原有数据,那么可以指定一个很大的字节偏移,例如在 mCmdParam.ByteLocate.mByteOffset参数 中输入 0FFFFFFFFH,将文件指针移动原文件的末尾,以便追加数据。示例: mCmdParam.ByteLocate.mByteOffset = 192; /* 移动文件指针到第 193字节 */ CH375ByteLocate( ); /* 移动文件指针,跳过文件头部的 192个字节 */ /* 以字节为单位进行文件读写操作,读写操作从第 193字节的位置开始 */ mCmdParam.ByteLocate.mByteOffset = 0xffffffff; /* 移动文件指针到文件末尾 */ CH375ByteLocate( ); /* 移动文件指针,以便在原文件的末尾追加数据 */ CH375ByteRead( ); /* 以字节为单位从当前文件读取数据块,进入字节模式 */ 从当前已打开文件中读取数据,每次读取后自动移动文件指针,第二次调用子程序时将从第一次 读取数据的后面继续读取数据。输入参数应该在 mCmdParam.ByteRead.mByteCount中指定需要读 取的字节数,字节数不能超过 MAX_BYTE_IO和 sizeof(mCmdParam.ByteRead.mByteBuffer),子程 序返回后,读出的数据块被存放在 mCmdParam.ByteRead.mByteBuffer中。该子程序会自动检查文 件是否结束,如果文件已经结束,那么返回时在 mCmdParam.ByteRead.mByteCount中为实际读出 的字节数,所以判断 mCmdParam.ByteRead.mByteCount如果变小就说明文件已经结束。示例: mCmdParam.ByteRead.mByteCount = 9; /* 准备读出 9个字节,如果返回小于 9则文件结束 */ i=CH375ByteRead( ); /* 以字节为单位从文件读出数据块 */ CH375的 U盘文件级子程序库 11 if ( i!=ERR_SUCCESS ) /* 出错 */ else /* 成功 */ if ( mCmdParam.ByteRead.mByteCount < 9 ) 已经到文件结尾,所以实际读出的长度变小了 /* 在 mCmdParam.ByteRead.mByteBuffer中为读出的数据
本文档为【CH375HF】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_640506
暂无简介~
格式:pdf
大小:186KB
软件:PDF阅读器
页数:16
分类:互联网
上传时间:2012-11-12
浏览量:64