CH376命令和系统子程序

更新时间:2024-01-21 14:16:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

8.4. 快速应用参考步骤

请参考例子程序调用已经将多个命令打包后的子程序。以下步骤使用原始命令码,仅供参考。 8.4.1. 初始化,进行任何一项文件操作之前的必要步骤

① CMD_SET_USB_MODE 命令,进入USB-HOST 工作方式或者SD 卡主机工作方式(模式3)

② 等待U 盘或者SD 卡连接,U 盘可以由CH376 自动检测并产生中断通知,或者由单片机向CH376 发出CMD_DISK_CONNECT 命令定期查询,SD 卡必须由单片机自行检测 ③ CMD_DISK_MOUNT 命令,初始化U 盘或者SD 卡,并测试磁盘是否就绪,失败后可以重试最多5 次

④ 上述步骤只需执行一次,除非U 盘或者SD 卡断开后重新连接,那么必须回到步骤② 8.4.2. 顺序读文件

① CMD_SET_FILE_NAME 命令+CMD_FILE_OPEN 命令,打开文件

② 多次CMD_BYTE_READ 命令+CMD_RD_USB_DATA0 命令+CMD_BYTE_RD_GO 命令,读取数据

③ CMD_FILE_CLOSE 命令,关闭文件,可选操作

8.4.3. 顺序改写文件(覆盖原数据,超过原文件长度后转变为追加数据) ① CMD_SET_FILE_NAME 命令+CMD_FILE_OPEN 命令,打开文件

② 多次CMD_BYTE_WRITE 命令+CMD_WR_REQ_DATA 命令+CMD_BYTE_WR_GO 命令,写入数据

③ CMD_FILE_CLOSE 命令,参数是1,关闭文件并允许自动更新文件长度 8.4.4. 向已有文件追加数据 CH376 手册(一) 24

① CMD_SET_FILE_NAME 命令+CMD_FILE_OPEN 命令,打开文件

② CMD_BYTE_LOCATE 命令,参数是0FFFFFFFFH,移动文件指针到文件末尾

③ 多次CMD_BYTE_WRITE 命令+CMD_WR_REQ_DATA 命令+CMD_BYTE_WR_GO 命令,写入数据

④ CMD_FILE_CLOSE 命令,参数是1,关闭文件并允许自动更新文件长度 8.4.5. 新建文件并写入数据

① CMD_SET_FILE_NAME 命令+CMD_FILE_CREATE 命令,新建文件

② 多次CMD_BYTE_WRITE 命令+CMD_WR_REQ_DATA 命令+CMD_BYTE_WR_GO 命令,写入数据

③ CMD_FILE_CLOSE 命令,参数是1,关闭文件并允许自动更新文件长度 8.4.6. 先读文件再改写文件

① CMD_SET_FILE_NAME 命令+CMD_FILE_OPEN 命令,打开文件

② 多次CMD_BYTE_READ 命令+CMD_RD_USB_DATA0 命令+CMD_BYTE_RD_GO 命令,读取数据

③ CMD_BYTE_LOCATE 命令,参数是0,移动文件指针到文件头部

④ 多次CMD_BYTE_WRITE 命令+CMD_WR_REQ_DATA 命令+CMD_BYTE_WR_GO 命令,写入数据

⑤ CMD_FILE_CLOSE 命令,参数是1,关闭文件并允许自动更新文件长度 8.4.7. 如果文件已经存在则追加数据,如果文件不存在则新建文件再写入数据 ① CMD_SET_FILE_NAME 命令+CMD_FILE_OPEN 命令,打开文件,如果返回ERR_MISS_FILE 说明文件不存在,那么转步骤③

② CMD_BYTE_LOCATE 命令,参数是0FFFFFFFFH,移动文件指针到文件末尾,然后

转步骤④

③ CMD_FILE_CREATE 命令,新建文件

④ 多次CMD_BYTE_WRITE 命令+CMD_WR_REQ_DATA 命令+CMD_BYTE_WR_GO 命令,写入数据

⑤ CMD_FILE_CLOSE 命令,参数是1,关闭文件并允许自动更新文件长度

8.4.8. 修改文件名、文件日期/时间、文件长度等文件目录信息,请参考有关EXAM10 例子中的说明

① CMD_SET_FILE_NAME 命令+CMD_FILE_OPEN 命令,打开文件

② CMD_DIR_INFO_READ 命令,参数是0FFH,将文件目录信息读入内存 ③ 用CMD_RD_USB_DATA0 命令读出原文件目录信息

④ CMD_DIR_INFO_READ 命令,参数是0FFH,将文件目录信息读入内存 ⑤ 用CMD_WR_OFS_DATA 命令写入新的文件目录信息 ⑥ CMD_DIR_INFO_SAVE 命令,保存文件目录信息

⑦ CMD_FILE_CLOSE 命令,参数是0,关闭文件并禁止自动更新文件长度,可选操作 8.4.9. 创建子目录(文件夹),请参考有关EXAM9 例子中的说明

① CMD_SET_FILE_NAME 命令+CMD_DIR_CREATE 命令,新建子目录(文件夹) ② CMD_FILE_CLOSE 命令,参数是0,关闭文件并禁止自动更新文件长度 8.4.10. 处理小写文件名和长文件名,请参考有关EXAM11 例子中的说明

8.4.11. 搜索和枚举文件名,全盘枚举所有文件,请参考有关EXAM13 例子中的说明 8.4.12. 主从切换,与计算机通讯,读写U 盘或者SD 卡文件,请参考有关EXAM0 例子中的说明

8.5. USB设备应用

请参考CH372 芯片的手册CH372DS1.PDF 及其应用资料。

CH376芯片 文件系统层 V1.0

* 提供文件系统常用子程序,提供命令打包.不使用的子程序可以注释掉,从而节约单片机的程序ROM空间和数据RAM空间.

/* name 参数是指短文件名, 可以包括根目录符, 但不含有路径分隔符, 总长度不超过1+8+1+3+1字节 */

/* Path Name 参数是指全路径的短文件名, 包括根目录符、多级子目录及路径分隔符、文件名/目录名 */

/* Long Name 参数是指长文件名, 以UNICODE小端顺序编码, 以两个0字节结束, 使用长文件名子程序必须先定义全局缓冲区GlobalBuf,长度不小于64字节, 可以与其它子程序共*/

/* 定义 NO_DEFAULT_CH376_INT 用于禁止默认的Wait376Interrupt子程序,禁止后,应用程序必须自行定义一个同名子程序 */

/* 定义 DEF_INT_TIMEOUT 用于设置默认的Wait376Interrupt子程序中的等待中断的超时时间/循环计数值, 0则不检查超时而一直等待 */

/* 定义 EN_DIR_CREATE 用于提供新建多级子目录的子程序,默认是不提供 */

/* 定义 EN_DISK_QUERY 用于提供磁盘容量查询和剩余空间查询的子程序,默认提供 */ /* 定义 EN_SECTOR_ACCESS 用于提供以扇区为单位读写文件的子程序,默认是不提供 */ /* 定义 EN_LONG_NAME 用于提供支持长文件名的子程序,默认是不提供 */

#ifndef __CH376_FS_H__ #define __CH376_FS_H__ #include\

#define STRUCT_OFFSET( s, m ) ( (UINT8)( & ((s *)0) -> m ) ) /* 定义获取结构成员相对偏移地址的宏 */ #ifdef EN_LONG_NAME

#ifndef LONG_NAME_BUF_LEN

#define LONG_NAME_BUF_LEN ( LONG_NAME_PER_DIR * 20 ) /* 自行定义的长文件名缓冲区长度,最小值为LONG_NAME_PER_DIR*1 */ #endif #endif

UINT8 CH376ReadBlock( PUINT8 buf ); /* 从当前主机端点的接收缓冲区读取数据块,返回长度 */

UINT8 CH376WriteReqBlock( PUINT8 buf ); /* 向内部指定缓冲区写入请求的数据块,返回长度 */

void CH376WriteHostBlock( PUINT8 buf, UINT8 len ); /* 向USB主机端点的发送缓冲区写入数据块 */

void CH376WriteOfsBlock( PUINT8 buf, UINT8 ofs, UINT8 len ); /* 向内部缓冲区指定偏移地址写入数据块 */

void CH376SetFileName( PUINT8 name ); /* 设置将要操作的文件的文件名 */ UINT32 CH376Read32bitDat( void ); /* 从CH376芯片读取32位的数据并结束命*/ UINT8 CH376ReadVar8( UINT8 var ); /* 读CH376芯片内部的8位变量 */ void CH376WriteVar8( UINT8 var, UINT8 dat ); /* 写CH376芯片内部的8位变量 */ UINT32 CH376ReadVar32( UINT8 var ); /* 读CH376芯片内部的32位变量 */ void CH376WriteVar32( UINT8 var, UINT32 dat );/* 写CH376芯片内部的32位变量 */

void CH376EndDirInfo( void );

/* 在调用CH376DirInfoRead获取FAT_DIR_INFO结构之后应该通知CH376结束 */ UINT32 CH376GetFileSize( void ); /* 读取当前文件长度 */ UINT8 CH376GetDiskStatus( void ); /* 获取磁盘和文件系统的工作状态 */ UINT8 CH376GetIntStatus( void ); /* 获取中断状态并取消中断请求 */ #ifndef NO_DEFAULT_CH376_INT UINT8 Wait376Interrupt( void ); /* 等待CH376中断(INT#低电平),返回中断状态码, 超时则返回ERR_USB_UNKNOWN */ #endif

UINT8 CH376SendCmdWaitInt(

UINT8

mCmd

UINT8

mDat

);

/* 发出命令码后,等待中断 */

UINT8 CH376SendCmdDatWaitInt( UINT8 /* 发出命令码和一字节数据后,等待中断 */ UINT8 CH376DiskReqSense(

mCmd, void

);

);

/* 检查USB存储器错误 */

UINT8 CH376DiskConnect(void); /* 检查U盘是否连接,不支持SD卡 */

UINT8 CH376DiskMount(void); /* 初始化磁盘并测试磁盘是否就绪 */ UINT8 CH376FileOpen(PUINT8 name); /* 在根目录或者当前目录下打开文件或者目录(文件夹) */ UINT8 CH376FileCreate( PUINT8 name ); /* 在根目录或者当前目录下新建文件,如果文件已经存在那么先删除 */ UINT8 CH376DirCreate( PUINT8 name ); /* 在根目录下新建目录(文件夹)并打开,如果目录已经存在那么直接打开 */ UINT8 CH376SeparatePath( PUINT8 path ); /* 从路径中分离出最后一级文件名或者目录(文件夹)名,返回最后一级文件名或者目录名的字节偏移 */

UINT8 CH376FileOpenDir( PUINT8 PathName, UINT8 StopName ); /* 打开多级目录下的文件或者目录的上级目录,支持多级目录路径,支持路径分隔符,路径长度不超过255个字符 */

/* StopName 指向最后一级文件名或者目录名 */ UINT8 CH376FileOpenPath( PUINT8 PathName ); /* 打开多级目录下的文件或者目录(文件夹),支持多级目录路径,支持路径分隔符,路径长度不超过255个字符 */

UINT8 CH376FileCreatePath( PUINT8 PathName ); /* 新建多级目录下的文件,支持多级目录路径,支持路径分隔符,路径长度不超过255个字符 */

#ifdef EN_DIR_CREATE

UINT8 CH376DirCreatePath( PUINT8 PathName ); /* 新建多级目录下的目录(文件夹)并打开,支持多级目录路径,支持路径分隔符,路径长度不超过255个字符 */ #endif

UINT8 CH376FileErase( PUINT8 PathName ); /* 删除文件,如果已经打开则直接删除,否则对于文件会先打开再删除,支持多级目录路径 */

UINT8 CH376FileClose( UINT8 UpdateSz ); /* 关闭当前已经打开的文件或者目录(文件夹) */

UINT8 CH376DirInfoRead(void); /* 读取当前文件的目录信息 */

UINT8 CH376DirInfoSave(void); /* 保存文件的目录信息 */ UINT8 CH376ByteLocate( UINT32 offset ); /* 以字节为单位移动当前文件指针 */

UINT8 CH376ByteRead( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ); /* 以字节为单位从当前位置读取数据块 */

UINT8 CH376ByteWrite( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ); /* 以字节为单位向当前位置写入数据块 */

UINT8 CH376DiskCapacity( PUINT32 DiskCap ); /* 查询磁盘物理容量,扇区数 */ UINT8 CH376DiskQuery( PUINT32 DiskFre ); /* 查询磁盘剩余空间信息,扇区数 */ UINT8 CH376SecLocate( UINT32 offset ); /* 以扇区为单位移动当前文件指针 */ #ifdef EN_SECTOR_ACCESS

UINT8 CH376DiskReadSec( PUINT8 buf, UINT32 iLbaStart, UINT8 iSectorCount ); /* 从U盘读取多个扇区的数据块到缓冲区,不支持SD卡 */

UINT8 CH376DiskWriteSec( PUINT8 buf, UINT32 iLbaStart, UINT8 iSectorCount ); /* 将缓冲区中的多个扇区的数据块写入U盘,不支持SD卡 */

UINT8 CH376SecRead( PUINT8 buf, UINT8 ReqCount, PUINT8 RealCount ); /* 以扇区为单位从当前位置读取数据块,不支持SD卡 */

UINT8 CH376SecWrite( PUINT8 buf, UINT8 ReqCount, PUINT8 RealCount ); /* 以扇区为单位在当前位置写入数据块,不支持SD卡 */ #endif

#ifdef EN_LONG_NAME

UINT8 CH376LongNameWrite( PUINT8 buf, UINT16 ReqCount ); /* 长文件名专用的字节写子程序 */ UINT8 CH376CheckNameSum( PUINT8 DirName ); /* 计算长文件名的短文件名检验和,输入为无小数点分隔符的固定11字节格式 */ UINT8 CH376LocateInUpDir( PUINT8 PathName ); /* 在上级目录(文件夹)中移动文件指针到当前文件目录信息所在的扇区 */

/* 另外,顺便将当前文件目录信息所在的扇区的前一个扇区的LBA地址写入CH376内部VAR_FAT_DIR_LBA变量(为了方便收集长文件名时向前搜索,否则要多移动一次) */ /* 使用了全局缓冲区GlobalBuf的前12个字节 */ UINT8 CH376GetLongName( PUINT8 PathName, PUINT8 LongName ); /* 由短文件名或者目录(文件夹)名获得相应的长文件名 */

/* 需要输入短文件名的完整路径PathName,需要提供缓冲区接收长文件名LongName(以UNICODE小端编码,以双0结束) */

/* 使用了全局缓冲区GlobalBuf的前34个字节,sizeof(GlobalBuf)>=sizeof(FAT_DIR_INFO)+2 */

UINT8 CH376CreateLongName( PUINT8 PathName, PUINT8 LongName ); /* 新建具有长文件名的文件,关闭文件后返回,LongName输入路径必须在RAM中 */

/* 需要输入短文件名的完整路径PathName(请事先参考FAT规范由长文件名自行产生),需要输入以UNICODE小端编码的以双0结束的长文件名LongName */ /* 使用了全局缓冲区GlobalBuf的前64个字节,sizeof(GlobalBuf)>=sizeof(FAT_DIR_INFO)*2 */ #endif #endif

本文来源:https://www.bwwdw.com/article/u9ro.html

Top