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