1、问题描述
客户反馈产品在使用 STM32G0C1NEY6TR 的 USART6 和另外一颗STM32L433CCY6TR 进行单线串口半双工通信时发现数据帧错误,而且很容易复现。从逻辑分析仪抓到的数据看是停止位报错。
2、问题确认
针对客户的反馈,建议客户用示波器抓串口波形看数据帧报错时波形有没异常。后来从抓到的波形看 STM32L433 发送过来的起始位数据电压为 1.51v,明显低于0.7VDD=2.31v(这里 STM32G0 VDD=3.3v,STM32L433 VDD=2.5v)。
3、问题分析
从示波器的波形看,客户产品两颗 MCU 串口通信的电平并不一致,STM32G0 是 3.3v供电,而 STM32L433 是 2.5v 供电。但正常 STM32L433 串口发送数据给 STM32G0 高电平为 2.4v 高于 0.7VDD,理论上这也不会影响正常的串口通信。我们怀疑 1.5V 电平是由于UART 通信线两边状态切换时一边拉高而另一边拉低导致。建议客户提供两边串口 GPIO 的配置,并检查半双工两边收发状态切换时的时序逻辑。
4、问题解决
既然找到了产生问题的原因,也就为我们解决问题提供了思路。问题的解决方法比较简单,我们查看客户 STM32G0 切换 TX,RX 部分代码,如下图十,发现在 TX 发送完中断处理函数中,要切换到 RX 接收状态还需要经过复杂的函数调用。后面建议客户在 TX 发送完成中断函数中直接修改 USART_CR2 寄存器的 SWAP 位完成切换到 RX。并且改用 DMA 收发数据。修改代码后,客户反馈波形得到改善,问题被解决。
5、小结
本篇笔记分享了怎么帮客户一步步分析解决一个客制化单线串口半双工通信帧错误问题的过程。后面也建议客户在后续的开发中如果使用到单线串口,建议参考 ST 官方 RM0444提供的方式。毕竟这种客制化使用单线串口的方式,并不是 ST 推荐的方式,需要客户自己验证其可靠性。