技术支持:为什么我重装CH365驱动后运行应用程序机器会重启

设置了中断但应用程序中未用伪中断,中断处理全部交由驱动完成. 现在问题是: 1、只要没启动过应用程序(也就是未加载过驱动),驱动程序我无论更新多少次,再运行应用程序都没问题,正常 2、只要启动过应用程序(也就是加载过驱动),驱动程序只要我更新了(在设备管理器里删除后重装,哪怕是原来的驱动再装一遍),再运行应用程序,一般的端口操作和I2C操作等都没问题,但只要触发中断,机器必然重启或蓝屏。如果重新启动机器再运行应用程序,也是正常的。

总之,只要运行过应用程序后退出,然后更新驱动,再运行应用程序,触发了中断,计算机必然重启,不知是什么原因。 我知道现在一般设备安装驱动后要求机器重启,但我们批量生产PCI需要测试,买的测试设备是可以测试好一块板卡->卸载驱动->关闭板卡电源->插入新卡->上测试设备电源->重装驱动这样的流程测试的,而不需要关闭计算机换卡再重新启动,从而可以节约很多时间,现在出现这个问题,我们的测试设备派不上什么用场了。 恳请贵公司技术支持分析一下可能是哪个环节的原因(应用程序、驱动程序还是硬件设计上的原因)

有几点想问你一下: 1.为什么每次测试完后要卸载驱动? 2.驱动加载是在进入系统后,如果系统发现板卡已插入,他会将驱动自动加载上,而不是你启动应用程序后加载驱动.启动应用程序只是你加载了DLL后与驱动进行通讯. 3.你在启动应用程序后对CH365做了哪些操作,有没调用CH365mWriteIntCommand,CH365mReadIntCommand,CH365mSetIntRoutine,CH365mSetIntLine?


1、PCI测试设备的操作就是那样的,不关计算机情况下批量测试PCI卡功能,仅仅关闭PCI电源还不够。 2、应用程序里只做了如下初始化操作(第9步全部注释掉) //1) 加载DLL LoadLibrary( "CardDLL.DLL" ); //2) 选择打开CH365设备0,打开存储器和中断 Device_Number=0; if ( CH365mOpenDevice(Device_Number, TRUE, TRUE ) == INVALID_HANDLE_VALUE ) { AfxMessageBox("打开板卡设备失败,\r\n\r\n请确认板卡正确并连接可靠!",16,0); exit(0); }

//3) 通过DLL来调用版本号 //printf( "= %02X \n", CH365GetDrvVersion() );

//4) 通过DLL来调用系统自动分配的I/O基地址 if ( CH365mGetIoBaseAddr( Device_Number,&mIoBase ) == FALSE ) { AfxMessageBox("系统自动分配I/O基地址失败,\r\n\r\n请重新安装板卡驱动程序!",16,0); exit(0); }

//5) 通过DLL来调用系统自动分配的存储器基地址 if (CH365mGetMemBaseAddr(Device_Number,&mMemBase) ==FALSE) { AfxMessageBox("系统自动分配Memory基地址失败,\r\n\r\n请重新安装板卡驱动程序!",16,0); exit(0); }

//6) 选择A15作为SCL if ( CH365mReadIoByte(Device_Number,&mIoBase->mCh365IoCtrl,&cByte) == FALSE ) // 检查A15的状态,因为当A15为高电平时I2C不工作 { AfxMessageBox("检查A15的状态失败,\r\n\r\n请重新安装板卡驱动程序!",16,0); exit(0); } if ( cByte & 0x01 ) { //AfxMessageBox("A15状态异常,\r\n\r\n点击确定可正常操作!",16,0); CH365mWriteIoByte(Device_Number,&mIoBase->mCh365IoCtrl,(UCHAR)(cByte & 0xFE)); // 设置A15=0,也可由数据线D0下拉电阻进行模式设置 }

if ( CH365mWriteIoByte(Device_Number,&mIoBase->mCh365I2cCtrl,0) == FALSE ) // 选择A15作为SCL,默认值 { AfxMessageBox("选择SCL失败,\r\n\r\n请重新安装板卡驱动程序!",16,0); exit(0); } //CH365mWriteIoByte(Device_Number,&mBaseAddr->mCh365I2cCtrl,0x80); // 选择SYS_EX作为SCL

//7) 自动检测CH365所用的中断号 if ( CH365mSetIntLine(Device_Number, mCH365_INT_LINE_AUTO ) == FALSE ) { AfxMessageBox("打开板卡中断失败,\r\n\r\n请重新安装板卡驱动程序!",16,0); exit(0); }

//8) 调用中断号 if ( CH365mGetIntLine(Device_Number, &mIntLine ) == FALSE ) { AfxMessageBox("系统调用板卡中断号失败,\r\n\r\n请重新安装板卡驱动程序!",16,0); exit(0); } /* //9) 中断命令设定,CH365的WDM驱动程序中支持两条中断预处理命令 //通过使用CH365mWriteIntCommand( // 写入中断命令缓冲区 // ULONG iIndex, // 指定CH365设备序号 // mPWIN32_COMMAND iCommand, // 指向作为中断命令的命令结构 // ULONG iCmdIndex ) // 中断命令序号,为1或者2 // 假定在系统响应中断时设定A0-A15的状态为0x08000,可以撤消外部电路的中断请求 if (mIntLine )// 已经启用中断 { // mWIN32_COMMAND mCommand; // mCommand.mFunction = mFuncWriteIoWord;//发送I/O口写字命令,命令代码,该命令在硬件中断时由驱动程序执行 // mCommand.mAddress = & mIoBase ->mCh365IoPort[0x00]; //设定A0-A15的地址寄存器,操作地址 // mCommand.mLength = 1; //数据长度设定,操作数据长度,以字节计算 // mCommand.mBuffer[0] = 0x00; //要写的数据 // mCommand.mBuffer[1] = 0x00; // A15=1,假定:在外部电路的中断逻辑上,将A15置为高电平可以撤消中断 // if ( CH365mWriteIntCommand(Device_Number, &mCommand, 1 ) == FALSE ) // { // AfxMessageBox("设置中断预处理命令失败,请重新安装板卡驱动程序!",16,0); // //exit(0); // } // if ( CH365mSetIntRoutine(Device_Number, InterruptEvent ) == FALSE ) // { // AfxMessageBox("设置中断服务子程序失败,\r\n\r\n请重新安装板卡驱动程序!",16,0); // exit(0); // } // } */

3、退出应用程序时CH365mCloseDevice(Device_Number);

现在主要是只要打开过应用程序再关闭,然后更新驱动,再打开应用程序,一般端口操作都正常,但只要触发中断就重启。反之,只要未运行过应用程序,计算机启动完就直接删除驱动->更新驱动,不管更新多少遍,然后运行应用程序都正常的。中断触发:其实也是通过一端口向PCI卡上的主控芯片发命令,主控芯片发中断信号,触发驱动程序里的中断(应用程序级未设置伪中断,也即dll里的检测中断线程并未启动)。


应用程序关闭后 在任务管理器中 是否还有未被关闭的中断进程?


没有,我应用程序都未设置伪中断,更没有未关闭的中断进程.任务管理器里也看不到我的应用程序


中断是如何触发的? 硬件上是否D3下拉启用中断?


D3 1K电阻下拉


中断如何触发的?D3下拉电阻应用4.7K


有资料上说下拉1K也可,我估计改成4.7K问题也一样,中断触发很简单: 通过端口向PCI上主控制芯片发一个命令,主控制芯片发一负脉冲(2us宽度左右),从而触发中断,驱动里中断服务里就只添加了向主控制芯片发数据的代码.另外应用程序设置了停止中断的命令,在退出了应用程序之前,中断肯定停止了.


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