1、問題描述
客戶反饋產(chǎn)品在使用 STM32G0C1NEY6TR 的 USART6 和另外一顆STM32L433CCY6TR 進(jìn)行單線串口半雙工通信時發(fā)現(xiàn)數(shù)據(jù)幀錯誤,而且很容易復(fù)現(xiàn)。從邏輯分析儀抓到的數(shù)據(jù)看是停止位報錯。
2、問題確認(rèn)
針對客戶的反饋,建議客戶用示波器抓串口波形看數(shù)據(jù)幀報錯時波形有沒異常。后來從抓到的波形看 STM32L433 發(fā)送過來的起始位數(shù)據(jù)電壓為 1.51v,明顯低于0.7VDD=2.31v(這里 STM32G0 VDD=3.3v,STM32L433 VDD=2.5v)。
3、問題分析
從示波器的波形看,客戶產(chǎn)品兩顆 MCU 串口通信的電平并不一致,STM32G0 是 3.3v供電,而 STM32L433 是 2.5v 供電。但正常 STM32L433 串口發(fā)送數(shù)據(jù)給 STM32G0 高電平為 2.4v 高于 0.7VDD,理論上這也不會影響正常的串口通信。我們懷疑 1.5V 電平是由于UART 通信線兩邊狀態(tài)切換時一邊拉高而另一邊拉低導(dǎo)致。建議客戶提供兩邊串口 GPIO 的配置,并檢查半雙工兩邊收發(fā)狀態(tài)切換時的時序邏輯。
4、問題解決
既然找到了產(chǎn)生問題的原因,也就為我們解決問題提供了思路。問題的解決方法比較簡單,我們查看客戶 STM32G0 切換 TX,RX 部分代碼,如下圖十,發(fā)現(xiàn)在 TX 發(fā)送完中斷處理函數(shù)中,要切換到 RX 接收狀態(tài)還需要經(jīng)過復(fù)雜的函數(shù)調(diào)用。后面建議客戶在 TX 發(fā)送完成中斷函數(shù)中直接修改 USART_CR2 寄存器的 SWAP 位完成切換到 RX。并且改用 DMA 收發(fā)數(shù)據(jù)。修改代碼后,客戶反饋波形得到改善,問題被解決。
5、小結(jié)
本篇筆記分享了怎么幫客戶一步步分析解決一個客制化單線串口半雙工通信幀錯誤問題的過程。后面也建議客戶在后續(xù)的開發(fā)中如果使用到單線串口,建議參考 ST 官方 RM0444提供的方式。畢竟這種客制化使用單線串口的方式,并不是 ST 推薦的方式,需要客戶自己驗(yàn)證其可靠性。