CH376简单向U盘写文件返回值有时候出错

下面一个是主程序,一个是中断检测函数,问题在注释里面,谢谢

void creat_file(void) { UINT8 s; unsigned char i, j, copy_count=0; INT16U file_creat_num; unsigned short count; unsigned char *pStr; unsigned int doc_name, doc_conunt; static unsigned char exchange; static INT16U doc_begain; uchar DOC_num[4]={0x30, 0x30, 0x30, 0x31}; uchar file_name[13]={0x5c, 0x4B, 0x41, 0x4E, 0x45, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x58, 0x4c, 0x53}; while(1) { U_375_SDO_IN; U_375_SDO_CLR; for(i=0;i<10;i++) { mDelaymS( 120 ); s = mInitCH376Host( ); /* 初始化CH376 *//// //if ( s != USB_INT_SUCCESS ) {LCD_Clear(); return;} /* 操作成功 */ mSendByte(0xAA); mSendByte(s);//串口监视 if(s==0x14) break;//*************************返回0X14,初始化成功************************ //*************************返回0X14,初始化成功************************ } //mStopIfError( s ); /* 其它电路初始化 *///WDR (); while ( 1 ) { while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) /* 检查U盘是否连接,等待U盘插入,对于SD卡,可以由单片机直接查询SD卡座的插拔状态引脚 */ { mDelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ for ( s = 0; s < 20; s ++ ) /* 对于检测到USB设备的,最多等待10*50mS */ { /* 最长等待时间,10*50mS */ mDelaymS(80 ); if ( CH376DiskMount( ) == USB_INT_SUCCESS ) break; /* 初始化磁盘并测试磁盘是否就绪 */ } mSendByte(0XBB); mSendByte(CH376DiskMount( )); //*************************返回0X14,检测到磁盘链接************************

for(i=0;i<10;i++)//********************打开文件或新建文件,这里经常出错,所以来10次,出错时返回0X22******************** { mDelaymS(200); s = CH376FileOpen( file_name); /* 打开文件,该文件在根目录下 */ mSendByte(0Xcc); mSendByte(s); if ( s == USB_INT_SUCCESS ) { s = CH376ByteLocate( 0xFFFFFFFF );break; } else if ( s == ERR_MISS_FILE ) { s = CH376FileCreate( NULL ); break; /* 新建文件并打开,如果文件已经存在则先删除后再新建,不必再提供文件名,刚才已经提供给CH376FileOpen */} } mDelaymS(200);mDelaymS(200);mDelaymS(200); s = csprintf( buf,"DOC\x9O2\x9SO2\x9NO\x9NO2\x9NOx\x9Temp\x9Time \x9 Date\xd\xa"); /* 注意字符串长度不能溢出buf,否则加大缓冲区或者分多次写入 */ s = CH376ByteWrite( buf, s, NULL ); /* 以字节为单位向文件写入数据 */ if ( s != USB_INT_SUCCESS ) {LCD_Clear(); return;} /* 操作成功 */ /* 读取最大文件号,写入文件*/ EEPROM_READ(Doc_Store_eepAdd, Doc_Store);//读取最大保存的文件号 //***************************************************************************** ******************************************************************************* 从文件号1到最大文件号,这里是循环写入数据,每次写入一组数据后判断返回值S, 写入几十组以后有时出现返回值是0X22,如果下面不进行判断的话,执行完循环,写入U盘的数据也是正确完整的。(不明白为什么会出现这种情况,既然S返回0X22为什么还可以继续写, 而且还是正确完整的数据) ******************************************************************************* *******************************************************************************/ for(doc_conunt=1;doc_conunt<=Doc_Store;doc_conunt++) { Doc_Gas_Read(doc_conunt);//先读取文件号中的数据 s=csprintf( buf, "%u\x9%u.%u % \x9%uppm\x9%uppm\x9%uppm\x9%uppm\x9%u.%u℃\x9%u:%u:%u\x9%u-%u-%u\xd\xa",doc_conunt,_O2/10,_O2%10,_SO2,_NO,_NO2,_NOx,_TEMP/10,_TEMP%10,(*pTime).tm_hour,(*pTime).tm_min,(*pTime).tm_sec,(*pTime).tm_year,(*pTime).tm_mon,(*pTime).tm_mday); s = CH376ByteWrite( buf, s, NULL ); mSendByte(0Xdd); mSendByte(s);//*************************返回0X14,数据写入成功************************ if ( s != USB_INT_SUCCESS ) {LCD_Clear(); return;} /* 操作成功 */ }

CH376ByteWrite( buf, 0, NULL ); // 更新文件长度

getTime(pTime); //获取当前时间,用于写入创建文件时间 s = SetFileCreateTime( file_name, MAKE_FILE_DATE( 2000+(pTime->tm_year), pTime->tm_mon, pTime->tm_mday ), MAKE_FILE_TIME( pTime->tm_hour, pTime->tm_min, pTime->tm_sec ) ); /* 为指定文件设置创建日期和时间 */ s = CH376FileClose( TRUE ); /* 关闭文件,自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */ if ( s != USB_INT_SUCCESS ) {LCD_Clear(); return;} /* 操作成功 */ } }

/************************************************************************************************************************************************************************** *************************************************************************************************************************************************************************** INT引脚悬空,这里检测SDO引脚,检测到中断后后面要有一个延时之后读取返回值才正常,对于不同的U盘延时时间有很大的差别,而延时有很大程度的影响了U盘读写时间,问题是这里的延时是必要的吗,还是我的理解错误?? *************************************************************************************************************************************************************************** ***************************************************************************************************************************************************************************/ #ifndef NO_DEFAULT_CH376_INT UINT8 Wait376Interrupt( void ) /* 等待CH376中断(INT#低电平),返回中断状态码, 超时则返回ERR_USB_UNKNOWN */ { INT8U s=0; while(!(Query376Interrupt( ))) { ; } mDelaymS(200);mDelaymS(200); return( CH376GetIntStatus( ) ); } #endif

看看你的中断引脚的连接,以及中断引脚的配置


检测到中断,需不需要等待一会再查询中断状态?


不需要,只要有中断产生,就可以获取中断状态


只有登录才能回复,可以选择微信账号登录