UART數(shù)據(jù)波形分析
通用異步收發(fā)傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱(chēng)作UART,是一種異步收發(fā)傳輸器,是電腦硬件的一部分。它將要傳輸?shù)馁Y料在串行通信與并行通信之間加以轉(zhuǎn)換。作為把并行輸入信號(hào)轉(zhuǎn)成串行輸出信號(hào)的芯片,UART通常被集成于其他通訊接口的連結(jié)上。
具體實(shí)物表現(xiàn)為獨(dú)立的模塊化芯片,或作為集成于微處理器中的周邊設(shè)備。一般是RS-232C規(guī)格的,與類(lèi)似Maxim的MAX232之類(lèi)的標(biāo)準(zhǔn)信號(hào)幅度變換芯片進(jìn)行搭配,作為連接外部設(shè)備的接口。在UART上追加同步方式的序列信號(hào)變換電路的產(chǎn)品,被稱(chēng)為USART(Universal Synchronous Asynchronous Receiver Transmitter)。
計(jì)算機(jī)內(nèi)部采用并行數(shù)據(jù),不能直接把數(shù)據(jù)發(fā)到Modem,必須經(jīng)過(guò)UART整理才能進(jìn)行異步傳輸,其過(guò)程為:CPU先把準(zhǔn)備寫(xiě)入串行設(shè)備的數(shù)據(jù)放到UART的寄存器(臨時(shí)內(nèi)存塊)中,再通過(guò)FIFO(First Input First Output,先入先出隊(duì)列)傳送到串行設(shè)備,若是沒(méi)有FIFO,信息將變得雜亂無(wú)章,不可能傳送到Modem。它是用于控制計(jì)算機(jī)與串行設(shè)備的芯片。有一點(diǎn)要注意的是,它提供了RS-232C數(shù)據(jù)終端設(shè)備接口,這樣計(jì)算機(jī)就可以和調(diào)制解調(diào)器或其它使用RS-232C接口的串行設(shè)備通信了。
作為接口的一部分,UART還提供以下功能:將由計(jì)算機(jī)內(nèi)部傳送過(guò)來(lái)的并行數(shù)據(jù)轉(zhuǎn)換為輸出的串行數(shù)據(jù)流。將計(jì)算機(jī)外部來(lái)的串行數(shù)據(jù)轉(zhuǎn)換為字節(jié),供計(jì)算機(jī)內(nèi)部并行數(shù)據(jù)的器件使用。在輸出的串行數(shù)據(jù)流中加入奇偶校驗(yàn)位,并對(duì)從外部接收的數(shù)據(jù)流進(jìn)行奇偶校驗(yàn)。在輸出數(shù)據(jù)流中加入啟停標(biāo)記,并從接收數(shù)據(jù)流中刪除啟停標(biāo)記。處理由鍵盤(pán)或鼠標(biāo)發(fā)出的中斷信號(hào)(鍵盤(pán)和鼠標(biāo)也是串行設(shè)備)??梢蕴幚碛?jì)算機(jī)與外部串行設(shè)備的同步管理問(wèn)題。有一些比較高檔的UART還提供輸入輸出數(shù)據(jù)的緩沖區(qū),比較新的UART是16550,它可以在計(jì)算機(jī)需要處理數(shù)據(jù)前在其緩沖區(qū)內(nèi)存儲(chǔ)16字節(jié)數(shù)據(jù),而通常的UART是8250。如果您購(gòu)買(mǎi)一個(gè)內(nèi)置的調(diào)制解調(diào)器,此調(diào)制解調(diào)器內(nèi)部通常就會(huì)有16550 UART。
經(jīng)常遇到初學(xué)者,對(duì)單片機(jī)串行通訊出了問(wèn)題不知道如何辦的情況。其實(shí)最有效的調(diào)試方法是用示波器觀察收發(fā)數(shù)據(jù)的波形。本文通過(guò)對(duì)異步串行數(shù)據(jù)格式的分析,闡述通過(guò)波形分析方法調(diào)試UART數(shù)據(jù)收發(fā)的原理和方法。通過(guò)觀察波形可以確定以下情況:
1. 是否有數(shù)據(jù)接收或發(fā)送;
2. 數(shù)據(jù)是否正確;
3. 波特率是否正確
一、 串行數(shù)據(jù)的格式異步串行數(shù)據(jù)的一般格式是:起始位+數(shù)據(jù)位+停止位,其中起始位1 位,數(shù)據(jù)位可以是5、6、7、8位,停止位可以是1、1.5、2位。
起始位是一個(gè)值為0的位,所以對(duì)于正邏輯的TTL電平,起始位是一位時(shí)間的低電平;停止位是值為1的位,所以對(duì)于正邏輯的TTL電平,停止位是高電平。對(duì)于負(fù)邏輯(如RS-232電平)則相反。
例如,對(duì)于16進(jìn)制數(shù)據(jù)55aaH,當(dāng)采用8位數(shù)據(jù)位、1位停止位傳輸時(shí),它在信號(hào)線上的波形如圖1(TTL電平)和圖2(RS-232電平)所示:
二、 根據(jù)波形圖計(jì)算波特率
如圖3是圖1在示波器中的顯示示意,其中灰色線是示波器的時(shí)間分度線,此時(shí)假設(shè)是200ms/格。
可以看了,第一個(gè)字節(jié)的10位(1位起始位,8位數(shù)據(jù)位和1位停止位)共占約1.05ms,這樣可計(jì)算出其波特率約為:10bit / 1.05ms X 1000 ≈ 9600 bit/s
如果上圖中的時(shí)間軸是100ms/格,同樣可以計(jì)算出波特率應(yīng)是19200bit/s。
當(dāng)通訊不正常,又能觀察到波形時(shí),就可根據(jù)上述方法,從波形圖計(jì)算一下波特率是否正確。
三、 根據(jù)波形圖判斷RS-485收發(fā)數(shù)據(jù)的正確與否RS-485是一種半雙工的串行通訊方式,485電平芯片所以要正確接收和發(fā)送數(shù)據(jù),必需保證控制信號(hào)和數(shù)據(jù)的同步,否則要么發(fā)送數(shù)據(jù)丟失,要么接收數(shù)據(jù)可能丟失。
RS-485發(fā)送數(shù)據(jù)時(shí)的正確時(shí)序如圖4所示。
在圖4中,發(fā)送控制信號(hào)的寬度基本與數(shù)據(jù)信號(hào)的寬度一致,所以能保證發(fā)送數(shù)據(jù)的正確和發(fā)送后及時(shí)轉(zhuǎn)為接收。
圖5 和圖6 分別是控制信號(hào)太短和控制信號(hào)太長(zhǎng)的情況。
在圖5中,由于控制信號(hào)關(guān)閉過(guò)早,則第二個(gè)字節(jié)的后兩位將發(fā)送錯(cuò)誤;在圖6中,由于控制信號(hào)關(guān)閉過(guò)遲,使485芯片在發(fā)送數(shù)據(jù)后,不能及時(shí)轉(zhuǎn)到接收狀態(tài),此時(shí)總線若有數(shù)據(jù)過(guò)來(lái),則本單元將不能正確接收。
總結(jié):只要掌握上述波形分析方法,任何異步串行數(shù)據(jù)的接收和發(fā)送問(wèn)題,基本都可以得到解決。