我遇到的问题

[复制链接]
 楼主| happlylife 发表于 2008-1-28 22:03 | 显示全部楼层 |阅读模式
我坐了一个USB键盘,现在枚举有点问题,已经能被Windows认识了,提示发现HID备,并已经可以使用.可是实际上不可以使用,我用BusHound观察发现有问题.<br />在获得Report描述符后,主机参数了一个DO&nbsp;01.然后我的设备就完全不能使用了.我不知道是什么原因啊.
 楼主| happlylife 发表于 2008-1-28 22:11 | 显示全部楼层

继续

我把我的截图和我的描述符发给大家.<br />//&nbsp;设备描述符号<br />const&nbsp;USB_DEVICE_DESCRIPTOR&nbsp;DeviceDescr&nbsp;=<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;sizeof(USB_DEVICE_DESCRIPTOR),<br />&nbsp;&nbsp;&nbsp;&nbsp;USB_DEVICE_DESCRIPTOR_TYPE,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x00010000,<br />&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//USB分配的类代码&nbsp;&nbsp;&nbsp;&nbsp;(已更改用于HID设备)<br />&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//USB分配的子类代码<br />&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;//USB分配的协议代码<br />&nbsp;&nbsp;&nbsp;&nbsp;EP0_PACKET_SIZE,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x00040071,&nbsp;&nbsp;&nbsp;&nbsp;//idVendor<br />&nbsp;&nbsp;&nbsp;&nbsp;0x00060066,&nbsp;&nbsp;&nbsp;&nbsp;//idProduct<br />&nbsp;&nbsp;&nbsp;&nbsp;0x00010000,&nbsp;&nbsp;&nbsp;&nbsp;//bcdDevce<br />&nbsp;&nbsp;&nbsp;&nbsp;0,//1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//iManufactor<br />&nbsp;&nbsp;&nbsp;&nbsp;0,//2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//iProduct<br />&nbsp;&nbsp;&nbsp;&nbsp;0,//3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//iSerialNumber<br />&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//bNumConfigurations<br />};<br /><br />//&nbsp;配置描述符<br />const&nbsp;USB_CONFIGURATION_DESCRIPTOR&nbsp;ConfigDescr&nbsp;=<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;sizeof(USB_CONFIGURATION_DESCRIPTOR),&nbsp;&nbsp;&nbsp;&nbsp;//09<br />&nbsp;&nbsp;&nbsp;&nbsp;USB_CONFIGURATION_DESCRIPTOR_TYPE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//02<br />&nbsp;&nbsp;&nbsp;&nbsp;CONFIG_DESCRIPTOR_LENGTH,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//29<br />&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0x0001<br />&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1<br />&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0<br />&nbsp;&nbsp;&nbsp;&nbsp;0xa0,&nbsp;&nbsp;&nbsp;&nbsp;//总线供电,支持远程唤醒&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0xa0<br />&nbsp;&nbsp;&nbsp;&nbsp;0xc8&nbsp;&nbsp;&nbsp;&nbsp;//400mA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0xc8<br />};<br /><br />//&nbsp;接口描述符<br />const&nbsp;USB_INTERFACE_DESCRIPTOR&nbsp;InterfaceDescr&nbsp;=<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;sizeof(USB_INTERFACE_DESCRIPTOR),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//09<br />&nbsp;&nbsp;&nbsp;&nbsp;USB_INTERFACE_DESCRIPTOR_TYPE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//04<br />&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//00<br />&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//00<br />&nbsp;&nbsp;&nbsp;&nbsp;NUM_ENDPOINTS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//02<br />&nbsp;&nbsp;&nbsp;&nbsp;0x03,//原来是USB_CLASS_CODE_TEST_CLASS_DEVICE,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x01,//原来是USB_SUBCLASS_CODE_TEST_CLASS_D12,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x01,//原来是USB_PROTOCOL_CODE_TEST_CLASS_D12,<br />&nbsp;&nbsp;&nbsp;&nbsp;0<br />};<br />//HID描述符<br />const&nbsp;USB_HID_DESCRIPTOR&nbsp;HidDescr=<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;sizeof(USB_HID_DESCRIPTOR),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//09<br />&nbsp;&nbsp;&nbsp;&nbsp;0x21,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//HID描述符<br />&nbsp;&nbsp;&nbsp;&nbsp;0x00010010,&nbsp;&nbsp;&nbsp;&nbsp;//HID版本号<br />&nbsp;&nbsp;&nbsp;&nbsp;0x21,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//国家代码<br />&nbsp;&nbsp;&nbsp;&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//随后的描述符数,这里只有一个报告描述符<br />&nbsp;&nbsp;&nbsp;&nbsp;0x22,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//随后的描述符类型,这里为报表描述符<br />&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;long&nbsp;int)sizeof(ReportDescr)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//报表描述符的长度<br />};<br />//&nbsp;端点1输入描述符<br />const&nbsp;USB_ENDPOINT_DESCRIPTOR&nbsp;EP1_TXDescr&nbsp;=<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;sizeof(USB_ENDPOINT_DESCRIPTOR),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//07<br />&nbsp;&nbsp;&nbsp;&nbsp;USB_ENDPOINT_DESCRIPTOR_TYPE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//05<br />&nbsp;&nbsp;&nbsp;&nbsp;0x81,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输入端点<br />&nbsp;&nbsp;&nbsp;&nbsp;USB_ENDPOINT_TYPE_INTERRUPT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;EP1_PACKET_SIZE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//16字节<br />&nbsp;&nbsp;&nbsp;&nbsp;0x0a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//中断扫描时间:10ms<br />};<br /><br />//&nbsp;端点1输出描述符<br />const&nbsp;USB_ENDPOINT_DESCRIPTOR&nbsp;EP1_RXDescr&nbsp;=<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;sizeof(USB_ENDPOINT_DESCRIPTOR),<br />&nbsp;&nbsp;&nbsp;&nbsp;USB_ENDPOINT_DESCRIPTOR_TYPE,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出端点<br />&nbsp;&nbsp;&nbsp;&nbsp;USB_ENDPOINT_TYPE_INTERRUPT,<br />&nbsp;&nbsp;&nbsp;&nbsp;EP1_PACKET_SIZE,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x0a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//中断扫描时间:10ms<br />};<br />我用的是凌阳的16位单片机,是小端格式的.所以和51有点不一样.
平常人 发表于 2008-1-28 22:42 | 显示全部楼层

你的输出端点是做什么的?

你键盘上的CAP&nbsp;Lock、Num&nbsp;Lock这几个灯是如何控制的?
 楼主| happlylife 发表于 2008-1-28 23:11 | 显示全部楼层

谢谢

我没有用输出端点做任何东西,但是我有对set&nbsp;report的处理.收到set&nbsp;report后我发送了一个0字节数据包.我也没有去设定字符串描述符.
 楼主| happlylife 发表于 2008-1-29 00:26 | 显示全部楼层

继续

&nbsp;&nbsp;&nbsp;&nbsp;在调试的过程中我还发现,我的设备根本就没有收到端点1的IN中断,所以在IN中断处理程序中的发送按键值的函数根本得不到执行.我可以把我的程序发上来让大家看看.我现在该位1个端点,设定位IN端点,中断传输.我在程序中加入了字符串描述符的发送.让程序更加完整.但是好像还是不可以使用哦.<br /><br />下面是附件,大家可以下载下去看看,里面有我的截图. <br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/20081/200812902634820.rar'>https://bbs.21ic.com/upfiles/img/20081/200812902634820.rar</a>
CheneyPeng 发表于 2008-1-29 08:43 | 显示全部楼层

11

是不是OUT端点的中断没有清除,导致一直进入OUT中断?&nbsp;我之前好像也碰到过这个问题,
 楼主| happlylife 发表于 2008-1-29 09:54 | 显示全部楼层

谢谢楼上的

是吗?那我读一次OUT端点最后状态是不是就可以了,可是我没有设置OUT端点啊,我的端点描述符就只有对IN端点的描述符啊.怎么会这样呢?
nj手术刀 发表于 2008-1-29 12:23 | 显示全部楼层

可能DO命令01你没正确处理,程序死了

  
 楼主| happlylife 发表于 2008-1-29 12:43 | 显示全部楼层

谢谢楼上

DO命令&nbsp;01是什么?应该怎么处理啊??我看OO的程序里没有发现有对这个进行处理的内容啊.
xwj 发表于 2008-1-29 12:51 | 显示全部楼层

“我坐了一个USB键盘”...

只听说过跪键盘的,没听说过坐键盘的;-)
 楼主| happlylife 发表于 2008-1-29 12:53 | 显示全部楼层

佩服

呵呵,楼上的好眼力啊..<br />
平常人 发表于 2008-1-29 13:46 | 显示全部楼层

既然没有用输出端点,为什么有输出端点描述符?

在USB键盘中,输出端点就是用来控制键盘上的CAP&nbsp;Lock、Num&nbsp;Lock这几个灯,我在3楼已经暗示过,但你没反应,说明你还没搞懂USB键盘;请打开HID报告描述符好好看一下吧,那里面一定有这部分内容。<br /><br />看样子这个键盘被你“坐”坏了,哈哈哈。。。。。。。
 楼主| happlylife 发表于 2008-1-29 16:58 | 显示全部楼层

谢谢楼上的指点

谢谢楼上的指点.我前面的那个描述符里是同时定义了输入输出端点,因为我看OO的程序里是这样的,只不过他用的是端点2(主端点),而我用的是端点1.另外我的报告描述符也是从OO哪里直接粘贴过来的.<br /><br />我后来只定义了一个输入端点,这个时候是在对SetReport处理后,产生了DO&nbsp;01,DO&nbsp;00&nbsp;01&nbsp;这两数据.然而当我同时定义了输入和输出端点时,没有产生SetReport命令,就直接产生了DO&nbsp;01&nbsp;DO&nbsp;00&nbsp;01这两个数据包.我又看了下书,书上说是:&quot;SetReport是主机向HID设备发送数据,如设置输入报告,输出报告和特征报告的状态等,如果HID设备没有中断OUT结点或者其只遵循HID规范1.0版,则她是主机向设备发送数据的唯一方法.对于HID设备来说,该请求不是必须的.&quot;<br />所以从我上面的情况看来在这一块是没有问题的,当定义了输入端点时就不需要用SetReport命令来向设备发送数据,而是直接用输出端点就可以了.<br /><br />在我的HID报告描述符里的确是有输出项的,如下:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;................前面省略<br />&nbsp;&nbsp;&nbsp;&nbsp;0x0095,&nbsp;0x0005,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(5)<br />&nbsp;&nbsp;&nbsp;&nbsp;0x0075,&nbsp;0x0001,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;0x0005,&nbsp;0x0008,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_PAGE&nbsp;(LEDs)<br />&nbsp;&nbsp;&nbsp;&nbsp;0x0019,&nbsp;0x0001,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_MINIMUM&nbsp;(Num&nbsp;Lock)<br />&nbsp;&nbsp;&nbsp;&nbsp;0x0029,&nbsp;0x0005,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_MAXIMUM&nbsp;(Kana)<br />&nbsp;&nbsp;&nbsp;&nbsp;0x0091,&nbsp;0x0002,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;OUTPUT&nbsp;(Data,Var,Abs)<br />&nbsp;&nbsp;&nbsp;&nbsp;0x0095,&nbsp;0x0001,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;0x0075,&nbsp;0x0003,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(3)<br />&nbsp;&nbsp;&nbsp;&nbsp;0x0091,&nbsp;0x0003,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;OUTPUT&nbsp;(Cnst,Var,Abs)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.........后面的省略<br /><br />我又发现一个现象,我用BusHound附带的BusCommder工具,向设备发送命令,通过端点0&nbsp;Control&nbsp;In/Out&nbsp;发送获得设备描述符,配置描述符,字符串描述符命令都可以接收到设备返回的内容,我用端点1的OUT&nbsp;端点发送数据到设备,也可以成功.但是我要是用端点1的IN&nbsp;端点&nbsp;想要让设备给主机发送数据,却不能通过,这时BusCommand而就不可以使用了,像死了一样.我想知道为什么会出现IN端点不可以使用呢?<br />我觉得我的问题不是输出的那两个数据,而是中断IN端点不能正常工作,我也不知道为什么,我的描述符也看不出毛病,并且用BusHound观察发现都被正确的发送到主机了.<br />看来我还有很多知识不是很清楚啊,我还要好好的学习啊.
CheneyPeng 发表于 2008-1-30 09:26 | 显示全部楼层

11

学习东西不能简单的把别人的程序copy过来了事了哦,哈哈,一定要自己搞一遍才能算掌握了,
 楼主| happlylife 发表于 2008-1-30 13:13 | 显示全部楼层

大家帮忙啊

还得请大家帮帮忙啊.我就一个人在弄,问人也没得问.只有靠论坛上的朋友帮忙了.先谢谢大家了
 楼主| happlylife 发表于 2008-1-30 19:55 | 显示全部楼层

我的问题解决了

我的问题解决了.因为我在枚举的最后会收到主机通过中断OUT端点发送到设备的数据,我在主程序中,对输出中断处理的地方加了一个向IN端点写数据的函数后就好了.后面就可以收到主机每10ms的IN中断,这样我就可以把我的按键值发送过去了.<br /><br />问题是我收到主机从中断OUT端点发送过来的这个数据后,为什么必须向中断IN端点写数据,这样才可以正常工作呢?如果不去写,就一直不可以工作,难道也是和控制输出一样,要回一个数据包吗?.<br />还有我的程序里对报告描述符,还有其他的描述符都参考了OO的程序,可是他的程序中对中断OUT的处理没有像我这样,向IN端点里写数据,为什么我会出现这样的情况呢.<br />我也是初学有很多的不明白,希望有朋友可以帮忙指点以下.<br />我的程序如下.......<br />while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P_Watchdog_Clear&nbsp;=&nbsp;0x0001;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bEPPflags.bits.bus_reset)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;总线复位处理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bEPPflags.bits.bus_reset&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bEPPflags.bits.suspend)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;总线挂起处理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bEPPflags.bits.suspend&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bEPPflags.bits.setup_packet)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;协议处理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bEPPflags.bits.setup_packet&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D12_Control_Handler();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bEPPflags.bits.Ep1_ReceiveDataFlag==1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bEPPflags.bits.Ep1_ReceiveDataFlag&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D12_ReadEndpointAndClrD12Int(2,&nbsp;16,&nbsp;aIdFlag);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D12_WriteEndpointAndClrD12Int(3,&nbsp;0,&nbsp;0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这个函数是用于应答&nbsp;DO&nbsp;的,向结点3(端点1的IN端点)写0字节数据,只有应答后,才算枚举通过,//才可以定时的产生IN中断.否则无法产生IN中断.这样设备不可以使用,无法发送按键值给主机.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bEPPflags.bits.Ep1_SendDataFlag==1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bEPPflags.bits.Ep1_SendDataFlag&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyID();&nbsp;//只有上面对结点3写入数据后,才可以运行到这里,才可以每10ms产生IN中断.发送按键值.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

12

帖子

0

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