阅读:2070回复:5
USB设备不正常
我在公司做USB接口数据采集设备开发,在批量生产的时候有个异常现象搞得我很狼狈,请高人指点。
该设备由一块AN2131QC做的USB接口卡(独立放置,外部供电,通过排线和采集卡连接)、一块采集卡、8块程控放大器卡、一块具有总线性质的底板(数据通道、供电,前9块卡平行竖插在底板上)和电源模块组成。当设备上电时,一般情况下在设备管理器的USB类别下马上就出现设备名,但现在的情况是设备有时能立即出现,系统的各部分也都能正常工作,有时只出现一个带感叹号的USB DEVICE,断电后稍等再上电没准又有了。单独连上接口卡(改用USB供电),反复拔插,毫无问题,表现很稳定。 从线路上分析,接口卡只需从采集卡获得+5V电源就能工作(每次查电源也没有问题),设备就该出现,其他板卡即使不正常也不至于影响到这一点,更何况这是第二代产品,技术和工艺都很成熟。顺的时候每台设备都能PASS,不顺的时候把PASS过的设备拿回来再测试也有前面所说的毛病,重装操作系统也没治。请指教。 另外,有的设备出现得很快,有的就比较迟钝,这又是什么原因? [编辑 - 5/2/02 作者: sunkai] [编辑 - 5/3/02 作者: sunkai] |
|
沙发#
发布于:2002-05-02 23:21
嫌分少吗?
|
|
板凳#
发布于:2002-05-02 23:47
sunkai:你好!向你请教问题
我用EZ-USB2131QC开发了一套系统,下位机软件采用PC机下传方式,下载下位机软件的驱动程序我是用CYPRESS公司提供的ezloader,我只不过改了其中的firmware.c,然后在2000DDK中重新编译。结果该驱动程序和客户驱动程序在98中可以成功安装,并运行。但在2000底下却不能安装成功。通过输出调试信息,我发现这个ezloader.sys的驱动程序是在下传下位机8051代码时被中断并退出的。其中负责下传8051代码的程序段如下: while (ptr->Type == 0) { if (INTERNAL_RAM(ptr->Address)) { RtlZeroMemory(urb,sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST)); urb->UrbHeader.Length = sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST); urb->UrbHeader.Function = URB_FUNCTION_VENDOR_DEVICE; urb->UrbControlVendorClassRequest.TransferBufferLength = ptr->Length; urb->UrbControlVendorClassRequest.TransferBuffer = ptr->Data; urb->UrbControlVendorClassRequest.Request = ANCHOR_LOAD_INTERNAL; urb->UrbControlVendorClassRequest.Value = ptr->Address; urb->UrbControlVendorClassRequest.Index = 0; Ezusb_KdPrint ((\"Downloading %d bytes to 0x%x \\n\",ptr->Length,ptr->Address)); ntStatus = Ezusb_CallUSBD(fdo, urb); Ezusb_KdPrint ((\"下载代码\\n\")); if (!NT_SUCCESS(ntStatus)) { Ezusb_KdPrint ((\"Downloading failed\\n\")); break; } } ptr++; } Ezusb_KdPrint ((\"having successed download\\n\")); }在调试中我发现,在2000底下,该程序的while(ptr->Type == 0)还没有完全执行完,驱动程序就被异常中止,而在98下该代码却是好的。请问您能帮我吗? |
|
地板#
发布于:2002-05-02 23:56
我试着回答你这个问题,请查查你的D+和D-线,看是否太细?离USB接口比较远?
另外我向你请教的问题,请费心!! |
|
地下室#
发布于:2002-05-03 00:00
我试着回答你这个问题,请查查你的D+和D-线,看是否太细?离USB接口比较远?
另外我向你请教的问题,请费心!! |
|
5楼#
发布于:2002-05-03 00:24
谢谢你的回答。
说起来很可笑,我的确对驱动程序一窍不通,我和你的做法是一样的,但我在W2K下很正常。 Ezusb_DownloadIntelHex函数被调用了两次, Ezusb_8051Reset(fdo,1); Ezusb_DownloadIntelHex(fdo,loader);///// Ezusb_8051Reset(fdo,0); // // Now download the device firmware // Ezusb_DownloadIntelHex(fdo,firmware);////// Ezusb_8051Reset(fdo,1); Ezusb_8051Reset(fdo,0); 不知你有没有改变前后的语句? 呵呵,在98下可以运行,算我白说的 [编辑 - 5/3/02 作者: sunkai] |
|