不知道怎么联系 GD32 的技术客服或者 FAE, 所以打算自己跟进底层代码看看究竟是哪里出了问题.
接收数据的关键回调是 cdc_acm_out, 调试发现该函数只在 usbd_isr 的 OEPIF 分支内被调用,
遂在 usbd_isr 内所有中断分支都打了个输出日志.
然后就观察到一个有意思的现象:
数据是在 RXFNEIF 里分批次接收的, 收了 2 次会来一个 OEPIF, 通知上层来取数据.
发送超过 512 字节的数据时, 日志是这这样的:
00> RXFNEIF
00> RXFNEIF
00> OEPIF
00> * cdc_acm_out: xfer_count=512, ep_num=3
00> RXFNEIF
也就是说, 收到 2 个 RXFNEIF 触发 OEPIF/cdc_acm_out 后, 又来了一个 RXFNEIF, 但是之后就再也没有 OEPIF 了.
调试发现超出 512 字节的数据确实在第三个 RXFNEIF 里成功收到了, 只是因为没有来 OEPIF 导致没通知到上层.
我想问题的关键应该在这里, 如果能够超时主动触发一下 OEPIF/cdc_acm_out 可能问题就解决了.
目前看来应该是固件库自身的 BUG, 希望 GD32 的技术人员能尽快解决!
|