概述
通用異步收發(fā)器(UART)或串口,是多數(shù)微處理器或微控制器的標(biāo)準(zhǔn)外設(shè)。異步串口為兩個(gè)微控制器之間(或者是微控制器與從機(jī)串口器件之間)的通信提供了一種簡單方式,無需相同的系統(tǒng)時(shí)鐘。配合適當(dāng)?shù)牡碾娖?a target="_blank">轉(zhuǎn)換器,該串口還可與RS-232、RS-485網(wǎng)絡(luò)進(jìn)行通信,或與PC的COM口連接。串口連接僅需2條信號(hào)線(Rx和Tx)及可實(shí)現(xiàn)全雙工通信,只要通信兩端設(shè)備采用相同的數(shù)據(jù)位格式和波特率,就能成功傳輸數(shù)據(jù),設(shè)備之間無需其它任何信息。本應(yīng)用筆記介紹了一種利用軟件實(shí)現(xiàn)通用的10位異步串口的方案,設(shè)計(jì)實(shí)例采用了低功耗MAXQ3210微控制器,該控制器不含硬件串口。當(dāng)具體應(yīng)用中無法提供足夠的硬件串口時(shí),采用相同方法,可以為任何MAXQ?微控制器,例如MAXQ2000,添加一個(gè)或更多的串口。
軟件UART的優(yōu)勢(shì)
有人可能會(huì)問:目前絕大多數(shù)微控制器都具備功能強(qiáng)大的硬件串口,為什么還會(huì)用微控制器的端口引腳實(shí)現(xiàn)軟件UART呢?主要原因如下:盡管多數(shù)微控制器帶有硬件串口,仍然有一些微控制器不具備UART硬件串口。在為系統(tǒng)選擇微控制器時(shí),很難找到滿足各方面要求的完美方案。所以,通過增加微控制器的軟件設(shè)計(jì)實(shí)現(xiàn)某些外設(shè)功能可以彌補(bǔ)微控制器的功能“缺陷”,提高設(shè)計(jì)的靈活性。
有些微控制器具有硬件UART,但出于某種原因,它可能無法勝任具體的設(shè)計(jì)要求。例如,微控制器需要與一個(gè)工作在略有差異的串口協(xié)議的外設(shè)通信,或者硬件UART所支持的數(shù)據(jù)位數(shù)、奇偶檢驗(yàn)、輸入/輸出緩存器不完全符合應(yīng)用要求。構(gòu)建軟件UART能夠在UART功能定義、串口協(xié)議的細(xì)節(jié)方面提供更大的靈活性。
微控制器可能具有非常適合應(yīng)用要求的硬件UART,但數(shù)量不夠。此時(shí),除了添加芯片來增加串口數(shù)量以外,還可以簡單地增加一個(gè)與微控制器UART功能一致的軟件UART,以滿足系統(tǒng)要求。
軟件UART會(huì)占用主程序多大帶寬也非常重要,使用硬件UART (或其它串行通信外設(shè))的主要原因是微控制器不必花費(fèi)時(shí)間處理串行通信的底層協(xié)議。冗長的數(shù)據(jù)位采樣、時(shí)隙計(jì)數(shù)、輸入/輸出移位均由硬件處理,UART向主微控制器發(fā)出指示信號(hào)(中斷或其它指示標(biāo)志),表明它已接收到字符或完成一次發(fā)送任務(wù)。微控制器可根據(jù)需要快速裝載或卸載UART緩存區(qū)的數(shù)據(jù),然后返回處理其核心任務(wù)。
簡而言之,軟件UART意味著程序需要花費(fèi)更多的時(shí)間觀察端口引腳的串行通信,有些設(shè)計(jì)不能接受這種費(fèi)時(shí)操作。
慶幸的是,我們可以在設(shè)計(jì)軟件UART時(shí)避免過多地占用微處理器的時(shí)間和資源,下面我們考慮一個(gè)字符的收、發(fā)過程,假設(shè)采用標(biāo)準(zhǔn)的10位異步串行協(xié)議(1個(gè)起始位、1個(gè)停止位和8個(gè)數(shù)據(jù)位) (圖1)。
圖1. 10位異步串行通信協(xié)議的發(fā)送與接收
一旦開始發(fā)送或接收操作,串行UART (不論是軟件形式還是硬件形式)都不需要連續(xù)監(jiān)視I/O線。發(fā)送一個(gè)字符時(shí),UART只需要在每個(gè)數(shù)據(jù)位周期驅(qū)動(dòng)一次傳輸線的狀態(tài),依次建立每個(gè)數(shù)據(jù)位的電平,從起始位到數(shù)據(jù)位再到停止位。接收字符時(shí),UART在第一個(gè)下降沿開始啟動(dòng),下降沿過后,UART僅需要在每位時(shí)隙的中間點(diǎn)對(duì)傳輸線的狀態(tài)采樣。
軟件UART的功能
我們可將軟件UART的功能描述成一對(duì)兒狀態(tài)機(jī):一個(gè)用于發(fā)送字符,另一個(gè)用于接收字符。對(duì)于全雙工UART來說兩個(gè)狀態(tài)機(jī)并行工作,需要兩個(gè)獨(dú)立的定時(shí)中斷。兩個(gè)狀態(tài)機(jī)具有啟動(dòng)模式和停止模式。發(fā)送狀態(tài)機(jī)在有字符發(fā)送時(shí)退出其空閑狀態(tài)進(jìn)行數(shù)據(jù)發(fā)送,發(fā)送停止位后返回其空閑狀態(tài)。接收狀態(tài)機(jī)在檢測(cè)到接收線上的一個(gè)下降沿時(shí)退出其空閑狀態(tài)開始接收數(shù)據(jù)。一旦檢測(cè)到低電平起始狀態(tài)(表明起始位已開始),便開始對(duì)數(shù)據(jù)位時(shí)隙進(jìn)行計(jì)數(shù),并根據(jù)需要對(duì)數(shù)據(jù)線進(jìn)行采樣,包括停止位。為避免過多占用不必要的主程序時(shí)間,應(yīng)該由定時(shí)中斷周期性地觸發(fā)UART狀態(tài)機(jī)。用于數(shù)據(jù)接收的初始化下降沿檢測(cè)通過外部邊沿觸發(fā)中斷單獨(dú)處理。如果狀態(tài)機(jī)的定時(shí)器設(shè)置為在每個(gè)數(shù)據(jù)位啟動(dòng)一次中斷,狀態(tài)機(jī)在每次觸發(fā)中斷時(shí)可以執(zhí)行任何所需操作(必要時(shí)可以進(jìn)入下一狀態(tài))。應(yīng)盡可能優(yōu)化狀態(tài)機(jī)代碼,因?yàn)檐浖ART工作時(shí)將在后臺(tái)連續(xù)運(yùn)行這些代碼。
利用MAXQ3210進(jìn)行設(shè)計(jì)
為了了解UART功能需要占用的處理器資源,作為一個(gè)范例,我們討論利用Maxim的MAXQ3120實(shí)現(xiàn)的軟件UART。該微控制器采用28引腳封裝、5V供電,能夠運(yùn)行在大約3.57MIPS,包含15個(gè)端口引腳,但沒有內(nèi)部UART。MAXQ3210還包含了適合我們?cè)O(shè)計(jì)要求的其它功能:一個(gè)周期性定時(shí)器,為發(fā)送和接收狀態(tài)機(jī)提供中斷;一個(gè)外部中斷,用于檢測(cè)接收數(shù)據(jù)線的下降沿。由于MAXQ3210僅有一個(gè)周期性定時(shí)器,軟件UART將采用半雙工模式,即在某一時(shí)刻只能發(fā)送或接收數(shù)據(jù),收、發(fā)不能同時(shí)進(jìn)行。實(shí)際上,這對(duì)于多數(shù)通信和控制協(xié)議來說不成問題。對(duì)于MAXQ3210,接收和發(fā)送狀態(tài)機(jī)以及用于設(shè)置模式、加載、卸載字符的子程序可通過171個(gè)指令字實(shí)現(xiàn)。例如,發(fā)送狀態(tài)機(jī)只有三個(gè)狀態(tài)(數(shù)據(jù)位、停止位和返回空閑),如下所示:
intTX_bit: move GRH, PSF move GRL, AP move T2CNB.3, #0 ; Clear timer 2 overflow flag move AP, #5 rrc ; Start with least significant bit jump C, intTX_bit_one intTX_bit_zer move TXDO, #0 jump intTX_bit_next intTX_bit_one: move TXDO, #1 jump intTX_bit_next intTX_bit_next: djnz LC[1], intTX_bit_done move IV, #intTX_stop intTX_bit_done: move AP, GRL move PSF, GRH reti intTX_stop: move T2CNB.3, #0 ; Clear timer 2 overflow flag move TXDO, #1 ; Float high move IV, #intTX_idle reti intTX_idle: move A[4], #SER_MODE_TX_IDLE move T2CNB.3, #0 ; Clear timer 2 overflow flag move T2CNA.7, #0 ; Disable timer 2 interrupts move T2CNA.3, #0 ; Stop timer reti可下載(ZIP, 5.6kB)本應(yīng)用筆記的完整代碼。
任何情況下,中斷代碼最多占用19個(gè)指令周期,可根據(jù)波特率估算出表1所示最差狀況下的帶寬。注意:最差狀況下的帶寬是根據(jù)連續(xù)發(fā)送或接收字符的操作估算的。一旦完成字符傳輸,將關(guān)斷UART,在開始傳輸下一個(gè)字符之前允許主程序的其它操作。
表1. MAXQ3210實(shí)現(xiàn)UART通信需要占用的帶寬
Baud Rate | Cycles per Timer Tick (at 3.57MHz) | Worst-Case Interrupt Cycle Count | Bandwidth Used by UART (%) |
9600 | 372 | 19 | 5 |
19200 | 186 | 19 | 10 |
28800 | 124 | 19 | 15 |
57600 | 62 | 19 | 31 |
結(jié)論
本應(yīng)用筆記介紹了一個(gè)簡單的通過2個(gè)標(biāo)準(zhǔn)端口,利用軟件實(shí)現(xiàn)10位異步UART通信的方案,只要微控制器空閑端口引腳能夠滿足需求,上述方案也可用來實(shí)現(xiàn)SPI?到SMBus? 、I2C的任意串口通信。這里,我們采用了相對(duì)速率較低的MAXQ3210微控制器進(jìn)行測(cè)試,如果使用高速微控制器(如MAXQ2000或高速8051),則可實(shí)現(xiàn)1個(gè)以上的軟件UART,能夠配置成半雙工或全雙工模式(或更復(fù)雜的串行通信外設(shè)),并且,不會(huì)占用更多的主程序帶寬。采用軟件實(shí)現(xiàn)與外設(shè)的通信時(shí),可修改協(xié)議的任何部分,以便與其它UART設(shè)備或相關(guān)標(biāo)準(zhǔn)變化保持一致,為新設(shè)計(jì)提供最大程度的靈活性。
類似文章發(fā)表于Embedded Systems Design網(wǎng)絡(luò)版,2007年2月。
評(píng)論
查看更多