經常遇到初學者,對單片機串行通訊出了問題不知道如何辦的情況。其實最有效的調試方法是用示波器觀察收發數據的波形。通過觀察波形可以確定以下情況:
是否有數據接收或發送;
數據是否正確;
波特率是否正確;
一、串行數據的格式
異步串行數據的一般格式是:起始位+數據位+停止位,其中起始位1 位,數據位可以是5、6、7、8位,停止位可以是1、1.5、2位。
起始位是一個(ge) 值為(wei) 0的位,所以對於(yu) 正邏輯的TTL電平,起始位是一位時間的低電平;停止位是值為(wei) 1的位,所以對於(yu) 正邏輯的TTL電平,停止位是高電平。線路路空閑或者數據傳(chuan) 輸結束,對於(yu) 正邏輯的TTL電平,線路總是1。對於(yu) 負邏輯(如RS-232電平)則相反。
例如,對於(yu) 16進製數據55aaH,當采用8位數據位、1位停止位傳(chuan) 輸時,它在信號線上的波形如圖1(TTL電平)和圖2(RS-232電平)所示。 (先傳(chuan) 第一個(ge) 字節55,再傳(chuan) 第二個(ge) 字節aa,每個(ge) 字節都是從(cong) 低位向高位逐位傳(chuan) 輸)
圖1 TTL電平的串行數據幀格式(55aah)
圖2 RS-232電平的串行數據幀格式(55aah)
二、根據波形圖計算波特率
如圖3是圖1在示波器中的顯示示意,其中灰色線是示波器的時間分度線,此時假設是200us/格。
圖3 波特率計算示意圖
可以看了,第一個(ge) 字節的10位(1位起始位,8位數據位和1位停止位)共占約1.05ms,這樣可計算出其波特率約為(wei) :
10bit / 1.05ms X 1000 ≈ 9600 bit/s
如果上圖中的時間軸是100us/格,同樣可以計算出波特率應是19200bit/s。
當通訊不正常,又能觀察到波形時,就可根據上述方法,從(cong) 波形圖計算一下波特率是否正確。
三、根據波形圖判斷RS-485收發數據的正確與(yu) 否
RS-485是一種半雙工的串行通訊方式(RS-422為(wei) 全雙工),485電平芯片所以要正確接收和發送數據,必需保證控製信號和數據的同步,否則要麽(me) 發送數據丟(diu) 失,要麽(me) 接收數據可能丟(diu) 失。
RS-485發送數據時的正確時序如圖4所示。
圖4 RS-485的正確發送數據時序
在圖4中,發送控製信號的寬度基本與(yu) 數據信號的寬度一致,所以能保證發送數據的正確和發送後及時轉為(wei) 接收。
圖5 和圖6 分別是控製信號太短和控製信號太長
圖5 RS-485控製信號太短時的時序
圖6 RS-485控製信號太短時的時序
在圖5中,由於(yu) 控製信號關(guan) 閉過早,則第二個(ge) 字節的後兩(liang) 位將發送錯誤;在圖6中,由於(yu) 控製信號關(guan) 閉過遲,使485芯片在發送數據後,不能及時轉到接收狀態,此時總線若有數據過來,則本單元將不能正確接收。
總結:隻要掌握上述波形分析方法,任何異步串行數據的接收和發送問題,基本都可以得到解決(jue) 。