如图所示,每次在使用GET_REPORT命令1498次之后,设备都会自动断开,导致每次我都要重新在上位机上重新打开设备,请问如何避免这种情况,我的应用场景需要用到GET_REPORT一直获取IO口的输入信息,求助。
你好,用这个例程试一下
抱歉上面发错了,不是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.