官方的AdvRemoteDongle工程已经成功更改为自定义的HID,通过PC上位机对设备发送数据。
设备程序中通过函数:usbfwReadFifo(uint8 volatile __xdata *pFifo, uint8 count, void __generic *pData)接收PC发过来的数据包,再串口打印该数据,可得到该数据是正确的,但PC再次发送数据时,则设备不能再次接收到数据,调试发现eventMask对应的中断没有再次被标记。跟踪变量,eventMask是在__interrupt void usbirqHandler(void)中断服务程序处理标记的。
总结一句话就是设备接到PC后,PC向设备发送第一次数据包是成功的,再次发送时,则失败,求解原因??
user4359466:
已解决以上问题!可正常与PC通信。有碰到同样的问题可以一起交流~~~
Hailong Wei:
回复 user4359466:
同样的问题,怎么解决呀?
user4359466:
回复 Hailong Wei:
太久了,都忘记了,关注一下USB缓冲方面的
user4359466:
回复 Hailong Wei:
找到以前开发时的笔记:
1、完成枚举自定义USB 11-32、PC 可发送一次数据至设备,但不能再次发送11-43、尝试更改为直接操作底层,问题依旧 11-44、没有更改为底层,对OUT编写了接口函数uint8 hidReceiveHidInReport(uint8 *pReport, uint8 endPoint, uint8 len)可实现收发11-5
———–
希望对你有帮助。另外顺便交流下,你的有做配对绑定吗,目前我与手机配对绑定时,不是每次都很顺利,要不就是很久,要不就是一直等待。除非不做配对绑定功能。
Hailong Wei:
回复 user4359466:
大神,此问题已经解决,万分感谢,只是我是业余水平,刚接触CC2540 个把月,您的问题我可能后续会碰到,目前我还没搞过配对。
贴上函数代码供他人参考:
uint8 hidReceiveHidInReport(uint8 *pReport, uint8 endPoint, uint8 len){ uint8 result = FALSE;
if (endPoint < 6) { uint8 ea = halIntLock();
USBFW_SELECT_ENDPOINT(endPoint); if ((USBCSOL & USBCSOL_OUTPKT_RDY)) { usbfwReadFifo(((&USBF0) + (endPoint << 1)), len, pReport); USBCSOL &= ~USBCSOL_OUTPKT_RDY; result = TRUE; } halIntUnlock(ea); } return result;}