📄 ch375hft.c
字号:
mCmdParam.ReadX.mDataBuffer = 0x2000; /* 指向文件数据缓冲区的起始地址 */
mCmdParam.ReadX.mSectorCount = 1; /* 读取扇区数 */
CH375FileReadX( );
// CH375FileClose( ); /* 不做写操作可以无需关闭 */
}
}
}
}
void xFileNameEnumer( void ) /* 文件名枚举回调子程序,参考CH375HF6.H文件中的例子 */
{ /* 每搜索到一个文件FileOpen都会调用本回调程序,xFileNameEnumer返回后,FileOpen递减CH375vFileSize并继续枚举直到搜索不到文件或者目录 */
UINT8 i, c;
P_FAT_DIR_INFO pFileDir;
PUINT8X pNameBuf;
pFileDir = (P_FAT_DIR_INFO)( (PUINT8X)(&DISK_BASE_BUF[0]) + CH375vFdtOffset ); /* 当前FDT的起始地址 */
if ( pFileDir -> DIR_Name[0] == '.' ) return; /* 是本级或者上级目录名,必须丢弃不处理 */
if ( ( pFileDir -> DIR_Attr & ATTR_DIRECTORY ) == 0 ) { /* 判断是文件名 */
if ( pFileDir -> DIR_Name[8] == 'H' && pFileDir -> DIR_Name[9] == ' ' /* 过滤文件的扩展名,是".H"文件,则丢弃,不登记不处理 */
|| pFileDir -> DIR_Name[8] == 'E' && pFileDir -> DIR_Name[9] == 'X' && pFileDir -> DIR_Name[10] == 'E' ) return; /* 扩展名是".EXE"的文件,则丢弃 */
}
pNameBuf = & FileNameBuffer[ FileCount ].Name; /* 文件名结构中的文件名缓冲区 */
for ( i = 0; i < 11; i ++ ) { /* 复制文件名,长度为11个字符 */
c = pFileDir -> DIR_Name[ i ];
if ( i == 0 && c == 0x05 ) c = 0xE5; /* 特殊字符 */
if ( c != 0x20 ) { /* 有效字符 */
if ( i == 8 ) { /* 处理扩展名 */
*pNameBuf = '.'; /* 分隔符 */
pNameBuf ++;
}
*pNameBuf = c; /* 复制文件名的一个字符 */
pNameBuf ++;
}
}
*pNameBuf = 0; /* 当前文件名完整路径的结束符 */
FileNameBuffer[ FileCount ].DirStartClust = CurrentDirStartClust; /* 记录当前目录的起始簇号,用于加快文件打开速度 */
FileNameBuffer[ FileCount ].Attr = pFileDir -> DIR_Attr; /* 文件属性 */
if ( pFileDir -> DIR_Attr & ATTR_DIRECTORY ) { /* 判断是目录名 */
printf( "Dir %4d#: %s\n", FileCount, FileNameBuffer[ FileCount ].Name );
}
else { /* 判断是文件名 */
printf( "File%4d#: %s\n", FileCount, FileNameBuffer[ FileCount ].Name );
}
FileCount ++; /* 文件计数 */
if ( FileCount >= MAX_FILE_COUNT ) { /* 文件名结构缓冲区太小,结构数量不足 */
CH375vFileSize = 1; /* 强行提前结束枚举,本次FileOpen将不再回调xFileNameEnumer而是提前返回,防止缓冲区溢出 */
printf( "FileName Structure Full\n" );
}
}
#else
/* V2.8, V2.9, V3.0及以上版本的子程序库 */
/* 例子:列举指定目录下的所有文件 */
UINT8 ListFile( void )
// 输入参数mCmdParam.Open.mPathName[]为目录名字符串,形式与文件名相同,单个斜线则代表根目录
{
UINT16 ListCount=0; /* 仅用于计数 */
UINT8 status, i, c;
P_FAT_DIR_INFO mFileDir;
printf( "List Directory: %s\n", mCmdParam.Open.mPathName ); /* 显示目录名 */
status = CH375FileOpen( ); /* 打开目录 */
if ( status == ERR_SUCCESS ) { /* 成功打开文件 */
printf( "This is a file, not directory\n" );
status = ERR_MISS_DIR;
}
else if ( status == ERR_OPEN_DIR ) { /* 成功打开目录 */
while ( 1 ) { /* 依次处理 */
mCmdParam.ReadX.mSectorCount = 1; /* 处理一个扇区 */
mCmdParam.ReadX.mDataBuffer = FILE_DATA_BUF_ADDR; /* 缓冲区 */
status = CH375FileReadX( ); /* 读取当前目录项所在的扇区 */
if ( status != ERR_SUCCESS ) break; /* 操作失败 */
if ( mCmdParam.Read.mSectorCount == 0 ) break; /* 目录结束 */
mFileDir = FILE_DATA_BUF_ADDR;
for ( i = mCmdParam.Read.mSectorCount * CH375vSectorSize / sizeof( FAT_DIR_INFO ); i != 0; i --, mFileDir ++ ) { /* 计数FDT表项数 */
c = mFileDir -> DIR_Name[0]; /* 检查文件名首字节 */
if ( c == 0 ) break; /* 文件目录项结束 */
else if ( c == 0xE5 ) continue; /* 该目录项已被删除则跳过 */
else if ( c == 0x05 ) mFileDir -> DIR_Name[0] = i = 0xE5;
if ( ( mFileDir -> DIR_Attr & ATTR_VOLUME_ID ) == 0 ) { /* 不是卷标名(有可能是长文件名的一部分) */
ListCount++;
if ( mFileDir -> DIR_Attr & ATTR_DIRECTORY ) { /* 目录,不能进行递归处理,除非备份很多内部变量 */
printf( "Found %4d# directory, name: ", ListCount ); /* 显示计数 */
}
else { /* 文件 */
printf( "Found %4d# file, name: ", ListCount ); /* 显示计数 */
}
for ( c = 0; c != 11; c ++ ) { /* 显示搜索到的文件名,前11个字符为文件名 */
printf( "%c", mFileDir -> DIR_Name[ c ] );
}
printf( "\n" );
}
}
}
}
CH375FileClose( ); /* 打开目录用完后必须关闭 */
return( status ); /* 目录结束则返回ERR_SUCCESS,或者出错时返回出错代码 */
}
#endif
main( ) {
UINT8 i;
LED_OUT_INIT( );
LED_OUT_ACT( ); /* 开机后LED亮一下以示工作 */
mDelaymS( 100 ); /* 延时100毫秒 */
LED_OUT_INACT( );
mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */
printf( "Start\n" );
#if DISK_BASE_BUF_LEN == 0
pDISK_BASE_BUF = &my_buffer[0]; /* 不在.H文件中定义CH375的专用缓冲区,而是用缓冲区指针指向其它应用程序的缓冲区便于合用以节约RAM */
#endif
i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
mStopIfError( i );
/* 其它电路初始化 */
while ( 1 ) {
printf( "Wait Udisk\n" );
while ( CH375DiskStatus < DISK_CONNECT ) { /* 查询CH375中断并更新中断状态,等待U盘插入 */
CH375DiskConnect( );
mDelaymS( 100 );
}
LED_OUT_ACT( ); /* LED亮 */
mDelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
/* 对于检测到USB设备的,最多等待100*50mS,主要针对有些MP3太慢,对于检测到USB设备并且连接DISK_MOUNTED的,最多等待5*50mS,主要针对DiskReady不过的 */
for ( i = 0; i < 100; i ++ ) { /* 最长等待时间,100*50mS */
mDelaymS( 50 );
printf( "Ready ?\n" );
if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */
if ( CH375DiskStatus < DISK_CONNECT ) break; /* 检测到断开,重新检测并计时 */
if ( CH375DiskStatus >= DISK_MOUNTED && i > 5 ) break; /* 有的U盘总是返回未准备好,不过可以忽略,只要其建立连接MOUNTED且尝试5*50mS */
}
if ( CH375DiskStatus < DISK_CONNECT ) { /* 检测到断开,重新检测并计时 */
printf( "Device gone\n" );
continue;
}
if ( CH375DiskStatus < DISK_MOUNTED ) { /* 未知USB设备,例如USB键盘、打印机等 */
printf( "Unknown device\n" );
goto UnknownUsbDevice;
}
#if DISK_BASE_BUF_LEN
if ( DISK_BASE_BUF_LEN < CH375vSectorSize ) { /* 检查磁盘数据缓冲区是否足够大,CH375vSectorSize是U盘的实际扇区大小 */
printf( "Too large sector size\n" );
goto UnknownUsbDevice;
}
#endif
mDelaymS( 20 );
/* 查询磁盘物理容量 */
/* printf( "DiskSize\n" );
i = CH375DiskSize( );
mStopIfError( i );
printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * (CH375vSectorSize/512) / 2048 ) ); // 显示为以MB为单位的容量
// 原计算方法 (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * CH375vSectorSize / 1000000 ) 有可能前两个数据相乘后导致溢出, 所以修改成上式
*/
LED_RUN_ACT( ); /* 开始操作U盘 */
#if CH375_LIB_VER >= 0x30
printf( "List all file \n" );
i = ListAll( ); /* 枚举整个U盘中的所有文件及目录 */
mStopIfError( i );
#else
printf( "List all file under Root \n" );
mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/" ); /* 根目录 */
i = ListFile( ); /* 列出目录下的所有文件 */
mStopIfError( i );
printf( "List all file under /C51 \n" );
mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/C51" ); /* 子目录 */
i = ListFile( ); /* 列出目录下的所有文件 */
if ( i == ERR_MISS_FILE ) {
printf( "Sub-Directory not found \n" );
}
else mStopIfError( i );
#endif
LED_RUN_INACT( );
UnknownUsbDevice:
printf( "Take out\n" );
while ( CH375DiskStatus >= DISK_CONNECT ) { /* 查询CH375中断并更新中断状态,等待U盘拔出 */
CH375DiskConnect( );
mDelaymS( 100 );
}
LED_OUT_INACT( ); /* LED灭 */
mDelaymS( 200 );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -