文獻標識碼: A
文章編號: 0258-7998(2012)09-0096-04
在嵌入式系統(tǒng)中,串行接口設(shè)備憑借其控制靈活、接口簡單、占用系統(tǒng)資源少等優(yōu)點而得到廣泛應(yīng)用。以單片機為核心的嵌入式系統(tǒng),單片機常需要連接多個串行外設(shè),如上位計算機、串口LCD、外部傳感器等。通常單片機只提供一到兩個異步串行通信接口(UART)。因此,為了實現(xiàn)多串口通信,必須對其串行口進行擴展。
常見的串口擴展方法有軟件模擬法和硬件擴展法。軟件模擬法通過兩個通用I/O引腳、兩個定時器和一個外部中斷用軟件模擬UART的發(fā)送/接收功能,成本低,易于實現(xiàn),但占用資源多, 誤碼率高, 不適用于高速傳輸[1]。硬件擴展法主要有三種方式: (1)基于普通I/O口的串口擴展,如采用16C554芯片,其占用資源多,價格較貴; (2)基于USB的多串口擴展,如專用USB/串口轉(zhuǎn)換器,可擴展最多16路串口,性能可靠,但體積大,且價格隨串口數(shù)增加顯著提高;(3)基于SPI口的串口擴展。
本文采用GM814X串口擴展接口芯片通過單片機的增強型串行外設(shè)接口(SPI)實現(xiàn)多串口擴展。GM814X控制芯片在有限的資源下,可以增加擴展串口的數(shù)量并且性價比較高,運行可靠穩(wěn)定,便于嵌入式系統(tǒng)使用。該方法成功應(yīng)用于某RS-485通信終端開發(fā)。此通信終端與實際設(shè)備對接,工作穩(wěn)定,設(shè)置靈活,滿足RS-485總線高速通信要求。
1 基于GM814X的串口擴展
GM814X是專用低功耗串行口擴展芯片,該芯片主要是為了解決單片機等MCU自身的UART串口有限、不能與多個基于UART通信的外圍智能模塊及器件通信等問題而推出的。它可將現(xiàn)有單片機的單串口或雙串口擴展成2個(GM8141)或4個(GM8142)標準的UART,并具備兩種工作模式:串口擴展模式和廣播模式。串口擴展模式下,各子串口可獨立設(shè)置波特率、幀長和校驗方式,并同時與SPI接口進行數(shù)據(jù)收發(fā)[2]。
1.1 SPI接口及時序
增強型串行外設(shè)接口(SPI)提供訪問一個全雙工同步串行總線的能力,可以使用3線或4線方式,并可在同一總線上支持多個主器件和從器件[3]。GM814X芯片是基于SPI接口實現(xiàn)的,因此SPI的時序?qū)Υ诠δ艿氖褂糜葹橹匾瑫r序圖如圖1所示。由于SPI時序較為簡單,利用GM8141擴展串口時MCU選擇比較靈活,可選用帶SPI口的MCU(如C8051F340)實現(xiàn),也可用通用I/O口通過軟件模擬SPI實現(xiàn)。
SPI 上的數(shù)據(jù)為16位,其中高8位為子串口地址及附加命令和狀態(tài)信息,低8位為實際收發(fā)數(shù)據(jù)。數(shù)據(jù)接收以時鐘上升沿為采樣標志,數(shù)據(jù)發(fā)送以時鐘下降沿為移位標志。16 bit的數(shù)據(jù)收發(fā)從CS為低時有效,當CS拉高后,結(jié)束數(shù)據(jù)的收發(fā),并對數(shù)據(jù)進行判斷和有效性分析。
1.2 GM814X芯片
GM814X是一款兼容SPI總線的UART擴展芯片,其工作模式、各子串口的波特率、數(shù)據(jù)幀長等參數(shù)可通過向功能設(shè)置寄存器寫入控制字進行靈活設(shè)置,I/O口占用率低。通過寫功能設(shè)置寄存器的波特率分頻標志位,各子串口可在母串口波特率基礎(chǔ)上分頻同時工作。其主要指標為:晶振頻率為3.686 4 MHz 時, 波特率范圍為600 b/s~230.4 kb/s,輸出波特率誤差小于0.1%,輸入波特率誤差允許小于3.4%。以GM8141芯片為例,其引腳功能如圖2所示。
SHDN為軟件shutdown控制標志位,0為正常工作模式,1為低功耗掉電模式。掉電模式下,GM814X自動清除中斷寄存器的內(nèi)容,但保留功能寄存器內(nèi)的數(shù)據(jù)。當多個GM814X芯片掛在SPI總線上時,外部MCU可通過CS引腳選擇與其中某個GM814X通信時的控制,以此實現(xiàn)芯片的并聯(lián)工作。
2 應(yīng)用設(shè)計
2.1 RS-485通信終端
RS-485串行接口采用差分傳輸方式,半雙工方式通信,抗共模干擾能力強,并可聯(lián)網(wǎng)構(gòu)成分布式系統(tǒng),在要求精度高的實際工業(yè)儀器中應(yīng)用廣泛[4]。
本文設(shè)計的RS-485通信終端作為一個獨立的多路RS-485總線接口設(shè)備,具有多路RS-485信號的數(shù)據(jù)采集、發(fā)送及數(shù)據(jù)處理功能。通過外接LCD顯示屏及矩陣鍵盤提供獨立的人際交互手段。此外,該終端還可與PC機構(gòu)成上、下位機系統(tǒng),實現(xiàn)更為復(fù)雜的功能。其硬件組成如圖3所示。
根據(jù)設(shè)備配置,該通信終端需要4個串口:C8051F340自帶的UART0用于與串口LCD屏通信,與矩陣鍵盤配合,實現(xiàn)參數(shù)顯示和人機交互;自帶的UART1用于上位機進行RS-232通信,用于接收其指令或數(shù)據(jù)信息;擴展的兩個串口用于與RS-485外設(shè)進行RS-485總線通信。
2.2 電路設(shè)計
選用C8051F340作為主控MCU,C8051F340具有豐富的數(shù)字外設(shè)如UART、SPI、SMBus/I2C、USB等資源,在工程中得到廣泛應(yīng)用。通過GM8141實現(xiàn)串口擴展,一片MAX232實現(xiàn)兩路單片機TTL電平與RS-232C電平的雙向轉(zhuǎn)換,兩片MAX485實現(xiàn)GM8141的TTL電平與RS-485電平的雙向轉(zhuǎn)換。電路圖見圖4。
GM8141與單片機采用SPI口的3線單主方式和3線單從方式連接,SPI時鐘為250 kHz。IRQ引腳外接30 k?贅上拉電阻。當FIFO 接收到數(shù)據(jù)后置位R,并產(chǎn)生IRQ 中斷,該IRQ 中斷連接C8051340的P0.3管腳,當單片機響應(yīng),且對GM814X 進行了收(發(fā))數(shù)據(jù)操作后,該中斷即被清除;若接收FIFO 內(nèi)還有數(shù)據(jù),則繼續(xù)重復(fù)產(chǎn)生新的IRQ中斷和置位R,直到FIFO 內(nèi)的數(shù)據(jù)被讀取完;片選信號CS連接單片機的P1.6管腳,控制SPI時鐘的有效性。
MAX485的發(fā)送/接收轉(zhuǎn)換器由使能端RE和DE控制。當RE和DE都為0時, MAX485處于接收狀態(tài);RE和DE都為1時,MAX485處于發(fā)送狀態(tài)。用于遠距離傳輸時,應(yīng)在A+和B-輸出端并接匹配電阻。
2.3 軟件設(shè)計
單片機采用C51語言編程,在Keil uVision3集成開發(fā)環(huán)境下調(diào)試。
使用GM8141進行擴展串口通信之前,首先進行初始化。SPI的初始化需設(shè)置工作方式和時鐘頻率。GM8141的初始化需要設(shè)置工作模式,字串口的波特率和數(shù)據(jù)幀長等,通過向配置寄存器中寫入相應(yīng)的控制字實現(xiàn)。
終端對于RS-485外設(shè)的通信主要是接收和發(fā)送數(shù)據(jù)程序,應(yīng)嚴格按照圖3中的SPI接口時序圖進行設(shè)計。
以下為部分程序代碼,串口擴展通信時僅給出RS-485通道1的發(fā)送接收程序,通道2類似,多串口通信初始化程序流程如圖5所示。
(1)初始化:
void SPI0_Init()
功能:對SPI進行初始化
{
SPI0CFG=0x40; //設(shè)置工作方式、3線模式
SPI0CN=0x01; //使能SPI
SPI0CKR=23; //SPI0時鐘為250 kHz
}
void Init_System()
功能:對GM8141進行初始化
{
uint temp=0;
while(cnt0<240); //等待LCD初始化
W_8141Config(1,1,11);
//串口1、發(fā)送中斷屏蔽、波特率57 600
temp=Read8141Config(1); //讀取配置返回結(jié)果
EX0=1;
//開外部中斷(允許接收485信號)
}
調(diào)用函數(shù)說明:
①void W_8141Config(uchar n, uchar high, uchar low)
功能:配置GM8141指定串口、波特率,屏蔽設(shè)置等
參數(shù):n為串口號;high為配置寄存器的高位字節(jié)(低三位有效),low為低位字節(jié)。
②uint Read8141Config(uchar n)
功能:讀GM8141配置后的狀態(tài)
(2) GM8141發(fā)送函數(shù):
uint WR_8141(uchar W_com, uchar W_dat)
參數(shù):W_com是對要發(fā)送的數(shù)據(jù)配置、W_dat是發(fā)送數(shù)據(jù),W_dat與W_com的發(fā)送程序一樣
{
uint R_state,R_dat; uint Receive;
CS=0; //GM8141有效
Delay(20);
//SPI時序要求時間:CS低電平到第一次
SCLK的延遲時間Tcss SPI0DAT=W_com;
//向SPI0數(shù)據(jù)寄存器中寫入配置信息
while(!SPIF); //等待SPI發(fā)送數(shù)據(jù)結(jié)束
SPIF=0; //清SPI數(shù)據(jù)結(jié)束中斷標志位
Delay(80); //SPI時序要求延遲時間
R_state=SPI0DAT; //讀取GM8141接收值
……
}
(3) GM8141接收函數(shù):
uint ReadFIFOData(void)
{
uint Receive;
Receive=WR_8141(0x00,0x00);
//GM8141單獨數(shù)據(jù)接收模式
return Receive; //讀出接收FIFO數(shù)據(jù)
}
C8051F340需要處理多種外設(shè)信息,應(yīng)合理安排單片機的中斷優(yōu)先級。本電路中,優(yōu)先考慮RS-485外設(shè)的高速通信,設(shè)置為高優(yōu)先級,并采用外部中斷0方式接收RS-485數(shù)據(jù)。當GM8141接收數(shù)據(jù)時,接收中斷中應(yīng)首先接收完整數(shù)據(jù),然后判斷子串口的數(shù)據(jù)地址信息;發(fā)送數(shù)據(jù)時所發(fā)送的數(shù)據(jù)幀應(yīng)該包含其到達的子串口地址,這樣才能實現(xiàn)正確接收。
在實驗室條件下進行前期調(diào)試開發(fā)時,通過RS-232與RS-485轉(zhuǎn)換器實現(xiàn)PC機模擬實際裝備的RS-485信號進行通信,各串口測試運行良好;后期實裝對接時,與RS-485外設(shè)通信穩(wěn)定可靠,可實現(xiàn)多路RS-485信號的通信,實時性和可靠性均能達到要求。實踐表明,通過GM814X擴展串口可以很好地解決串行通信系統(tǒng)的串口局限問題。隨著單片機的廣泛應(yīng)用,此類擴展串口方法在解決同類問題中具有一定的使用參考價值。
參考文獻
[1] 張毅坤.單片微型計算機原理及應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2006.
[2] 成都國騰微電子. GM8141/2數(shù)據(jù)手冊[M]. 2006.
[3] 潘琢金.C8051Fxxx高速SOC單片機原理及[M]. 北京:北京航空航天大學(xué)出版社,2002.
[4] 劉小芳.單片機的多串口擴展技術(shù)的設(shè)計[J]. 計算機測量與控制,2004,12(11):1088-1090.