本帖最后由 bobby_yang2010 于 2010-4-1 22:28 编辑
最近要开发一个类似于USB HID键盘的设备,只不过我们还要从HOST接收一些液晶显示内容,所以我将它定义为一个厂商自定义设备。
看了几天CY7C638xx的数据手册和PSOC USB模块中的代码,感觉控制端点(端点0)部分的代码基本上看明白了,因为端点0的模式寄存器中,有SETUP,IN,OUT这几个标志,HOST发什么请求一下就明白。端点1和端点2的模式寄存器中,就没有这个标志,只有bit3-0这四个模式位,但仔细看数据手册中的模式表,也就是在IN/OUT中写入相应的值来响应主机的请求,但对于什么时候是IN,什么时候是OUT我还是不明白。后来在官方网站的“参考设计”中下载一个“USB鼠标参考设计”,仔细看了其中的代码,发现鼠标的什么按键,滚轮,光学传感器的X/Y都是定期的送到报告包中,再USB_LoadEP(ep,s,c)宏,通过端点1的IN通道送给HOST。具体实现就是将数据送到端点1的FIFO中,然后再修改模式寄存器,指示HOST数据已经送入FIFO,等到下次HOST查询时,把数据取走。
我不明白的是,如果我想接收主机的数据应如何做,也就是如何区分HOST发给端点1/2的IN/OUT包?我在USB模块代码中找到,可以通过void USB_EnableOutEP(BYTE)将端点1/2设置为输出端点,然后再BYTE USB_bGetEPState(BYTE)查询HOST是否有数据过来,再BYTE USB_bGetEPCount(BYTE)查询有多少个数据,最后再从FIFO中把数据取走。但是端点1我是要作为IN/OUT两个通道的,什么时候我应void USB_EnableOutEP(BYTE)将端点1/2设置为输出端点?
补充:CY7C638xx的端点1/2是不是只能配置成输入端点或输出端点,而不能一个端点配置成输入/输出两个通道?如果是这样,那我上面提的问题就不再是问题了!
补 |