CH552 USB中断传输 建立SETUP失败

使用CH552芯片,希望模拟键鼠设备与PC建立通信。


使用例程运行正常,所以希望拓展一下模拟设备功能。

现在想在USB初始化开始,进行SETUP事务时,先接受PC的设备描述符请求,进入USB中断。此时假设不提前准备好描述符数据,而是先向其他设备请求,一段时间后通过其他通道接受到描述符数据,再将数据发往PC。


尝试了将描述符的处理过程从例程的USB中断处理中提取出来,作为一个独立的函数,另设标志位,在请求到来时,对标志位变更,然后根据标志位变化,在主循环实现对相关描述符数据的发送准备。

测试结果无法完成SETUP事务。


请问这个过程如何修改CH552例程实现?目前的例程只能在一个中断内完成数据的传输,要求提前准备好数据。若是设备主动发送数据,才有键鼠点击移动事件的例程。那么如何在不是设备主动发起数据发送的情况下, 不在请求到来的当次中断内返回数据,而在数据准备完成后再发送呢?

您好,根据您的描述。您可以在CH552获取并准备好描述符数据后,再以此为条件开始初始化并使能USB外设。USB通讯时,如果主机在一段时间内没有收到设备的响应,会认为设备失效,并断开与设备的链接。


超时的话应该有一个判定的时间吧,请问如果我在超时时间内能获取完整数据,这时应该如何从设备向PC发送刚刚收集到的数据呢?


您好,在数据准备好之前,枚举失败可以先将USB关闭,再重新打开USB,当数据准备好,枚举就能正常通过了。


我其实是希望模拟一个类似透传的过程。因为CH552芯片的XDATA空间并不足够让我存储一些特殊设备的完整的各类描述符。

有没有边和USB建立SETUP事务,一边从另一个设备处获取描述符,从而实现中转的方式呢?流程如:收到请求-转发请求-收到描述符-转发描述符。

CH552/554示例代码内有在中断外发送键鼠按键移动数据的方式。但没有提供中断外对PC的请求进行回复的示例,请问这种方式有什么可以实现的方式嘛?


USB2.0中本身就有类似流控的NAK、ACK响应应答机制。

image.png

建议可以参考相关资料了解一下USB2.0底层包应答机制。

另外USB2.0,所有数据收发,设备都是被动的,不存在所谓“中断外对PC的请求进行回复”这种概念。

收到请求-转发请求-收到描述符-转发描述符”这种功能的开发较为复杂,建议先将只做设备、只做主机研究透彻再进行后续开发,否则遇到问题将很难处理。



另外的,你的需求可能是要获取到键鼠数据,然后对数据进行一定修改再上报给电脑,类似射击游戏辅助器之类。

可以考虑直接使用CH9350:http://www.wch.cn/downloads/CH9350DS_PDF.html

避免涉及USB底层开发。


您好,感谢您之前在我关于552芯片描述符转发问题上的答复!

我放弃了中断外实现的想法,现在我在尝试在IN包的回复内实现数据发送。

请问一下CH552/554芯片,如何在中断中应答NAK而不回复数据呢?

ex:

我尝试了在中断中添加延时操作,在延时较长的情况下,对于描述符的请求,设备对请求回复ACK后,会在数据阶段的IN报文应答NAK,并在延时结束后回复数据,通信正常

那么有没有什么方式可以控制NAK的回复,在未能准备好数据的情况下首先对请求回复ACK表示收到,对IN报文也回复NAK,准备好数据再通过IN发送数据?

目前尝试了将示例代码中断中的setup事务处理修改,首次不回复数据,只保留ack应答,在in中断的处理中进行回复NAK。

出现的问题是逻辑分析仪显示会返回一个长度为0的报文,而不是纯粹的NAK。从而似乎直接跳过了数据阶段,进入状态阶段。

对于主机的请求,请问有办法软件主动控制NAK和ACK应答而不回复数据吗?



参考一下链接

http://www.wch.cn/bbs/thread-86976-1.html


只有登录才能回复,可以选择微信账号登录