CH554 HID通信超时问题

我用之前官方的这个例程添加了一下端点4上传的功能,通过bushound测试时可以看到端点4成功接收到数据并且返回。

QQ截图20231215224826.png

但是我使用自己编写的上位机进行测试的时候,通过bushound可以看到数据同样可以返回,但是我的上位机却提示端点通信超时,上位机使用libusb进行通信,我测试了一下,上位机的程序读写ch573官方的HID通信例程是可以接收到信息的,但是我修改的ch554却不能与上位机通信成功。

libusb提示超时,但是看通信像是libusb还没有开始接收,ch554就把数据传输上去了,导致上位机一直接收不到消息。

QQ截图20231215224958.png

下面这个是当时官方原来的例程,只有端点4接收的功能

icon_rar.gifEXAM_键盘鼠标多媒体自定义HID_V200 - 副本.zip

下面是我添加的与上传相关的程序

void?Enp4IntIn(UINT8?len?)
{
????UEP4_T_LEN?=?len;??????????????????????????????????????????????//上传数据长度
????UEP4_CTRL?=?UEP4_CTRL?&?~?MASK_UEP_T_RES?|?UEP_T_RES_ACK;??????????????????//有数据时上传数据并应答ACK
}

void?hid_send_data(unsigned?char?endp,?unsigned?char*?sendData,?unsigned?char?len)??//hid端点上传数据
{
????if(Ready)
????{
????????switch(endp)
????????{
????????????case?1:?//
????????????????Ep1FLAG?=?0;
????????????????memcpy(Ep1Buffer,?sendData,?len);
????????????????Enp1IntIn(len);
????????????????while(Ep1FLAG?==?0);
????????????????break;
????????????case?2:?//
????????????????Ep2FLAG?=?0;
????????????????memcpy(Ep2Buffer,?sendData,?len);???
????????????????Enp2IntIn(len);
????????????????while(Ep2FLAG?==?0);
????????????????break;
????????????case?3:?//
????????????????Ep3FLAG?=?0;
????????????????memcpy(Ep3Buffer,?sendData,?len);???
????????????????Enp3IntIn(len);
????????????????while(Ep3FLAG?==?0);
????????????????break;
????????????case?4:?//
????????????????Ep4FLAG?=?0;
????????????????memcpy(&Ep0Buffer[128],?sendData,?len);?
????????????????Enp4IntIn(len);
????????????????while(Ep4FLAG?==?0);
????????????????break;
????????????default:
????????????????break;
????????}
????????UEP4_CTRL?=?UEP4_CTRL?&?~?MASK_UEP_R_RES?|?UEP_R_RES_ACK;????????????//默认应答NAK??
????}
}

可以帮忙分析一下是什么地方的问题吗,上位机应该是没有问题,我用ch573中的HID通信的例程测试过,ch554和ch573这两个usb中断处理中有什么不同吗,是不是因为ch554中没有检测空闲状态

上面的程序显示好像乱码了


您好

上面的代码没有看出什么问题,USB通讯是主机主导的,上传数据也是需要主机下发IN令牌,设备才能上传数据,因此不存在主机不读,设备已经上传的情况,可以程序中添加打印,看下程序跑到哪个位置了,比如是否有可能停在了上面的

while(Ep4FLAG?==?0);

这句代码了?是否忘了清标志位?要注意的是我们的USB中断都是发送“完成”中断,IN“成功了”才会进中断!CH573也是相同的,可以对比下两个代码的处理有什么地方不同


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