我的环境是这样的,我使用的是ATMEGA128-16AU单片机,与CH375B通信,电源是5V的 我用单片机的一个引脚做程序运行显示。调用程序是这样的 while(1){ DelayMs(40); LightFlash(); DelayMs(40); LightFlash(); DelayMs(40); LightFlash(); DelayMs(40); LightFlash(); DelayMs(40); LightFlash(); CH375USB(); } lightFlash()是灯引脚取反 CH375USB是U盘检测及写数据程序。 现在的现象是,在未插入U盘之前,程序执行感觉是很快的(灯闪烁的比较快),当插入U盘后,程序执行感觉就慢了(灯闪烁的慢了),不知道为什么。 说明下,CH375USB();程序是在本站的参考程序下修改完成的,并且以前在使用CH375V(5v)时是没有这个问题的。而CH375B(宽电压)就遇到了,不知是什么原因
另:mCmdParam.Modify.mFileTime这个时间修改怎么使用?就是文件的修改时间如何写? 谢谢回复
不知道你的CH375USB()函数里面到底到底是什么样的操作? mCmdParam.Modify.mFileTime的修改是这样的,日期的计算方法是(年-1980)*512+月*32+日,时间的计算方法是小时*2048+分钟*32+秒/2
谢谢您的回复 这是CH375USB()函数的主要内容(除了变量以外的全部) CH375_PORT_INIT( ); mDelaymS( 100 ); /* 延时100毫秒 */
mDelaymS( 100 ); // printf( "Start\n" ); PCPutString("Start\n",6); i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ mStopIfError( i ); /* 其它电路初始化 */
// while ( 1 ) { // printf( "Wait Udisk\n" ); PCPutString("Wait Udisk\n", 11); /* while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( );*/ /* 查询CH375中断并更新中断状态,等待U盘插入 */ while ( CH375DiskStatus < DISK_CONNECT ) { /* 查询CH375中断并更新中断状态,等待U盘插入 */ i = CH375DiskConnect( ); // if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有设备连接则返回成功,CH375DiskConnect同时会更新全局变量CH375DiskStatus */ if ( i == ERR_SUCCESS ) break; /* 有设备连接则返回成功,CH375DiskConnect同时会更新全局变量CH375DiskStatus */ // Uart0Send(&i,1); mDelaymS( 100 ); second++; if(second > 20){ second = 0; return; } } // LED_OUT_ACT( ); /* LED亮 */ mDelaymS( 250 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelaymS( 100 ); // printf( "Ready ?\n" ); PCPutString("Ready?\n",7); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ } NewSize = 512; SecCount = 3; for ( count=0; count < NewSize; count ++ ) { /* 将文件中的小写字符转换为大写 */ FILE_DATA_BUF[ count ] = temp[count]; } FILE_DATA_BUF[510] = 0x0d; FILE_DATA_BUF[511] = 0x0a; FILE_DATA_BUF[ 99 ] = 0x0d; FILE_DATA_BUF[ 100 ] = 0x0a; #ifdef EN_DISK_WRITE /* 子程序库支持写操作 */ /* 产生新文件 */ // printf( "Create\n" ); PCPutString("Create\n", 7); strcpy( (char *)mCmdParam.Create.mPathName, "\\NEWFILE.TXT" ); /* 新文件名,在根目录下 */ i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); // printf( "Write\n" ); PCPutString("Write\n",6); mCmdParam.Write.mSectorCount = SecCount; /* 写入所有扇区的数据 */ /* current_buffer = & FILE_DATA_BUF[0]; 如果文件读写的数据的复制方式为"外部子程序",那么需要设置存放数据的缓冲区的起始地址 */ for( count1 = 0; count1 < 10 ; count1++) { mCmdParam.Write.mSectorCount = 1; i = CH375FileWrite( ); /* 向文件写入数据 */ mCmdParam.Write.mSectorCount = 1; i = CH375FileWrite( ); } // mStopIfError( i ); // printf( "Modify\n" ); PCPutString("Modify\n",7); mCmdParam.Modify.mFileAttr = 0xff; /* 输入参数: 新的文件属性,为0FFH则不修改 */ mCmdParam.Modify.mFileTime = 0x123725; /* 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( Year, Month, Day ); /* 输入参数: 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileSize = NewSize*10 * 2; /* 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 */ i = CH375FileModify( ); /* 修改当前文件的信息,修改日期和长度 */ mStopIfError( i ); // printf( "Close\n" ); PCPutString("Close\n",6); mCmdParam.Close.mUpdateLen = 0; /* 不要自动计算文件长度,如果自动计算,那么该长度总是512的倍数 */ i = CH375FileClose( ); mStopIfError( i ); #endif // printf( "Take out\n" ); PCPutString("Take out\n",9); /* while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( );*/ /* 查询CH375中断并更新中断状态,等待U盘拔出 */ while ( CH375DiskStatus >= DISK_CONNECT ) { /* 查询CH375中断并更新中断状态,等待U盘拔出 */ if ( CH375DiskConnect( ) != ERR_SUCCESS ) break; mDelaymS( 100 ); }
CH375B对新插入的U盘的初始化过程加长了一些,30mS左右,主要是为了适应个别慢热型的U盘