打印

PDIUSBD12[结贴]

[复制链接]
1956|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
箫笑|  楼主 | 2009-3-18 09:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问一下D12的中断寄存器里的各个位是在什么情况下会置位的?

按照我之前的理解,D12的端点0接收到PC发过来的请求命令就会置“控制输出端点”这个位,同理,当端点0向PC发送完了数据之后,“控制输入端点”会置位。

但是我现在的现象是,接收到控制输出中断,清中断位,应答Setup包这些操作完了之后就开始不断的收到控制输入的中断了,这个时候我还没有写向PC机返回数据的程序,怎么产生的控制输入中断呢?

还有一个现象是,Set地址完再返回配置描述符之后,读中断寄存器竟然是0x03,也就是输入输出都产生了中断??不明白这是怎么回事?看到配置描述符返回是正确的。

相关帖子

沙发
computer00| | 2009-3-18 09:35 | 只看该作者

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

使用特权

评论回复
板凳
箫笑|  楼主 | 2009-3-18 09:55 | 只看该作者

你是说F3 SetMode那个命令吗?

没有发现关于这个设置哦??

使用特权

评论回复
地板
computer00| | 2009-3-18 13:00 | 只看该作者

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

使用特权

评论回复
5
箫笑|  楼主 | 2009-3-19 00:33 | 只看该作者

再问圈圈

按照你说的方法,如果把中断模式设置为1,则会出现我上面说的一直产生控制输入的中断,设为0则不会,看了调试信息之后我发现确实是没有收到PC机的应答,会不会是这个控制输入中断其实是“NAKing”产生的呢?可能主要的问题是主机没有应答,不知道是为啥?

以下是我的调试信息:

Get IntNO=0x80
Get IntNO=0x40

得到控制输出中断:
Get IntNO=0x01,Now in control out.

得到PC发来的请求命令,进入GetDescriptor:
Get Command=0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00 
Now in UsbGetDescriptor ().Get Device Descriptor.

向PC发送Dev配置数据:
Device Send Data=0x12 0x01 0x10 0x01 0x00 0x00 0x00 0x10 0x71 0x04 0x22 0x02 0x13 0x01 0x00 0x00 

发送完毕产生控制输入中断,最大包16,再发剩余的数据:
Get IntNO=0x02,NOw in control In.
Device Send Data=0x00 0x01 

?????<---------按理PC在这里应该返回应答的,但是没收到。

复位,进入Set地址:
Get IntNO=0x40
Get IntNO=0x01,Now in control out.
Get Command=0x00 0x05 0x01 0x00 0x00 0x00 0x00 0x00 
Now in Get SetAddress().

发送0数据,完成产生输入中断:
Device Send Data=
Get IntNO=0x02,NOw in control In.

继续GetDescriptor:
Get IntNO=0x01,Now in control out.
Get Command=0x80 0x06 0x00 0x01 0x00 0x00 0x12 0x00 
Now in UsbGetDescriptor ().Get Device Descriptor.
Device Send Data=0x12 0x01 0x10 0x01 0x00 0x00 0x00 0x10 0x71 0x04 0x22 0x02 0x13 0x01 0x00 0x00 

Get IntNO=0x02,NOw in control In.
Device Send Data=0x00 0x01 
Get IntNO=0x02,NOw in control In.

Get IntNO=0x01,Now in control out.
Get Command=0x80 0x06 0x00 0x02 0x00 0x00 0x09 0x00 
Now in UsbGetDescriptor ().Get Config descriptor.
Device Send Data=0x09 0x02 0x20 0x00 0x01 0x01 0x00 0x80 0x32 

Get IntNO=0x02,NOw in control In.

Get IntNO=0x01,Now in control out.
Get Command=0x80 0x06 0x00 0x02 0x00 0x00 0xFF 0x00 
Now in UsbGetDescriptor ().Get Config descriptor.
Device Send Data=0x09 0x02 0x20 0x00 0x01 0x01 0x00 0x80 0x32 0x09 0x04 0x00 0x00 0x02 0x08 0x04 

Get IntNO=0x02,NOw in control In.
Device Send Data=0x50 0x00 0x07 0x05 0x82 0x02 0x40 0x00 0x00 0x07 0x05 0x02 0x02 0x40 0x00 0x00 

Get IntNO=0x02,NOw in control In.

按照正常的顺序,最后这里应该是接收到PC返回的一个应答,然后PC机就会开始寻找驱动安装了,但是我的却一直停在这里了,一段时间后被挂起了。如果中断模式设为1就是会一直出现Get IntNO=0x02,NOw in control In.

使用特权

评论回复
6
箫笑|  楼主 | 2009-3-19 07:45 | 只看该作者

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

但是主机就是不会去搜索安装驱动程序.....
我再研究下你的程序,谢谢谢谢!

使用特权

评论回复
7
箫笑|  楼主 | 2009-3-20 16:43 | 只看该作者

re

最后那次PC发来的命令是:
Get Command=0x80 0x06 0x00 0x02 0x00 0x00 0xFF 0x00 

请求256字节的配置描述,但是实际上我只有32字节,所以我分两次就发完了(最大包16),第二次发完产生控制输入中断以后我只是做了清除中断寄存器的操作,我想这时PC应该是继续等我发数据,等不到就挂起了。

我的解决办法是最后还要再发送一次,这次是发送零字节的数据。

搞不懂PC是怎么判断我发完了还是没发完的?例如前面的,PC请求64字节,但我只有18字节,我第一次发16,第二次发2字节,PC就知道我已经发完了??如果恰恰是16最大包的话最后就还要再发一次0字节,告诉它我发完了吗??

使用特权

评论回复
8
computer00| | 2009-3-25 15:51 | 只看该作者

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

控制输入传输,如果你在数据阶段,返回一个不是最大包长度的数据包,主机就会认为数据已经传输完毕。从而切换到状态阶段。因为协议规定了,每次数据返回必须要按照最大包长度发送,除非你已经发送完毕了。

那如果刚好所需要返回的数据是最大包长的整数倍时,就会遇到两种情况:
1)主机请求的刚好也是这么长,那么只需要返回这么长的数据即可,不用额外再返回一个0长度的数据包,因为主机它知道这时数据已经全部返回。
2)主机请求的比这个长度多(例如你这里的情况),但是你的设备确实不需要返回那么多数据,这时就需要告诉主机,你数据已经发送完毕了。怎么告诉呢?就是通过一个长度不够最大包长的数据来告诉。这个数据包就是一个0长度的数据包。否则主机就会一直等待,等你的数据返回,因为它不知道事实上你已将数据返回完了。

使用特权

评论回复
9
箫笑|  楼主 | 2009-3-27 23:08 | 只看该作者

谢谢

谢谢圈圈的解答!明白了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

368

帖子

0

粉丝