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

📄 ch375hft.c

📁 CH375 USB接口协议芯片MC51平台下的实例程序
💻 C
📖 第 1 页 / 共 2 页
字号:
				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 + -