sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2070回复:5

USB设备不正常

楼主#
更多 发布于:2002-05-02 00:42
我在公司做USB接口数据采集设备开发,在批量生产的时候有个异常现象搞得我很狼狈,请高人指点。
该设备由一块AN2131QC做的USB接口卡(独立放置,外部供电,通过排线和采集卡连接)、一块采集卡、8块程控放大器卡、一块具有总线性质的底板(数据通道、供电,前9块卡平行竖插在底板上)和电源模块组成。当设备上电时,一般情况下在设备管理器的USB类别下马上就出现设备名,但现在的情况是设备有时能立即出现,系统的各部分也都能正常工作,有时只出现一个带感叹号的USB DEVICE,断电后稍等再上电没准又有了。单独连上接口卡(改用USB供电),反复拔插,毫无问题,表现很稳定。
从线路上分析,接口卡只需从采集卡获得+5V电源就能工作(每次查电源也没有问题),设备就该出现,其他板卡即使不正常也不至于影响到这一点,更何况这是第二代产品,技术和工艺都很成熟。顺的时候每台设备都能PASS,不顺的时候把PASS过的设备拿回来再测试也有前面所说的毛病,重装操作系统也没治。请指教。
另外,有的设备出现得很快,有的就比较迟钝,这又是什么原因?

[编辑 -  5/2/02 作者: sunkai]

[编辑 -  5/3/02 作者: sunkai]
sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-05-02 23:21
嫌分少吗?
lcy
lcy
驱动牛犊
驱动牛犊
  • 注册日期2001-07-17
  • 最后登录2005-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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下该代码却是好的。请问您能帮我吗?
lcy
lcy
驱动牛犊
驱动牛犊
  • 注册日期2001-07-17
  • 最后登录2005-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-05-02 23:56
我试着回答你这个问题,请查查你的D+和D-线,看是否太细?离USB接口比较远?
另外我向你请教的问题,请费心!!
lcy
lcy
驱动牛犊
驱动牛犊
  • 注册日期2001-07-17
  • 最后登录2005-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-03 00:00
我试着回答你这个问题,请查查你的D+和D-线,看是否太细?离USB接口比较远?
另外我向你请教的问题,请费心!!

sunkai
驱动中牛
驱动中牛
  • 注册日期2002-12-31
  • 最后登录
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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]
游客

返回顶部