之前的代码中,没有对 SET_IDLE 进行处理,所以会使用 STALL 进行回复。这次的目标是在代码中添加处理的代码。
作为比对,正常情况下应该使用下面的方式处理:
/* 分析并处理当前的SETUP包 */
len = 0; // 默认为成功并且上传0长度
status = 0;
if (( UsbSetupBuf->bRequestType & USB_REQ_TYP_MASK ) != USB_REQ_TYP_STANDARD ) /* 非标准请求 */
{
// 处理 HID_SET_IDLE
if ((UsbSetupBuf->bRequestType==0x21)&&(SetupReqCode==HID_SET_IDLE)) {
printf("SETUP HID_SET_IDLE\n");
R16_UEP0_T_LEN1 = 0;
R8_UEP0_TX_CTRL1 = UEP_DATA1 | UEP_T_RES_ACK; // 默认数据包是DATA1
return ;
}
status = 0xFF; // 操作失败
}
修改之后的运行结果:
完整代码如下: