⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch374hft.c

📁 CH374EVT.ZIP
💻 C
📖 第 1 页 / 共 2 页
字号:
				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 + -