[圈圈教你玩USB] USB开发中的难题

[复制链接]
 楼主| phd8882004 发表于 2008-9-5 16:10 | 显示全部楼层 |阅读模式
我用的USB芯片是PDIUSBD12,固件程序和应用程序都编写好了,驱动程序用的是WINDOWS自带的HID设备驱动程序。<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;现在遇到个麻烦事,设备在WIN2000上能识别,但到XP(SP1)上就不识别了,而我在XP里的固件程序里如果设置一些断点,这样运行的话,在XP上就能识别,去掉断点整个程序全速运行又不行了<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;用BUS&nbsp;HOUND捕捉到的数据只有&nbsp;GET&nbsp;STATUS&nbsp;&&nbsp;CLEAR&nbsp;FEATURE两个过程。<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;已经调试了两天,没有眉目,请大虾圈圈与高手不吝赐教!!!!多谢<br />&nbsp;<br /><br />
iC921 发表于 2008-9-5 16:13 | 显示全部楼层

帮顶!

  
 楼主| phd8882004 发表于 2008-9-5 16:18 | 显示全部楼层

多谢,在线等大虾关怀的降临

  
 楼主| phd8882004 发表于 2008-9-5 20:05 | 显示全部楼层

大家帮忙看下,感谢中

  
computer00 发表于 2008-9-5 21:20 | 显示全部楼层

有可能是你设置地址处理不对吧

需要先设置地址,再返回0长度的状态包。<br /><br />关于D12的例子,我的USB小组里有很多。
 楼主| phd8882004 发表于 2008-9-6 18:14 | 显示全部楼层

圈圈你好~~~

5楼:&nbsp;有可能是你设置地址处理不对吧&nbsp;<br /><br />需要先设置地址,再返回0长度的状态包。<br /><br />关于D12的例子,我的USB小组里有很多。&nbsp;<br />&nbsp;<br />//////////////////////////////////////////////////////////<br />//设置地址<br />void&nbsp;set_address(void)<br />{<br />D12_SetAddressEnable((unsigned&nbsp;char)(ControlData.DeviceRequest.wValue&nbsp;&<br />DEVICE_ADDRESS_MASK),&nbsp;1);<br />single_transmit(0,&nbsp;0);<br /><br /><br />}<br /><br /><br />上面是我的代码,设置地址代码应该是没有问题的。<br />///////////////////////////////////////////////////////////<br />关于设置断点后枚举成功的问题,我导师说只是多了一个延时,后来我把下面的程序:<br /><br />//USB中断服务子程序<br />void&nbsp;fn_usb_isr()<br />{<br />&nbsp;&nbsp;unsigned&nbsp;int&nbsp;i_st;<br />&nbsp;&nbsp;bEPPflags.bits.in_isr&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;i_st&nbsp;=&nbsp;D12_ReadInterruptRegister();//读取中断寄存器&nbsp;调用D12ci.c中的<br />&nbsp;&nbsp;if(i_st&nbsp;!=&nbsp;0){........}<br /><br />改成:<br /><br />//USB中断服务子程序<br />void&nbsp;fn_usb_isr()<br />{<br />&nbsp;&nbsp;unsigned&nbsp;int&nbsp;i_st;<br /><br />&nbsp;&nbsp;bEPPflags.bits.in_isr&nbsp;=&nbsp;1;<br /><br />&nbsp;&nbsp;i_st&nbsp;=&nbsp;D12_ReadInterruptRegister();//读取中断寄存器&nbsp;调用D12ci.c中的子程序<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;i_st&nbsp;=&nbsp;D12_ReadInterruptRegister();//此处为加上去的,读中断寄存器两次<br />&nbsp;&nbsp;if(i_st&nbsp;!=&nbsp;0)<br /><br />这样却能在去掉断点后能成功枚举,电脑能识别到设备。<br />//////////////////////////////////////////////////////////<br />&nbsp;请再问大家这是什么问题引起的呢?
 楼主| phd8882004 发表于 2008-9-6 18:20 | 显示全部楼层

问题补充

&nbsp;&nbsp;&nbsp;&nbsp;这样一修改,同时在上位机应用程序与单片机通信时又出现新的问题,通信过程中,只能正确读取一个数据,应用程序发送第二个数据时,用BUS&nbsp;HOUND检测到不能成功发送到总线了,同时CreateFile函数返回值HidDevice为-1,但却能获得FindTheHid,请问这是什么原因造成的呢?<br /><br />&nbsp;&nbsp;&nbsp;这些问题是由系统引起的,WIN2000与WINXP系统在USB通信方面,主控制器识别设备的过程有什么不同吗?<br /><br />
computer00 发表于 2008-9-6 19:17 | 显示全部楼层

会不会是你将中断模式设置成了调试模式?原因很多的,要

  
 楼主| phd8882004 发表于 2008-9-6 21:04 | 显示全部楼层

谢谢圈圈的解答,你的书定价多少?我想买

&nbsp;&nbsp;&nbsp;现在查出来是PID,VID没有及时清零,所以即使HidDevice为-1也发送数据,只是数据没有发送到总线上而已。至于固件程序,我还是用不理解的那个读中断寄存器两次的方式。
computer00 发表于 2008-9-6 22:23 | 显示全部楼层

书还没排版呢,定价就更别说了,再等等吧~~~

  
computer00 发表于 2008-9-8 10:00 | 显示全部楼层

扯的吧?俺都不知道呢~~~~~

  
hq_y 发表于 2008-9-8 10:03 | 显示全部楼层

看看书有多少页就知道大概齐的价格了

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

12

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

2

主题

12

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部