列举,写文件出错.UploadImages/200710119102222.rar
您的程序我们帮您测试了一下,有点问题,您用下面的程序再测试一下,我们测试是可以用的:
/***************************************************************************/ #include #include #include #include /***************************************************************************/
#define LIB_CFG_INT_EN 0 /* CH374的INT#引脚连接方式,0为"查询方式",1为"中断方式" */
#define CH374_IDX_PORT_ADDR 0xBDF1 /* CH374索引端口的I/O地址 */ #define CH374_DAT_PORT_ADDR 0xBCF0 /* CH374数据端口的I/O地址 */ /* 62256提供的32KB的RAM分为两部分: 0000H-01FFH为磁盘读写缓冲区, 0200H-7FFFH为文件数据缓冲区 */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE */
#define CH374_INT_WIRE INT0 /* P3.2, INT0, CH374的中断线INT#引脚,连接CH374的INT#引脚,用于查询中断状态 */ /* 如果未连接CH374的中断引脚,那么应该去掉上述定义,自动使用寄存器查询方式 */ //#define FILE_DATA_BUF_ADDR 0x200
#define DISK_BASE_BUF_LEN 2048/* 默认的磁盘数据缓冲区大小为512字节,建议选择为2048甚至4096以支持某些大扇区的U盘,为0则禁止在.H文件中定义缓冲区并由应用程序在pDISK_BASE_BUF中指定 */ /* 如果需要复用磁盘数据缓冲区以节约RAM,那么可将DISK_BASE_BUF_LEN定义为0以禁止在.H文件中定义缓冲区,而由应用程序在调用CH375Init之前将与其它程序合用的缓冲区起始地址置入pDISK_BASE_BUF变量 */
//#define NO_DEFAULT_CH374_F_ENUM 1 /* 未调用CH374FileEnumer程序故禁止以节约代码 */ #define NO_DEFAULT_CH374_F_QUERY 1 /* 未调用CH374FileQuery程序故禁止以节约代码 */ //#define NO_DEFAULT_CH374_RESET 1 /* 未调用CH374Reset程序故禁止以节约代码 */
#include "CH374HF6.H"
#ifdef __C51__ #pragma NOAREGS #endif /***************************************************************************/ sbit run=P1^0; sbit read=P1^1; sbit beep=P1^2; /***************************************************************************/ UINT8 i,c,SecCount; //对374操作是否成功,显示其状态 UINT32 TotalCount; UINT16 FlashAdd; UINT32 FileSize; UINT32 FileSizetemp; UINT32 NewSize; UINT8X my_buffer[0x0800]; /*这里帮您修改过了!!*/ //UINT8X w040buffer[0x3000]; //---------------------------------------------------- /* 为printf和getkey输入输出初始化串口 */ void mInitSTDIO( ) { SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xf3; /* 24MHz晶振, 9600bps */ TR1 = 1; TI = 1; }
void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 显示错误 */ /* 遇到错误后,应该分析错误码以及CH374DiskStatus状态,例如调用CH374DiskConnect查询当前U盘是否连接,如果U盘已断开那么就重新等待U盘插上再操作, 建议出错后的处理步骤: 1、调用一次CH374DiskReady,成功则继续操作,例如Open,Read/Write等,在CH374DiskReady中会自动调用CH374DiskConnect,不必另外调用 2、如果CH374DiskReady不成功,那么强行将CH374DiskStatus置为DISK_CONNECT状态,然后从头开始操作(等待U盘连接CH374DiskConnect,CH374DiskReady等) */ while ( 1 ) { run=0; CH374DelaymS( 100 ); run=1; CH374DelaymS( 100 ); } } /***************************************************************************/ void main(void) {
UINT32 i; UINT16 j; PUINT8X pDISKBUF; CHPCON &=0xE3;//禁止片内XRAM mInitSTDIO( ); run=0; CH374Reset(); i=CH374LibInit(); mStopIfError(i); printf("CH374S Initial Is Ok!\n"); CH374DelaymS(50); i=CH374DiskConnect(); //check connect mStopIfError(i ); printf("USB disk connect.\n"); CH374DelaymS(200); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ printf( "Ready ?\n" );
for(TotalCount=0;TotalCount<5;TotalCount++) { //最长等待时间 5*50mS CH374DelaymS( 50 ); i=CH374DiskReady(); mStopIfError(i ); printf("USB disk ready.\n");break; } //-------------------------------------------------获取U盘大小 printf("Get USB store size!!!"); i = CH374DiskSize( ); mStopIfError(i ); printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * ( CH374vSectorSize / 512 ) >> 11 ) ); //显示为以MB为单位的容量
//--------------------------------------------------列举文件 for ( c=0; c<254; c++ ) { /* 最多搜索前254 个文件 */ strcpy( mCmdParam.Enumer.mPathName, "\\*" );/* 在C51 子目录下搜索以CH374 开头的文件名,*为通配符 */ i = strlen( mCmdParam.Enumer.mPathName ); /* 计算文件名长度,指向结束符 */ // mCmdParam.Enumer.mPathName[i] = c; /* 将结束符替换为搜索的序号,从0 到254 */ CH374vFileSize=c; mCmdParam.Enumer.mPathName[i] =0xff; /* 将结束符替换为搜索的序号,从0 到254 */ i=CH374FileEnumer( ); /* 文件名中含有通配符*,枚举/搜索文件而不打开 */ if ( i==ERR_MISS_FILE ) break; /* 再也搜索不到匹配文件,已经没有匹配的文件名 */ if ( i!=ERR_SUCCESS ) break; /* 出错 */ printf( "found name %d#: %s\n", (unsigned int)c, mCmdParam.Enumer.mPathName ); /* 搜索到相匹配的文件名,显示序号和搜索到的匹配文件名或者子目录名 */ }
//---------------------------------------------------打开文件 printf("\n"); printf( "Open\n" ); strcpy(mCmdParam.Open.mPathName, "\\CH374.TXT" ); i= CH374FileOpen(); /* 打开文件 */ mStopIfError(i ); printf("open file success!\n");
//----------------------------------------------------读取文件 read=0; i=CH374vFileSize/1024; printf( "File size = %lu k\n",i); /* 在成功打开文件后,全局变量CH374vFileSize中是文件当前长度 */ printf("Read And Print Data:\n"); TotalCount=(1048576*2); FlashAdd=0; FileSize=0; FileSizetemp=CH374vFileSize; while(1){ if(CH374vFileSize<2048){CH374vFileSize=2048;break;} i=CH374vFileSize%2048; if(i!=0){CH374vFileSize +=i;break;} break;}
mCmdParam.Locate.mSectorOffset=0; i=CH374FileLocate( ); //移动文件指针 mStopIfError( i );
while(TotalCount){ if(FileSize==FileSizetemp)break; mCmdParam.ReadX.mSectorCount=4;//4*512 TotalCount -=2048; printf("\n"); printf( "%lu\n",TotalCount); mCmdParam.ReadX.mDataBuffer=my_buffer; i = CH374FileReadX( ); mStopIfError(i); mCmdParam.ReadX.mDataBuffer=my_buffer; //---------------------------------------------------------------读取成功显示 for( i=0; i<2048; i++ ){
printf( "%c",mCmdParam.ReadX.mDataBuffer[i]); if((i!=0)&&(i+1)%64==0)printf("\n"); FileSize +=1; //if(mCmdParam.ReadX.mSectorCount<4){goto readend;} if(FileSize==FileSizetemp){ printf("\n"); printf("FileSize=%lu\n",FileSize); printf("File Data End!\n"); break; } } } //--------------------------------------------------模拟写Flash W29c040 /* for(i=0;i<4096;i++){ w040buffer[FlashAdd] =mCmdParam.ReadX.mDataBuffer[i]; FlashAdd +=1; if((i!=0)&&(i%256)==0){CH374DelaymS(10);} FileSize +=1; if(FileSize==FileSizetemp){ printf("\n"); printf("FileSize=%lu\n",FileSize); printf("File Data End!\n"); goto readend; } if(mCmdParam.ReadX.mSectorCount<8){goto readend;} } } */ CH374vFileSize=FileSizetemp;//恢复文件长度 //---------------------------------------------------------------读取完成 printf("\n"); printf("Read Data Ok!\n"); read=1; //---------------------------------------------------------------关闭文件 i=CH374FileClose(); mStopIfError(i); //------------------------------------------
pDISKBUF =&my_buffer[0]; for(i=0;i<2048;i++) //2M { *pDISKBUF='m'; pDISKBUF++; } //---------------------------------------------------------------创建文件 printf( "Create\n" ); strcpy( mCmdParam.Create.mPathName, "\\NEW3.TXT" ); /* 新文件名,在根目录下 */ i = CH374FileCreate( ); /* 新建文件并打开,如果文件已经存在则