CH375A中断问题

请问以下,如果我接到CH375A发送的中断,没有及时处理,最多可以允许多长的时间,在测试中,发现没有及时处理该中断,会出现出错!请贵公司技术人员帮忙解答以下!非常感谢!

你如果不处理的话,那么,中断脚一直为低,中断状态一直保存啊,不存在有没有时间问题


读数据的时候,应该会有影响的吧!


现在读和写有时候有时候不稳定,会死掉! 今天查出来是因为在处理网络中断信号,而且时间比较长,所以不能及时处理USB发出的中断引起的! 我的理解是: 因为时序要求如下: 命令与数据之间的间隔时间: 最小 2us, 最大100us; 数据与数据之间的间隔时间: 最小 1us, 最大100us;

而在读数据的时候,每阁64个数据,都需要发送一次中断,告诉CH375A继续读数据,这个时候如果我没有及时响应中断的话,应该可能就会超过100us!  我初步认为是这个问题!不知道我的理解是否正确?


那不是375芯片的问题,而是你在长时间不操作U盘的话,U盘自己挂起了,是U盘本身的特性造成的,所以我们在写三个读写子程序的时候,就非常的强调延时函数,担心时间太短操作不了375,时间太长的话,U盘可能挂起


那如果想改变这样的现状,只能通过修改延时函数! 但是我的延时函数已经设置的时间是最短的了.再设置小一点,就读不出文件! 现在也出现死掉的现象频率不是很高,只是碰到刚好处理网络中断函数,这个时候来了USB中断,而系统忙于处理网络中断,没来得及处理USB,造成了超过一定的时间,也可能就是你所说的挂起想象!

 现在决定利用下下策了,只能USB中断的时候关闭网络中断,等处理完毕以后再开启网络中断,系统也只有网络中断会引起超时的可能性.


你的网络中断的时间大概需要多长的时间??


并一定的,有的包长,有些包短,所以很难控制时间,如果时间太长的话,应该可能就会出现你所说的挂起现象,短的话应该不会受影响!  所以现在在测试中,发现有时间会读会死掉了,写死掉的频率高于读,是不是写要求的时间更严格?


那你为你的中断设置一下中断优先级不行吗,即使在处理网络中断的时候,若有BUS中段则转入处理BUS中断。


硬件做死了,网络中断USB采用的都是INT4/5/6/7中断,只是USB采用的是INT6,网络中断采用的是INT7,但是因44B0INT4/5/6/7中断的挂起中断和中断势能采用的都是同一位.   所以现在只能是USB中断的时候不执行网络中断处理函数,只能这个方法了,这个也是我能想到的下下策了!你们有更好的想法吗?


是不是可以这样处理: 为防止在处理网络中断处理时导致U盘挂起,在你网络中断处理函数中隔段时间就发个操作U盘的命令,如DISK_READY。


这样处理好象不太合理! 我想问问,一般的U盘,相隔多长时间不访问会自动挂起? 我想可能还大因素还是因为HCN说的U盘被挂起了,因为我以前采用的都是条件CH375DiskConnect() == ERR_SUCCESS是否成立来决定是否U盘是否连接设备,但是后来因为发现在处理网络中断函数里面,操作U盘,会死掉了,所以不在网络中断处理函数里面操作U盘,都是采用了另外设置了一个全局变量记录当前U盘的状态,只有程序退出了网络中断处理函数再开始USB中断,但是发现有时候还是会死掉!   我在贵公司的技术文件里面也看到过,不能频繁调用CH375DiskConnect,但是一直不知道为什么不能频繁调用这个函数! 期待贵公司技术人员能继续帮我解决我的一些疑难问题,非常感谢!


U盘挂起的时候不同的U盘可能会不一样,建议你还是按照你说的在操作U盘的时候将网络关闭掉比较好点


恩!谢谢HCN!现在该问题已经解决了! 我没有关网络,因为网络常常需要与设备通讯,不能关闭网络! 为了解决该问题,我在操作U盘前都先发了一个命令给U盘,以防U盘被挂起而不能正常操作!

 现在还有最后一问题了,我试过了很多U盘,但是有的U盘只能在系统全部初始化望比后,再插上U盘,才能正常读写文件,但是可以读U盘信息(磁盘大小,文件系统类型等参数),也可以列举到文件名!  有一些U盘却可以在上电前插上,也可以初始化系统后热插拔,都能正常操作!  我的初始化流程如下: int main(void) { void RstSystem(void); BF_FileAttribute *pFileProp; OS_CPU_SR rCPSR; INT32U ulKeyVal; INT32S slErr; #ifdef __CAMERA_CUT__ BMCmdBlockEndToPC cmdToPc; BMCmdAllFileEndToPC cmdEndToPc; #endif INT8U ucErr; #ifdef __USB_INTERFACE__ INT32U i, j; #endif

bInitSys(); //init system BuzzerCon(1, 600000);

bcheckSnCardAndSetSysTime(); if (gSysPara.ulFlag & (1 << SYS_BIT_SELFCHECK)) { slErr = bAutoCheck(); // Auto check system power on if(slErr == 1) { BuzzerCon(1, 600000); g_pCurMenu = g_pRootM->child; //init windows g_pCurWin = g_pCurMenu->pWin; GUI_UpdataWindow(); } } if (gSysPara.ulFlag & (1 << SYS_BIT_BTO_POWER_ON)) // Back to origin power on { gSystem.ulSysStatus[gSystem.ulSysStatusCur] = STATUS_BTO_POWER_ON; bkEnterForBTO(); } #ifdef __DOUBLE_HEADS__ else bhAdjustHeadPowerOn();//调整激光头 #endif //__DOUBLE_HEADS__ #ifdef __USB_INTERFACE__ CH375Reset( ); mDelaymS(100); ucErr = CH375LibInit( ); mDelaymS(100); for(j = 0; j < 5; j++) { if (CH375DiskStatus == DISK_CONNECT) break; mDelaymS(100); } if(j == 5) { #ifdef __LANGUAGE_CHINESE__ GUI_MsgBox((INT8U *)"没有检测到U盘!"); #else GUI_MsgBox((INT8U *)"Not find UDisk!"); #endif BuzzerCon(1, 600000); delay(0x00500000); g_pCurMenu = g_pRootM->child; g_pCurWin = g_pCurMenu->pWin; GUI_UpdataWindow(); } else { mDelaymS(300 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ if(j != 5) { for ( i = 0; i < 3; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelaymS( 100 ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; } } } #endif while (1) // system main loop { g_ulWDTFlag = 0x55555555; if (SCLOSED == gSystem.ulSocketStatus) { #ifdef __DM9000AE_LAN_MODULE__ if (g_ulSocketFlag == SOCKET_NEED_RESTART) { bsInitNet(); // Reconnect net g_ulSocketFlag = SOCKET_NO_NEED_RESTART; } gSystem.ulSocketStatus = SSYS_INIT_OK; if(STATUS_WAITING == gSystem.ulSysStatus[gSystem.ulSysStatusCur]) { g_pCurMenu = g_pRootM->child; g_pCurWin = g_pCurMenu->pWin; GUI_UpdataWindow(); } #else bsInitNet(); #endif } if (gSystem.keysInfo.ulKeyValue[gSystem.keysInfo.ulKeyCurHandle] & 0xFF000000) { OS_ENTER_CRITICAL(); gSystem.keysInfo.ulKeyValue[gSystem.keysInfo.ulKeyCurHandle] &= 0x00FFFFFF; ulKeyVal = gSystem.keysInfo.ulKeyValue[gSystem.keysInfo.ulKeyCurHandle++]; // Point to next keys stack if (gSystem.keysInfo.ulKeyCurHandle >= SYS_KEY_DEPTH) gSystem.keysInfo.ulKeyCurHandle = 0; OS_EXIT_CRITICAL(); bkProcessKeys(ulKeyVal); } if (STATUS_RUN_END != gSystem.ulSysStatus[gSystem.ulSysStatusCur]) bProcessWtDataLoop(); if (TRUE == g_ucDisplayFGraphFlag) { g_ucDisplayFGraphFlag = FALSE; if (g_pCurMenu->parent == g_pFileM) bkDisplayFileGraph(g_pCurMenu); } if(TRUE == g_ucMoveFlag) { g_ucMoveFlag = FALSE; g_ucKeyTimeFlag = FALSE; if(g_ulCurKeyVal == 0x00)//上 { bcMoveCoorYUp(0xFF000000); } else if(g_ulCurKeyVal == 0x01)//下 { bcMoveCoorYDown(0x00FFFFFF); } else if(g_ulCurKeyVal == 0x10) //左 { bcMoveCoorXLeft(0xFF000000); } else if(g_ulCurKeyVal == 0x11) //右 { bcMoveCoorXRight(0x00FFFFFF); } gSystem.ulSysStatus[gSystem.ulSysStatusCur] = STATUS_MOVING_COORS; }

switch(gSystem.ulSysStatus[gSystem.ulSysStatusCur])//2006/02/15 { case STATUS_RUNNING: bProcessRunStatus(); break; case STATUS_PROTECTION_ERROR: bProcessSysProtectStatus(); break; case STATUS_COMPLETE_UPDATA: RstSystem(); break; case STATUS_MOVING_COORS: ucErr = bcCheckLimit(); if(ucErr == 0) { if(bmGetMotionData(BMOTION_STATUS_ADDR) & 0x00004000)// 轴已停下来(点移) { g_ulKeyTime = 0; g_ucKeyTimeFlag = FALSE; g_ucMoveFlag = FALSE; g_ulKeyTime--; bkStopMotorRun(); gSystem.ulSysStatus[gSystem.ulSysStatusCur] = STATUS_WAITING; g_pCurMenu = g_pRootM->child; g_pCurWin = g_pCurMenu->pWin; GUI_UpdataWindow(); } } break; case STATUS_ADJUST_COORS: bcRunAdjustCoors(); break; case STATUS_BACK_TO_ORG: case STATUS_BTO_POWER_ON: case STATUS_SET_ORG: bEndBackToOrg(); break; case STATUS_BTO_BEFORE_RUN: bBTOOrgBeforeRun(); break; case STATUS_PAUSE: if(g_ucTimeFlag == 0xFF) { if (gSysPara.ulFlag & (1 << SYS_BIT_STORE_WAY)) pFileProp = (BF_FileAttribute *)(bfGetFileProp(bfGetCurrentFileIndex())); else pFileProp = (BF_FileAttribute *)(bfGetFileProp(0)); bDisplayRunTime(pFileProp); } break; case STATUS_SAVE_DATA: #ifdef __USB_INTERFACE__ if(CH375DiskConnect() == ERR_SUCCESS) { ucErr = bRdSDRAMToUDisk(); } else bSaveDataForFlashFile(); #else bSaveDataForFlashFile();//将文件存储到NANDFLASH #endif break; case STATUS_SAVE_UPDATA_FILE: bWtFileDataToFlashRom();//将升级文件写到NORFLASH break; case STATUS_DATA_PROCESS: // FALSH储存文件时,软件发送运行命令,数据处理过程 bDataProcessForFlash(); break; case STATUS_DELETINT_FILE: bDeletingFile(); break; case STATUS_FOEMATINT_DISK: bFormatingDisk(); break; case STATUS_READ_SYS_LOG: bReadSystemLog(); break; case STATUS_GETTING_ERROR_FILE: bGetErrorFile(); break; case STATUS_STORE_ERROR_FILE: bStoreErrorFile(); break; case STATUS_ID_ERROR: case STATUS_LASER_POWER_ERROR: case STATUS_PROCESS_DATA_ERROR: case STATUS_LIMIT_ERROR: case STATUS_SN_NO_CONNECT: case STATUS_PREVIEW_END: case STATUS_PREVIEW_DATA_ERROR: case STATUS_MOVEING_LIMIT: #ifdef __METAL_CUT__ case STATUS_FOCUS_ERROR: case STATUS_AUTOFOCUS_TIMEOUT: case STATUS_AUTOFOCUS_LIMT: #endif BuzzerCon(1, 0x60000); break;

case STATUS_RUN_END: BuzzerCon(1, 0x60000); #ifdef __CAMERA_CUT__ if (gucBlockRunFlag == 1)//块文件运行结束 { gucBlockRunFlag = 0; bmInitMotionModule(); g_pRun->p_ulMotionBuf = (MOTION_BUF *)BMOTION_BASE_ADDR; gSystem.ulSysStatus[gSystem.ulSysStatusCur] = STATUS_WAITING; bfDeleteFile(bfGetCurrentFileIndex()); cmdToPc.usCmdFlag = EXECUTABLE_CMD; // 0x55aa cmdToPc.usCmd = BMCMD_BLOCK_END_TO_PC; cmdToPc.u


for(j = 0; j < 5; j++) { if (CH375DiskStatus == DISK_CONNECT) break; mDelaymS(100); } 上面这段函数建议你做成一个只有在设备插上来之后才跳出的程序,不然可能会出现有的U盘先插上可以,而后插不可以.


现在先插上不可以,后插上可以!


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