关于RS485的DMA发送,以及EN使能脚的自动切换
一、電路設計
1、低成本非隔離:
3.3v系統同樣,將5V改為3.3即可。同時采用TX連接三極管,實現三極管驅動RS485芯片的EN使能腳,從而省下一個IO口控制。隔離只需要將兩個信號線用光耦隔離即可。
2、高成本隔離:
兩邊電源為不同電源,從而實現隔離。成本較高。A/B端也要并聯10K電阻能提高通訊質量。
?
二、關于第一種方案的問題分析
1、光耦隔離時需考慮光耦開通速度與關閉速度,較高波特率將導致通訊失敗,例如PC817,不適合波特率9600及以上。
2、采用三極管接TX控制使能引腳會導致出RX上反射電壓,原因為EN腳一直反復跳變,RS485的A B上電壓變化未完成時,已切換成了接收模式,見下圖:(紅色曲線前半段,較細的即為RX上被TX反射出的電壓)
三、上述問題的解決方案
第一種問題詳細見另一篇博文:
https://blog.csdn.net/qq_27747359/article/details/107721969?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161528644516780271555475%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=161528644516780271555475&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-3-107721969.pc_v2_rank_blog_default&utm_term=485
第二種問題分為硬件解決和軟件解決:
硬件解決:A B間并聯10k電阻,加大放電速度,使得A B的電平變化速度加快6倍左右,RX上反射的波形持續時間縮短,軟件將不會觸發串口接收中斷。以下為并聯10k電阻,和無電阻的對比:
10K電阻并聯?
無并聯電阻軟件解決:再發送未完成之前,禁止接收中斷,從而屏蔽掉反射波形的影響。
ST官方都有APPNOTE指導的(對于UART沒有RS485功能的單片機型號而言):
1、啟動DMA前,先關閉UART發送完成中斷,并清除發送完成中斷標志;
2、在DMA傳輸完成中斷函數中,開啟UART發送完成中斷;
3、在UART發送完成中斷函數中,切換RS485為接收態;
(可以在發送的時候將串口接收直接失能,在串口發送完成中斷中再使能)
?
DMA中斷時,只表示需要傳送的所有數據字節全部傳送到串口的發送數據寄存器中了。
此時串口實際上還有2個字節并未發送完成,數據寄存器和移位寄存器中的2個字節還需要發送,并不能關閉串口發送。
同理,如果是485切換方向,必須要等到發送完成,也就是移位寄存器發送完成-TC標志置位。
?
你看串口的硬件結構就明白了,TXE指的是發送緩沖器DR空,TC指的是SHIFT移位寄存器空。
DMA完成只是代表把最后一個字節送到DR寄存器里面了,此時SHIFT移位寄存器有1個字節正在開始發送,
DR寄存器里面有一個字節等待發送,所以就是2個字節未發送完成。
四、總結
1、并不是所有的單片機都會被該干擾波形影響,實測中stm32有的項目中無影響,但是國產GD32芯片相同的項目會觸發串口中斷,接收到0xff。
2、僅僅靠上述軟件解決,可能仍然會觸發一次串口接收中斷,接收0xff,根據實際需要可進行手動去除,但并不是最完美方案。
?
?
總結
以上是生活随笔為你收集整理的关于RS485的DMA发送,以及EN使能脚的自动切换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: abap文件上传与下载
- 下一篇: 表格标签,今日小说排行榜案例,合并单元格