PDIUSBD12[结贴]

[复制链接]
 楼主| 箫笑 发表于 2009-3-18 09:24 | 显示全部楼层 |阅读模式
请问一下D12的中断寄存器里的各个位是在什么情况下会置位的?<br /><br />按照我之前的理解,D12的端点0接收到PC发过来的请求命令就会置“控制输出端点”这个位,同理,当端点0向PC发送完了数据之后,“控制输入端点”会置位。<br /><br />但是我现在的现象是,接收到控制输出中断,清中断位,应答Setup包这些操作完了之后就开始不断的收到控制输入的中断了,这个时候我还没有写向PC机返回数据的程序,怎么产生的控制输入中断呢?<br /><br />还有一个现象是,Set地址完再返回配置描述符之后,读中断寄存器竟然是0x03,也就是输入输出都产生了中断??不明白这是怎么回事?看到配置描述符返回是正确的。
computer00 发表于 2009-3-18 09:35 | 显示全部楼层

你是不是将MODE寄存器设置成了调试模式?改成normal模式

  
 楼主| 箫笑 发表于 2009-3-18 09:55 | 显示全部楼层

你是说F3 SetMode那个命令吗?

没有发现关于这个设置哦??
computer00 发表于 2009-3-18 13:00 | 显示全部楼层

就是。可以参考俺书中的代码。关于这个问题也已经有好几

  
 楼主| 箫笑 发表于 2009-3-19 00:33 | 显示全部楼层

再问圈圈

按照你说的方法,如果把中断模式设置为1,则会出现我上面说的一直产生控制输入的中断,设为0则不会,看了调试信息之后我发现确实是没有收到PC机的应答,会不会是这个控制输入中断其实是“NAKing”产生的呢?可能主要的问题是主机没有应答,不知道是为啥?<br /><br />以下是我的调试信息:<br /><br />Get&nbsp;IntNO=0x80<br />Get&nbsp;IntNO=0x40<br /><br /><font color=#800000>得到控制输出中断:<br /></font>Get&nbsp;IntNO=0x01,Now&nbsp;in&nbsp;control&nbsp;out.<br /><br /><font color=#800000>得到PC发来的请求命令,进入GetDescriptor:</font><br />Get&nbsp;Command=0x80&nbsp;0x06&nbsp;0x00&nbsp;0x01&nbsp;0x00&nbsp;0x00&nbsp;0x40&nbsp;0x00&nbsp;<br />Now&nbsp;in&nbsp;UsbGetDescriptor&nbsp;().Get&nbsp;Device&nbsp;Descriptor.<br /><br /><font color=#800000>向PC发送Dev配置数据:</font><br />Device&nbsp;Send&nbsp;Data=0x12&nbsp;0x01&nbsp;0x10&nbsp;0x01&nbsp;0x00&nbsp;0x00&nbsp;0x00&nbsp;0x10&nbsp;0x71&nbsp;0x04&nbsp;0x22&nbsp;0x02&nbsp;0x13&nbsp;0x01&nbsp;0x00&nbsp;0x00&nbsp;<br /><br /><font color=#800000>发送完毕产生控制输入中断,最大包16,再发剩余的数据:</font><br />Get&nbsp;IntNO=0x02,NOw&nbsp;in&nbsp;control&nbsp;In.<br />Device&nbsp;Send&nbsp;Data=0x00&nbsp;0x01&nbsp;<br /><br /><font color=#800000>?????&lt---------按理PC在这里应该返回应答的,但是没收到。</font><br /><br /><font color=#800000>复位,进入Set地址:</font><br />Get&nbsp;IntNO=0x40<br />Get&nbsp;IntNO=0x01,Now&nbsp;in&nbsp;control&nbsp;out.<br />Get&nbsp;Command=0x00&nbsp;0x05&nbsp;0x01&nbsp;0x00&nbsp;0x00&nbsp;0x00&nbsp;0x00&nbsp;0x00&nbsp;<br />Now&nbsp;in&nbsp;Get&nbsp;SetAddress().<br /><br /><font color=#800000>发送0数据,完成产生输入中断:</font><br />Device&nbsp;Send&nbsp;Data=<br />Get&nbsp;IntNO=0x02,NOw&nbsp;in&nbsp;control&nbsp;In.<br /><br /><font color=#800000>继续GetDescriptor:</font><br />Get&nbsp;IntNO=0x01,Now&nbsp;in&nbsp;control&nbsp;out.<br />Get&nbsp;Command=0x80&nbsp;0x06&nbsp;0x00&nbsp;0x01&nbsp;0x00&nbsp;0x00&nbsp;0x12&nbsp;0x00&nbsp;<br />Now&nbsp;in&nbsp;UsbGetDescriptor&nbsp;().Get&nbsp;Device&nbsp;Descriptor.<br />Device&nbsp;Send&nbsp;Data=0x12&nbsp;0x01&nbsp;0x10&nbsp;0x01&nbsp;0x00&nbsp;0x00&nbsp;0x00&nbsp;0x10&nbsp;0x71&nbsp;0x04&nbsp;0x22&nbsp;0x02&nbsp;0x13&nbsp;0x01&nbsp;0x00&nbsp;0x00&nbsp;<br /><br />Get&nbsp;IntNO=0x02,NOw&nbsp;in&nbsp;control&nbsp;In.<br />Device&nbsp;Send&nbsp;Data=0x00&nbsp;0x01&nbsp;<br />Get&nbsp;IntNO=0x02,NOw&nbsp;in&nbsp;control&nbsp;In.<br /><br />Get&nbsp;IntNO=0x01,Now&nbsp;in&nbsp;control&nbsp;out.<br />Get&nbsp;Command=0x80&nbsp;0x06&nbsp;0x00&nbsp;0x02&nbsp;0x00&nbsp;0x00&nbsp;0x09&nbsp;0x00&nbsp;<br />Now&nbsp;in&nbsp;UsbGetDescriptor&nbsp;().Get&nbsp;Config&nbsp;descriptor.<br />Device&nbsp;Send&nbsp;Data=0x09&nbsp;0x02&nbsp;0x20&nbsp;0x00&nbsp;0x01&nbsp;0x01&nbsp;0x00&nbsp;0x80&nbsp;0x32&nbsp;<br /><br />Get&nbsp;IntNO=0x02,NOw&nbsp;in&nbsp;control&nbsp;In.<br /><br />Get&nbsp;IntNO=0x01,Now&nbsp;in&nbsp;control&nbsp;out.<br />Get&nbsp;Command=0x80&nbsp;0x06&nbsp;0x00&nbsp;0x02&nbsp;0x00&nbsp;0x00&nbsp;0xFF&nbsp;0x00&nbsp;<br />Now&nbsp;in&nbsp;UsbGetDescriptor&nbsp;().Get&nbsp;Config&nbsp;descriptor.<br />Device&nbsp;Send&nbsp;Data=0x09&nbsp;0x02&nbsp;0x20&nbsp;0x00&nbsp;0x01&nbsp;0x01&nbsp;0x00&nbsp;0x80&nbsp;0x32&nbsp;0x09&nbsp;0x04&nbsp;0x00&nbsp;0x00&nbsp;0x02&nbsp;0x08&nbsp;0x04&nbsp;<br /><br />Get&nbsp;IntNO=0x02,NOw&nbsp;in&nbsp;control&nbsp;In.<br />Device&nbsp;Send&nbsp;Data=0x50&nbsp;0x00&nbsp;0x07&nbsp;0x05&nbsp;0x82&nbsp;0x02&nbsp;0x40&nbsp;0x00&nbsp;0x00&nbsp;0x07&nbsp;0x05&nbsp;0x02&nbsp;0x02&nbsp;0x40&nbsp;0x00&nbsp;0x00&nbsp;<br /><br />Get&nbsp;IntNO=0x02,NOw&nbsp;in&nbsp;control&nbsp;In.<br /><br /><font color=#800000>按照正常的顺序,最后这里应该是接收到PC返回的一个应答,然后PC机就会开始寻找驱动安装了,但是我的却一直停在这里了,一段时间后被挂起了。如果中断模式设为1就是会一直出现Get&nbsp;IntNO=0x02,NOw&nbsp;in&nbsp;control&nbsp;In.</font>
 楼主| 箫笑 发表于 2009-3-19 07:45 | 显示全部楼层

前面的流程我也都走下来了

但是主机就是不会去搜索安装驱动程序.....<br />我再研究下你的程序,谢谢谢谢!
 楼主| 箫笑 发表于 2009-3-20 16:43 | 显示全部楼层

re

最后那次PC发来的命令是:<br />Get&nbsp;Command=0x80&nbsp;0x06&nbsp;0x00&nbsp;0x02&nbsp;0x00&nbsp;0x00&nbsp;0xFF&nbsp;0x00&nbsp;<br /><br />请求256字节的配置描述,但是实际上我只有32字节,所以我分两次就发完了(最大包16),第二次发完产生控制输入中断以后我只是做了清除中断寄存器的操作,我想这时PC应该是继续等我发数据,等不到就挂起了。<br /><br />我的解决办法是最后还要再发送一次,这次是发送零字节的数据。<br /><br />搞不懂PC是怎么判断我发完了还是没发完的?例如前面的,PC请求64字节,但我只有18字节,我第一次发16,第二次发2字节,PC就知道我已经发完了??如果恰恰是16最大包的话最后就还要再发一次0字节,告诉它我发完了吗??<br />
computer00 发表于 2009-3-25 15:51 | 显示全部楼层

就是这样的。你可以看我书中的代码,就是有这个处理的。

控制输入传输,如果你在数据阶段,返回一个不是最大包长度的数据包,主机就会认为数据已经传输完毕。从而切换到状态阶段。因为协议规定了,每次数据返回必须要按照最大包长度发送,除非你已经发送完毕了。<br /><br />那如果刚好所需要返回的数据是最大包长的整数倍时,就会遇到两种情况:<br />1)主机请求的刚好也是这么长,那么只需要返回这么长的数据即可,不用额外再返回一个0长度的数据包,因为主机它知道这时数据已经全部返回。<br />2)主机请求的比这个长度多(例如你这里的情况),但是你的设备确实不需要返回那么多数据,这时就需要告诉主机,你数据已经发送完毕了。怎么告诉呢?就是通过一个长度不够最大包长的数据来告诉。这个数据包就是一个0长度的数据包。否则主机就会一直等待,等你的数据返回,因为它不知道事实上你已将数据返回完了。<br /><br />
 楼主| 箫笑 发表于 2009-3-27 23:08 | 显示全部楼层

谢谢

谢谢圈圈的解答!明白了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

368

帖子

0

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

78

主题

368

帖子

0

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