📄 ch374hft.c
字号:
CH374FileReadX( );
// CH374FileClose( ); /* 不做写操作可以无需关闭 */
}
}
}
}
void xFileNameEnumer( void ) /* 文件名枚举回调子程序,参考CH374HF6.H文件中的例子 */
{ /* 每搜索到一个文件FileOpen都会调用本回调程序,xFileNameEnumer返回后,FileOpen递减CH374vFileSize并继续枚举直到搜索不到文件或者目录 */
UINT8 i, c;
P_FAT_DIR_INFO pFileDir;
PUINT8X pNameBuf;
pFileDir = (P_FAT_DIR_INFO)( pDISK_BASE_BUF + CH374vFdtOffset ); /* 当前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 ) { /* 文件名结构缓冲区太小,结构数量不足 */
CH374vFileSize = 1; /* 强行提前结束枚举,本次FileOpen将不再回调xFileNameEnumer而是提前返回,防止缓冲区溢出 */
printf( "FileName Structure Full\n" );
}
}
main( ) {
UINT8 i;
LED_OUT_INIT( );
LED_OUT_ACT( ); /* 开机后LED亮一下以示工作 */
CH374DelaymS( 100 ); /* 延时100毫秒 */
LED_OUT_INACT( );
mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */
printf( "Start\n" );
#if DISK_BASE_BUF_LEN == 0
pDISK_BASE_BUF = &my_buffer[0]; /* 不在.H文件中定义CH374的专用缓冲区,而是用缓冲区指针指向其它应用程序的缓冲区便于合用以节约RAM */
#endif
i = CH374LibInit( ); /* 初始化CH374程序库和CH374芯片,操作成功返回0 */
mStopIfError( i );
/* 其它电路初始化 */
while ( 1 ) {
printf( "Wait Udisk\n" );
#ifdef UNSUPPORT_USB_HUB
/* 如果不需要支持USB-HUB,那么等待U盘插入的程序与CH375相似,都是通过CH374DiskConnect查询连接,已连接则通过CH374DiskReady等待就绪,然后读写 */
while ( CH374DiskStatus < DISK_CONNECT ) { /* 查询CH374中断并更新中断状态,等待U盘插入 */
CH374DiskConnect( );
CH374DelaymS( 50 ); /* 没必要频繁查询 */
}
LED_OUT_ACT( ); /* LED亮 */
CH374DelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
/* 对于检测到USB设备的,最多等待100*50mS,主要针对有些MP3太慢,对于检测到USB设备并且连接DISK_MOUNTED的,最多等待5*50mS,主要针对DiskReady不过的 */
for ( i = 0; i < 100; i ++ ) { /* 最长等待时间,100*50mS */
CH374DelaymS( 50 );
printf( "Ready ?\n" );
if ( CH374DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */
if ( CH374DiskStatus < DISK_CONNECT ) break; /* 检测到断开,重新检测并计时 */
if ( CH374DiskStatus >= DISK_MOUNTED && i > 5 ) break; /* 有的U盘总是返回未准备好,不过可以忽略,只要其建立连接MOUNTED且尝试5*50mS */
}
if ( CH374DiskStatus < DISK_CONNECT ) { /* 检测到断开,重新检测并计时 */
printf( "Device gone\n" );
continue; /* 重新等待 */
}
if ( CH374DiskStatus < DISK_MOUNTED ) { /* 未知USB设备,例如USB键盘、打印机等 */
printf( "Unknown device\n" );
goto UnknownUsbDevice;
}
#else
/* 如果需要支持USB-HUB,那么必须参考本例中下面的等待程序 */
while ( 1 ) { /* 支持USB-HUB */
CH374DelaymS( 50 ); /* 没必要频繁查询 */
if ( CH374DiskConnect( ) == ERR_SUCCESS ) { /* 查询方式: 检查磁盘是否连接并更新磁盘状态,返回成功说明连接 */
CH374DelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
/* 对于检测到USB设备的,最多等待100*50mS,主要针对有些MP3太慢,对于检测到USB设备并且连接DISK_MOUNTED的,最多等待5*50mS,主要针对DiskReady不过的 */
for ( i = 0; i < 100; i ++ ) { /* 最长等待时间,100*50mS */
CH374DelaymS( 50 );
printf( "Ready ?\n" );
if ( CH374DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */
if ( CH374DiskStatus < DISK_CONNECT ) { /* 检测到断开,重新检测并计时 */
printf( "Device gone\n" );
break; /* 重新等待 */
}
if ( CH374DiskStatus >= DISK_MOUNTED && i > 5 ) break; /* 有的U盘总是返回未准备好,不过可以忽略,只要其建立连接MOUNTED且尝试5*50mS */
if ( CH374DiskStatus == DISK_CONNECT ) { /* 有设备连接 */
if ( CH374vHubPortCount ) { /* 连接了一个USB-HUB,但可能没有U盘 */
printf( "No Udisk in USB_HUB\n" );
break;
}
else { /* 未知USB设备,有可能是U盘反应太慢,所以要再试试 */
}
}
}
if ( CH374DiskStatus >= DISK_MOUNTED ) { /* 是U盘 */
break; /* 开始操作U盘 */
}
if ( CH374DiskStatus == DISK_CONNECT ) { /* 多次尝试还是不行,估计不是U盘 */
if ( CH374vHubPortCount ) { /* 连接了一个USB-HUB,但可能没有U盘 */
/* 在while中等待HUB端口有U盘 */
}
else { /* 未知USB设备,例如USB键盘、打印机等,而且已经试了很多次还不行 */
printf( "Unknown device\n" );
goto UnknownUsbDevice;
}
}
}
}
LED_OUT_ACT( ); /* LED亮 */
#endif
#if DISK_BASE_BUF_LEN
if ( DISK_BASE_BUF_LEN < CH374vSectorSize ) { /* 检查磁盘数据缓冲区是否足够大,CH374vSectorSize是U盘的实际扇区大小 */
printf( "Too large sector size\n" );
goto UnknownUsbDevice;
}
#endif
CH374DelaymS( 20 );
/* 查询磁盘物理容量 */
// printf( "DiskSize\n" );
// i = CH374DiskSize( );
// mStopIfError( i );
// printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * ( CH374vSectorSize / 512 ) >> 11 ) ); /* 显示为以MB为单位的容量 */
printf( "Current disk sector size = %d Bytes \n", CH374vSectorSize ); /* CH374vSectorSize是U盘的实际扇区大小 */
LED_RUN_ACT( ); /* 开始操作U盘 */
printf( "List all file \n" );
i = ListAll( ); /* 枚举整个U盘中的所有文件及目录 */
mStopIfError( i );
LED_RUN_INACT( );
UnknownUsbDevice:
printf( "Take out\n" );
while ( 1 ) { /* 支持USB-HUB */
CH374DelaymS( 10 ); /* 没必要频繁查询 */
if ( CH374DiskConnect( ) != ERR_SUCCESS ) break; /* 查询方式: 检查磁盘是否连接并更新磁盘状态,返回成功说明连接 */
}
LED_OUT_INACT( ); /* LED灭 */
CH374DelaymS( 200 );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -