求组:使用CH552模拟CH9326,上位机发送GET_REPORT请求1496次后,设备会断开并重新接入

spacer.gif微信截图_20201104084241.png



如图所示,每次在使用GET_REPORT命令1498次之后,设备都会自动断开,导致每次我都要重新在上位机上重新打开设备,请问如何避免这种情况,我的应用场景需要用到GET_REPORT一直获取IO口的输入信息,求助。

icon_rar.gifCH558&9模拟HID.zip

你好,用这个例程试一下


抱歉上面发错了,不是CH552的例程,但是也可以参考一下,主要是针对非标准命令的处理。从你的抓包结果看,你的程序应该没有加针对非标准命令的操作处理,导致发get report命令时一直置stall。



我看了下558的代码,对于消息响应部分没有差别,我对于非标准请求的代码贴在下面了,对于len的响应我新增了一个0xf0作为标记传送我需要的数据,我看不懂的是为啥每次都是到149x多的时候出现这个错误

if ( ( UsbSetupBuf->bRequestType & USB_REQ_TYP_MASK ) != USB_REQ_TYP_STANDARD )/* 非标准请求 */
{
	if( (UsbSetupBuf->bRequestType == 0xa1)&&(UsbSetupBuf->bRequest == HID_GET_REPORT) )
	{			
		len = 0xf0;   
	}
	if( (UsbSetupBuf->bRequestType == 0x21)&&(UsbSetupBuf->bRequest == HID_SET_IDLE) )
	{					
		UEP0_T_LEN = 0;            //Status stage complete, upload 0 data packet, end the control trans
		len = 0;   
	}
														                
}
////////////////////////////////////////////////////////////

        if(len == 0xff)
        {
                SetupReq = 0xFF;
                UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_STALL | UEP_T_RES_STALL;//STALL
        }
        else if(len == 0xf0)                                                       //上传数据或者状态阶段返回0长度包
        {		
		memcpy( Ep0Buffer, UserEp0Buf, 2);      //加载上传数据
                UEP0_T_LEN = 2;
		UEP0_CTRL ^= bUEP_T_TOG; 
		KeyCode=0;
         }						
            else if(len <= 8)                                                       //上传数据或者状态阶段返回0长度包
            {
                UEP0_T_LEN = len;
                UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK;//默认数据包是DATA1,返回应答ACK
            }
            else
            {
                UEP0_T_LEN = 0;  //虽然尚未到状态阶段,但是提前预置上传0长度数据包以防主机提前进入状态阶段
                UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK;//默认数据包是DATA1,返回应答ACK
            }



猜测是主机有相应的重传机制吧,之前应该是没有增加对非标准请求的处理,增加相应的处理应该问题就解决了。


上次的问题增加了非标准请求还是没有解决,设备断开我现在确定芯片是复位了的,我查看了一下PCON里的复位标志,表示的是看门狗复位,但是GLOBAL_CFG 寄存器里bWDOG_EN位读出为0,为什么还会产生看门狗复位?



你加我一下微信18951773083,然后把相应的上位机工具以及软件工程发我一下,我这边实际测试一下。


add the following line at case SETUP

case SETUP: UEP0_CTRL &= 0xF2; .....

This fixed that bug for me.


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