www.pudn.com > LPC2148CH375.rar > main.c


/****************************************Copyright (c)************************************************** 
**                               Guangzou ZLG-MCU Development Co.,LTD. 
**                                      graduate school 
**                                 http://www.zlgmcu.com 
** 
**--------------File Info------------------------------------------------------------------------------- 
** File name:			main.c 
** Last modified Date:  2004-09-16 
** Last Version:		1.0 
** Descriptions:		The main() function example template 
** 
**------------------------------------------------------------------------------------------------------ 
** Created by:			Chenmingji 
** Created date:		2004-09-16 
** Version:				1.0 
** Descriptions:		The original version 
** 
**------------------------------------------------------------------------------------------------------ 
** Modified by: 
** Modified date: 
** Version: 
** Descriptions: 
** 
********************************************************************************************************/ 
#include "config.h" 
//#include "CH375INC.H" 
#include "gpio.h" 
 
#define LIB_CFG_FILE_IO			1		/* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */ 
#define LIB_CFG_INT_EN			0		/* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */ 
 
/* 单片机的RAM有限,其中CH375子程序用512字节,以字节为单位读写文件不需要文件数据读写缓冲区FILE_DATA_BUF */ 
#define FILE_DATA_BUF_LEN		0x0200	/* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度,字节模式不用该缓冲区 */ 
 
#define CH375_INT_WIRE			( IOPIN0 & (1<<30) )	/* P0.30, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */ 
#include "CH375HF9.H" 
 
void	mDelaymS( uint32 ms ) 
{ 
	UINT32	i; 
	while ( ms -- ) for ( i = 25000; i != 0; i -- ); 
} 
 
void mStopIfError( UINT8 iError ) 
{ 
	if ( iError == ERR_SUCCESS ) return;  /* 操作成功 */ 
	while ( 1 ); 
	 
} 
 
 
 
int main (void) 
{ 
		UINT8	i, c; 
	UINT16	TotalCount; 
	UINT8	*pCodeStr; 
	 
	 
	gpio_init(); 
	mDelaymS( 100 );  /* 延时100毫秒 */ 
	 
	 
	i = CH375LibInit( );  /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ 
	mStopIfError( i ); 
	 
	 
	while ( 1 ) { 
	 
			//printf( "Wait Udisk\n" ); 
		while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( );  /* 查询CH375中断并更新中断状态,等待U盘插入 */ 
	//	LED_OUT_ACT( );  /* LED亮 */ 
		mDelaymS( 200 );  /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ 
 
//* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ 
		for ( i = 0; i < 10; i ++ ) {  /* 有的U盘总是返回未准备好,不过可以被忽略 */ 
			mDelaymS( 100 ); 
		//	printf( "Ready ?\n" ); 
			if ( CH375DiskReady( ) == ERR_SUCCESS ) break;  /* 查询磁盘是否准备好 */ 
		} 
/* 查询磁盘物理容量 */ 
/*		printf( "DiskSize\n" ); 
		i = CH375DiskSize( );   
		mStopIfError( i ); 
		printf( "TotalSize = %d MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec >> 11 ) );  显示为以MB为单位的容量 
*/ 
 
/* 读取原文件 */ 
	//	printf( "Open\n" ); 
		strcpy( (char *)mCmdParam.Open.mPathName, "/C51/CH375HFT.C" );  /* 文件名,该文件在C51子目录下 */ 
		i = CH375FileOpen( );  /* 打开文件 */ 
		if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) {  /* 没有找到文件 */ 
/* 列出文件 */ 
			if ( i == ERR_MISS_DIR ) pCodeStr = (UINT8 *)"/*";  /* C51子目录不存在则列出根目录下的文件 */ 
			else pCodeStr = (UINT8 *)"/C51/CH375*";  /* CH375HFT.C文件不存在则列出\C51子目录下的以CH375开头的文件 */ 
			//printf( "List file %s\n", pCodeStr ); 
			for ( c = 0; c < 255; c ++ ) {  /* 最多搜索前255个文件 */ 
				strcpy( (char *)mCmdParam.Open.mPathName, (char *)pCodeStr );  /* 搜索文件名,*为通配符,适用于所有文件或者子目录 */ 
				i = strlen( (char const *)mCmdParam.Open.mPathName );  /* 计算文件名长度,以处理文件名结束符 */ 
				mCmdParam.Open.mPathName[ i ] = c;  /* 根据字符串长度将结束符替换为搜索的序号,从0到255 */ 
				i = CH375FileOpen( );  /* 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 */ 
				if ( i == ERR_MISS_FILE ) break;  /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */ 
				if ( i == ERR_FOUND_NAME ) {  /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */ 
			//		printf( "  match file %03d#: %s\n", (unsigned int)c, mCmdParam.Open.mPathName );  /* 显示序号和搜索到的匹配文件名或者子目录名 */ 
					continue;  /* 继续搜索下一个匹配的文件名,下次搜索时序号会加1 */ 
				} 
				else {  /* 出错 */ 
					mStopIfError( i ); 
					break; 
				} 
			} 
		} 
		else {  /* 找到文件或者出错 */ 
			mStopIfError( i ); 
			TotalCount = 600;  /* 准备读取总长度 */ 
		//	printf( "从文件中读出的前%d个字符是:\n",TotalCount ); 
			while ( TotalCount ) {  /* 如果文件比较大,一次读不完,可以再调用CH375ByteRead继续读取,文件指针自动向后移动 */ 
				if ( TotalCount > MAX_BYTE_IO ) c = MAX_BYTE_IO;  /* 剩余数据较多,限制单次读写的长度不能超过 sizeof( mCmdParam.ByteRead.mByteBuffer ) */ 
				else c = TotalCount;  /* 最后剩余的字节数 */ 
				mCmdParam.ByteRead.mByteCount = c;  /* 请求读出几十字节数据 */ 
				i = CH375ByteRead( );  /* 以字节为单位读取数据块,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后读 */ 
				mStopIfError( i ); 
				TotalCount -= mCmdParam.ByteRead.mByteCount;  /* 计数,减去当前实际已经读出的字符数 */ 
				for ( i=0; i!=mCmdParam.ByteRead.mByteCount; i++ );// printf( "%c", mCmdParam.ByteRead.mByteBuffer[i] );  /* 显示读出的字符 */ 
				if ( mCmdParam.ByteRead.mByteCount < c ) {  /* 实际读出的字符数少于要求读出的字符数,说明已经到文件的结尾 */ 
				//	printf( "\n" ); 
				//	printf( "文件已经结束\n" ); 
					break; 
				} 
				 
			} 
/*	    如果希望从指定位置开始读写,可以移动文件指针 
		mCmdParam.ByteLocate.mByteOffset = 608;  跳过文件的前608个字节开始读写 
		CH375ByteLocate( ); 
		mCmdParam.ByteRead.mByteCount = 5;  读取5个字节 
		CH375ByteRead( );   直接读取文件的第608个字节到612个字节数据,前608个字节被跳过 
 
	    如果希望将新数据添加到原文件的尾部,可以移动文件指针 
		CH375FileOpen( ); 
		mCmdParam.ByteLocate.mByteOffset = 0xffffffff;  移到文件的尾部 
		CH375ByteLocate( ); 
		mCmdParam.ByteWrite.mByteCount = 13;  写入13个字节的数据 
		CH375ByteWrite( );   在原文件的后面添加数据,新加的13个字节接着原文件的尾部放置 
		mCmdParam.ByteWrite.mByteCount = 2;  写入2个字节的数据 
		CH375ByteWrite( );   继续在原文件的后面添加数据 
		mCmdParam.ByteWrite.mByteCount = 0;  写入0个字节的数据,实际上该操作用于通知程序库更新文件长度 
		CH375ByteWrite( );   写入0字节的数据,用于自动更新文件的长度,所以文件长度增加15,如果不这样做,那么执行CH375FileClose时也会自动更新文件长度 
*/ 
		//	printf( "Close\n" ); 
			i = CH375FileClose( );  /* 关闭文件 */ 
			mStopIfError( i ); 
		} 
 
#ifdef EN_DISK_WRITE  /* 子程序库支持写操作 */ 
/* 产生新文件 */ 
		//printf( "Create\n" ); 
		 
		strcpy( (char *)mCmdParam.Create.mPathName, "/NEWFILE.TXT" );  /* 新文件名,在根目录下,中文文件名 */ 
		i = CH375FileCreate( );  /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ 
		mStopIfError( i ); 
		//printf( "Write\n" ); 
		pCodeStr = (UINT8 *)"Note: \xd\xa这个程序是以字节为单位进行U盘文件读写,单片机只需要有600字节的RAM\xd\xa"; 
		while( 1 ) {  /* 分多次写入文件数据 */ 
			for ( i=0; i