如何排查串口通信問題?
工作過程中,總是會遇到各種各樣的通信問題,除了掌握軟件知識,必要的硬件技能也必不可少,比如萬用表、示波器、邏輯分析儀等,如此才能做到精準(zhǔn)定位,早點打卡下班~~
魚鷹根據(jù)個人多年的嵌入式開發(fā)經(jīng)驗,在此斗膽總結(jié)一番,希望可以給一些新人提供排查方向。
在此,以串口通信為例,介紹排查步驟或方向:
紅色代表可能出錯的位置
1、示波器看波形通信,不管是單向通信還是雙向通信,必然存在兩個器件,所以我們需要重點關(guān)注這兩個(這不是廢話嘛~),而兩者之間必然存在物理連接--導(dǎo)線(無線除外),遇到通信問題,應(yīng)該首先保證導(dǎo)線連接正常、電壓正常,如果這一點都沒有確定,直接跳過該步驟,很大可能做無用功,查來查去,最終可能查了一個寂寞。
串口雙向通信,一般會設(shè)計成主從方式,即一個主器件通過雙方約定好的協(xié)議主動向從機發(fā)起數(shù)據(jù)傳輸,并且從機永遠是被動應(yīng)答。這樣保證在多從機通信的情況下,不會出現(xiàn)數(shù)據(jù)錯亂的情況(如果多個從機同時發(fā)送數(shù)據(jù),可能造成交通擁堵,畢竟一個方向只有一條道)。
這種情況下,可以讓主機定時發(fā)送固定數(shù)據(jù)幀(比如版本查詢,這樣可以減少變量),通過查看示波器來確定從機是否有返回數(shù)據(jù)。
如此,我們可以確定兩個問題:
1、觀察主機發(fā)送引腳波形是否正常(串口平時一般為高電平,發(fā)數(shù)據(jù)時才會變化)、同時需要確定電壓是否正常、波特率可看可不看、具體傳輸數(shù)據(jù)也是,因為該階段只是從大的方向進行排查;
2、從機是否有回應(yīng)。
這里又分為兩種情況:
1)從機沒有回應(yīng):
此時我們需要在接下來的排查步驟中確定幾個問題:
<1>從機發(fā)送功能是否正常?
<2>主機發(fā)送的數(shù)據(jù)從機是否已經(jīng)正常接收?
<3>主機發(fā)送的數(shù)據(jù)協(xié)議是否正確。
2)從機有回應(yīng)。
這種情況下,問題就比較簡單,重點排查上層協(xié)議即可(可以保證從機的收、發(fā)沒有問題)。
這里特別注意的是,波形測量位置一定是在最終點,而不是中間某個探測點或者模擬開關(guān)之類的器件。
比如,主機發(fā)送引腳,測量位置應(yīng)該在從機芯片的接收引腳,而測量主機的接收則在主機芯片的接收引腳,才不會導(dǎo)致結(jié)果誤判。
如果說步驟 1 發(fā)現(xiàn)主機沒有正常傳輸波形產(chǎn)生,就要根據(jù)情況再確定一些問題。
1、如果發(fā)現(xiàn)波形失真、變形、電壓不正常等情況,請呼叫硬件工程師一起排查。
2、主機芯片發(fā)送引腳可以看到波形,但從機接收引腳看不到,請使用萬用表確定是否虛焊接。相反方向也排查一遍。
3、主機或從機不能正常發(fā)送或接收。
如果你使用了 DMA 發(fā)送,又使用了《終極串口接收方式,極致效率》筆記介紹的方式接收,那么你可以從以下方向進行排查(其他更簡單的方式類似):
1)發(fā)送、接收引腳時鐘是否開啟、輸入輸出模式是否配置正常,發(fā)送引腳一般復(fù)用輸出、接收一般上拉輸入(如果只是引腳配置錯誤,發(fā)送 DMA的 計數(shù)器會變化,但是沒有實際波形輸出);
2)串口外設(shè)寄存器配置是否正常。如果全是 0 ,說時鐘沒有打開,或者未調(diào)用初始化函數(shù),其次查看對應(yīng)的 DMA 請求位(發(fā)送、接收,如果這個沒有開啟,DMA 計數(shù)器不會變化)、串口使能位等;波特率可以等發(fā)出波形再看,畢竟你現(xiàn)在連數(shù)據(jù)都沒有。
3)查看 DMA 配置是否正常,外設(shè)、內(nèi)存地址寄存器、計數(shù)器、使能位、對應(yīng)通道的傳輸標(biāo)志位(F4 如果傳輸標(biāo)志不清除,無法啟動下一次傳輸),總之把對應(yīng)結(jié)構(gòu)體的成員看一遍就對了,可能一個小配置錯了,就導(dǎo)致整個傳輸失敗。
4)如果是特殊引腳,看是否需要關(guān)閉默認(rèn)功能,開啟普通 GPIO 功能
5)如果是復(fù)映射功能,查看對應(yīng)的映射寄存器是否配置正確,配置時,可能需要開啟對應(yīng)的時鐘。
以上排查方法對發(fā)送、接收都適合。排查后,可以通過短接 Tx、Rx 引腳的方式確定發(fā)送、接收是否異常。如果是單方向的,可以配合串口模塊測試。
終極殺招:
如果上述排查都沒有發(fā)現(xiàn)問題,還是失敗,要么換板子,要么換一個可以用的簡單例程修改后測試,此時可以對比例程調(diào)試模式下的寄存器配置(寄存器配置截圖后對比)。
另外, 排查時需要特別注意的是,不能只看代碼,不看實際寄存器的值。因為有的時候,代碼也可能有各種各樣的問題(比如時鐘如果沒有打開,那么即使有對應(yīng)的配置代碼,你一個寄存器值也寫不進去),只有看最終寄存器的值才最安心。這里也多次強調(diào)了時鐘的重要性,不過一般這種問題很容易排查。
以上排查方向,配合魚鷹的調(diào)試系列文章,消化好!
《KEIL 調(diào)試經(jīng)驗總結(jié)》
3、協(xié)議問題上述排查,應(yīng)該基本解決了雙方通信問題的,即自發(fā)自收應(yīng)該沒有問題。但不代表雙方就能夠正常通信了。
這里可能存在幾個問題:
1、雙方波特率設(shè)置不匹配(這個問題比較容易查,直接看波形或寄存器(寄存器可能還沒那么靠譜,外設(shè)一致可以)即可)
2、上層協(xié)議不匹配,比如 CRC 校驗有問題、幀頭定義有誤等等……
3、對方解析函數(shù)有問題。
這個時候,配合邏輯分析儀分析是最方便的,到底是從機問題還是主機問題一目了然,當(dāng)然你直接在Tx、Rx上并上兩個串口模塊的 Rx 去接收串口數(shù)據(jù)也是可以的~~
以上排查步驟不一定按順序排查,但一般查看波形都是優(yōu)先選擇。
4、其他通信在此繼續(xù)介紹一下 SPI 通信可能出現(xiàn)的問題:
1、SPI 發(fā)送數(shù)據(jù)后,沒有延時即立刻開始接收(此時從機可能沒有反應(yīng)過來,也就沒有數(shù)據(jù)輸出),SPI 的波形可能失真(通過示波器可以觀察出來),也可能波形挺好,但接收就是有問題;
2、 CS 控制時機不對,或者也可能需要延時一段時間。
3、SPI 波特率太高,導(dǎo)致器件無法識別。測試時最好使用最低波特率,但也不排除太低波特率反而不行的情況,所以多試試幾種。
總之,測試代碼應(yīng)該要考慮最極端的情況(比如延時久一點,波特率慢一點),調(diào)通之后再優(yōu)化這些參數(shù),提高通信效率。
另外,如果有參考例程,可以直接對比例程輸出的波形進行修改,直到你的代碼輸出波形(注意,這里直接對比波形)和例程保持一致,如果還是有問題,那么換從機器件再試。當(dāng)然,電源這里也一定要先確定沒有問題。
一般來說,只要 CS、CLK、MOSI 控制時序正確,器件的 MISO 引腳一定會有數(shù)據(jù)輸出(即使你沒有接主機的 MISO),如果你能看到 MISO 輸出波形,但主機還是沒有正確接收,那么就查主機的 MISO 引腳配置和延時情況了。
I2C 通信:
1、和 SPI 類似,查看時序問題
2、注意地址問題,有可能說明書的地址和實際的地址之間換算可能需要移位。
3、注意從機鎖死問題,傳輸前發(fā)幾個停止信號過去試試
以上,就是魚鷹總結(jié)的和通信有關(guān)的排查指南,如果有幫助,歡迎轉(zhuǎn)發(fā)分享支持魚鷹,在此謝謝大家!
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。