以前用STM32F103的USB做CDC设备,现在将代码移植到GD32C103,只是换了USB library代码,如下应用层逻辑是没改的:
1. 在cdc_acm_init中发起首次usbd_ep_recev,随时准备从电脑接收数据
2. 在cdc_acm_out回调函数中,也就是单片机成功接收了来自电脑的数据(例如要转发至串口的数据)之后,立刻再次调用usbd_ep_recev准备下一次接收
3. 在主函数中判断是否有新数据(例如来自串口的数据)需要通过USB发送,如果有,则直接调用usbd_ep_send通过一个IN EP向电脑发送
以上逻辑在STM32上是可以长期稳定工作的,但是在gd32c103上会出现单片机接收数据时USB中断丢失问题,大部分时候都是RXFIFO的中断都收到了但是收不到OUT EP的TF中断,然后通信就中止了。
如果把上述第三步的发送代码禁用掉,则接收一切正常。只要发送随便什么内容,貌似在某个特殊的时间窗口下,就会干扰接收中断的生成。为了排除问题,我现在已经收和发用不同的Endpoint了,一个是1,一个是2,还是一样的问题。
各位大佬们有遇到过类似的问题吗?
PS:认真读了gd32的firmware library中的CDC例程,竟然只是个内部回环测试。。。根本没操作串口硬件。。。所以没有从串口收到的数据如何发送给USB的问题。。GD32这个USB的IP,该不会是半双工的吧? |