F072 虚拟串口使用中需要注意的Bug (1)
最近在F072的USB 虚拟串口编程中发现通信不稳定现象,向主机批量发送数据时会有阻塞。
代码是移植ST 的库:STM32F0x2xx USB FS device library v1.0.0
F072 使用内部48MHz 振荡器工作。
1. 首先怀疑是F072 内部48M振荡器不稳造成的,看了一下F072 的CRS功能的默认配置,这个误差不会很大,F072会通过USB的SOF帧同步校准。
2. 再考虑是不是64字节整包发送完毕必须紧跟一个0字节空包问题,这个问题在原来F013的虚拟串口开发中遇到过,看了一下代码
发现这次的usbd_cdc_core.c 中已经注意到这个问题,
/*Send zero-length packet*/
DCD_EP_Tx (pdev, CDC_IN_EP, 0, 0);
测试发送64字节的数据包是好的。
3. 又怀疑了下列可能: 中断保护问题,CDC_IN_FRAME_INTERVAL的选择问题等,似乎都不能根本的解决问题。
无奈只得阅读跟踪代码,后来发现Bug所在:
在 usbd_cdc_core.c 中的函数 usbd_cdc_DataIn 有两句话:
APP_Rx_length = 0;
if (APP_Rx_length == CDC_DATA_IN_PACKET_SIZE) last_packet = 1;
显然,这是一个永远不会成立的比较语句。将这两句调换顺序:
if (APP_Rx_length == CDC_DATA_IN_PACKET_SIZE) last_packet = 1;
APP_Rx_length = 0;
再测试通信稳定。
注: usbd_cdc_core.c 的版本 version V1.0.1
|