USB实时传输的同时上传HID报文的兼容性问题
以CH592为例,在使用全速USB口同时处理实时传输和中断传输时,接不同的USB主机,有可能会出现HID报文完全无法上传的情况,甚至同一台台式机的不同USB口会分别出现OK和NG的现象。
USB功能以UAC麦克风上传录音数据+HID自定义设备方案为例,异常时的现象:接入电脑,打开电脑录音功能,BUSHOUND抓包发现无法成功上传HID报文,USB分析仪抓包发现电脑有周期性下发HID断电的IN令牌包,但MCU均回复NACK;仅在关闭录音功能后,HID键值才能够上传给电脑。
兼容性与两方面有关:①MCU的USB中断中处理数据的速度。②USB主机端下发IN令牌包的时间间隔。
当①过慢,且②过于紧凑时,会出现兼容性问题。
以下图的抓包情况为例,图左OK,图右NG。
Ⅰ.从进入USB中断翻转,到出USB中断,时间跨度约为30us;
Ⅱ.在实时传输产生后的28us时,电脑下发了HID事务的IN令牌包。
Ⅰ和Ⅱ共同作用,导致了HID报文无法上传,只有在关闭音频功能后,不再上传大量数据,HID报文才可以上传。
直接原因:MCU端的当USB中断服务函数未执行完毕时,期间USB主机端又下发的令牌包,MCU的USB控制器会自动回复NACK。
规避方案:①在USB处理函数本身、内部函数的定义处,均加上__HIGH_CODE 修饰一下,放在ram中运行,运行速度加快。
②手动调整优先级,在USB中断服务函数的同步端点发包前,先判断是否有HID键值待上传,若有,就不再填入DMA,待HID事务完成后再发出同步数据包。

浙公网安备 33010602011771号