摘 要: 介紹了一種基于單片機(jī)P89LPC931的SPI總線擴(kuò)展異步串行接口UART的裝置,講述了P89LPC931單片機(jī)的開發(fā)使用,重點(diǎn)詳細(xì)闡明了擴(kuò)展芯片GM8142的開發(fā)使用。用戶可以根據(jù)不同的應(yīng)用環(huán)境靈活配置參數(shù)。本裝置成本低,可靠性高,穩(wěn)定性強(qiáng)。
關(guān)鍵詞: LPC單片機(jī);GM8142;SPI總線
0 引言
隨著單片機(jī)技術(shù)的不斷發(fā)展,特別是網(wǎng)絡(luò)技術(shù)在測控領(lǐng)域的廣泛應(yīng)用,由單片機(jī)構(gòu)成的多機(jī)網(wǎng)絡(luò)測控系統(tǒng)已成為單片機(jī)技術(shù)發(fā)展的一個(gè)方向。單片機(jī)的應(yīng)用已不僅僅局限于傳統(tǒng)意義上的自動(dòng)監(jiān)測或控制,而是形成了向以網(wǎng)絡(luò)為核心的分布式多點(diǎn)系統(tǒng)發(fā)展的趨勢。但是,大多數(shù)單片機(jī)都只有一個(gè)串行接口,在多數(shù)情況下限制了這些單片機(jī)的進(jìn)一步應(yīng)用。要實(shí)現(xiàn)單片機(jī)在應(yīng)用系統(tǒng)中的有效通信,就必須對單片機(jī)進(jìn)行串口擴(kuò)展。
本文介紹的串口擴(kuò)展器以單片機(jī)P89LPC931[1]為核心,使用SPI總線和芯片GM8142進(jìn)行串口擴(kuò)展,由1路SPI總線擴(kuò)展出4路串口,具有可靠性高、抗干擾性能強(qiáng)、成本低等優(yōu)點(diǎn),用戶可靈活配置參數(shù),非常適合在電力、化工、冶金等工業(yè)控制現(xiàn)場中使用。
1 系統(tǒng)硬件設(shè)計(jì)
本系統(tǒng)功能是通過UART接口接收來自外部(例如PC,定義為上位機(jī))的數(shù)據(jù),通過指定的擴(kuò)展串口將數(shù)據(jù)發(fā)送出去,或者從擴(kuò)展串口讀取數(shù)據(jù),通過UART發(fā)送到上位機(jī)。系統(tǒng)的整體設(shè)計(jì)如圖1所示。電源電路為整個(gè)系統(tǒng)供電,其中也包括RS232/RS485的電平轉(zhuǎn)換電路。復(fù)位電路完成單片機(jī)的外部復(fù)位,P89LPC931既可以使用外部高電平復(fù)位,也可以內(nèi)部復(fù)位。串口電路完成單片機(jī)程序的ISP下載,與外界(如PC)交互,接收外界數(shù)據(jù)并通過擴(kuò)展的串口發(fā)送,或者接收擴(kuò)展串口的數(shù)據(jù)發(fā)送到外界設(shè)備。人機(jī)交互包括按鍵輸入和LCD顯示輸出,完成對系統(tǒng)參數(shù)的配置信息的輸入,顯示轉(zhuǎn)發(fā)的數(shù)據(jù)或配置參數(shù)。
單片機(jī)P89LPC931的電路原理如圖2所示。P89LPC931使用3.3 V電源供電,電阻R3與電容C7構(gòu)成復(fù)位電路。當(dāng)單片機(jī)向芯片GM8142發(fā)出復(fù)位的低電平信號時(shí),LED點(diǎn)亮。單片機(jī)的引腳分配包括LCD部分、ICP在電路編程部分、KEY按鍵輸入部分、SPI接口部分和UART接口部分。
芯片GM8142[2]的電路原理如圖3所示。GM8142使用的晶振頻率為3.686 4 MHz。RX和TX分別是擴(kuò)展串口的接收和發(fā)送引腳,輸出的IRQ作為單片機(jī)P89LPC931的外部中斷輸入。
2 系統(tǒng)軟件設(shè)計(jì)
2.1 通信規(guī)約的設(shè)計(jì)
串口擴(kuò)展器的地址初始化為0x00。串口擴(kuò)展器可以采用RS485或者RS232的接口標(biāo)準(zhǔn)與上位機(jī)進(jìn)行通信。通信采用異步通信方式。通信參數(shù)包括波特率、校驗(yàn)位和幀長度,它們既可以通過按鍵與LCD的人機(jī)交互接口設(shè)定,也可以通過通信方式由上位機(jī)設(shè)定。
系統(tǒng)與上位機(jī)的通信報(bào)文[3]定義如下:(1)設(shè)定串口工作參數(shù)的報(bào)文A1,返回確認(rèn)設(shè)定串口工作參數(shù)的報(bào)文R1和系統(tǒng)不允許遠(yuǎn)程設(shè)定參數(shù)的報(bào)文R2;(2)設(shè)定SPI功能寄存器參數(shù)的報(bào)文A3,確認(rèn)設(shè)定SPI功能寄存器的報(bào)文R3和不允許遠(yuǎn)程設(shè)定的報(bào)文R4;(3)讀取SPI功能寄存器參數(shù)的報(bào)文A5和返回SPI功能寄存器參數(shù)的報(bào)文R5;(4)發(fā)送數(shù)據(jù)到指定擴(kuò)展串口的報(bào)文A6和確認(rèn)已發(fā)送數(shù)據(jù)到指定擴(kuò)展串口的報(bào)文R6;(5)查詢從擴(kuò)展串口上送數(shù)據(jù)的報(bào)文A7和返回的報(bào)文R7、R8;(6)緩沖區(qū)滿,主動(dòng)上送數(shù)據(jù)的報(bào)文R9;(7)重新啟動(dòng)設(shè)備的報(bào)文A10和確認(rèn)已重啟的報(bào)文R10;(8)回答接收無效的報(bào)文R11。
2.2 通信模塊設(shè)計(jì)
上位機(jī)通過UART接口與串口擴(kuò)展器通信,在P89LPC931的內(nèi)存中申請一個(gè)FIFO,用于接收上位機(jī)發(fā)送來的數(shù)據(jù),進(jìn)行相關(guān)的處理后,以相應(yīng)的報(bào)文進(jìn)行回答。每個(gè)擴(kuò)展串口在P89LPC931的內(nèi)存中也申請一個(gè)接收FIFO,用于保存從擴(kuò)展串口發(fā)送來的數(shù)據(jù)。設(shè)置接收FIFO滿標(biāo)志位,當(dāng)接收FIFO滿時(shí),主動(dòng)上送報(bào)文到上位機(jī)。具體的程序流程如圖4所示。
2.3 按鍵輸入?yún)?shù)
串口擴(kuò)展器的接口參數(shù)主要是UART接口的參數(shù)和擴(kuò)展UART接口的參數(shù),包括波特率、校驗(yàn)位和幀長度,這些參數(shù)既可以通過按鍵與LCD配合的方式(即人機(jī)交互接口)設(shè)定,也可以通過上位機(jī)以報(bào)文的方式設(shè)定。在系統(tǒng)中設(shè)定是否允許遠(yuǎn)程修改參數(shù)的值,當(dāng)不允許遠(yuǎn)程修改時(shí),則遠(yuǎn)程通過報(bào)文修改系統(tǒng)參數(shù)的方式無效,這時(shí)只允許通過人機(jī)交互接口設(shè)定系統(tǒng)參數(shù)。
設(shè)置5個(gè)按鍵,如表1所示。按鍵按下,則單片機(jī)P89LPC931相關(guān)的引腳輸入為低電平。這5個(gè)按鍵的狀態(tài)也作為與門74LS08的輸入,74LS08的輸出作為P89LPC931的外部中斷1的輸入。通過按鍵與LCD配合設(shè)定系統(tǒng)參數(shù)的程序流程[4]如圖5所示。
2.4 GM8142的開發(fā)[3]
使用GM8142進(jìn)行擴(kuò)展串口通信之前,首先進(jìn)行初始化。SPI的初始化需設(shè)置工作方式和時(shí)鐘頻率。GM8142的初始化需要設(shè)置工作模式、子串口的波特率和數(shù)據(jù)幀長等,通過向配置寄存器中寫入相應(yīng)的控制字實(shí)現(xiàn)。GM8142一次SPI傳輸要求在一個(gè)片選周期內(nèi)傳輸16 bit數(shù)據(jù),所以使用P89LPC931這樣的8位單片機(jī)要保證在CS拉低后連續(xù)啟動(dòng)2個(gè)8 bit的數(shù)據(jù)傳輸,然后再將CS拉高。這樣對GM8142來講,同樣實(shí)現(xiàn)了一次16 bit的傳輸。GM8142收發(fā)數(shù)據(jù)的程序流程如圖6所示。
向GM8142中寫入數(shù)據(jù)的函數(shù)為SendTo814X,啟動(dòng)一次SPI傳輸,發(fā)送16 bit數(shù)據(jù),返回16 bit數(shù)據(jù)。
unsigned int SendTo814X(unsigned char chigh,unsigned char clow)
{
unsigned char cTempHigh,cTempLow;
unsigned int RevData;
SPI_CS=0;
SPDAT=chigh;
while((SPSTAT&0x80)==0);
cTempHigh=SPDAT;
SPDAT=clow;
while((SPSTAT&0x80)==0);
cTempLow=SPDAT;
SPI_CS=1;
RevData=cTempHigh;
RevData=(RevData<<8)+cTempLow;
return RevData;
}
函數(shù)SendDataToCom實(shí)現(xiàn)向指定的擴(kuò)展串口發(fā)送單字節(jié)的數(shù)據(jù)。
unsigned int SendDataToCom(unsigned char n,unsigned char ct)
{
unsigned char ch=0x80;
unsigned int RevData;
ch=ch|(n<<3);
RevData=SendTo814X(ch,c);
return RevData;
}
函數(shù)ReadRFIFOData實(shí)現(xiàn)讀取接收FIFO的數(shù)據(jù)。
unsigned int ReadRFIFOData(void)
{
unsigned int RevData;
RevData=SendTo814X(0x00,0x00);
return RevData;
}
3 功能測試與總結(jié)
?。?)測試人機(jī)交互接口,通過按鍵與LCD配合,能夠正常設(shè)定參數(shù)。
(2)PC作為上位機(jī)利用串口助手這個(gè)工具,通過RS232接口發(fā)送指定的報(bào)文到串口擴(kuò)展器,從擴(kuò)展串口發(fā)出的數(shù)據(jù),也通過串口助手顯示出來。編輯不同的報(bào)文,從PC發(fā)送到串口擴(kuò)展器,均返回相應(yīng)的報(bào)文數(shù)據(jù)。
(3)PC利用串口助手向擴(kuò)展串口發(fā)送數(shù)據(jù),擴(kuò)展的串口接收到數(shù)據(jù)后,組成相應(yīng)的報(bào)文,在上位機(jī)查詢時(shí),以相應(yīng)的報(bào)文回答。
?。?)控制其他參數(shù)不變,修改某一個(gè)參數(shù),例如波特率,重新測試,均返回相應(yīng)的報(bào)文。
本裝置以通用的單片機(jī)P89LPC931為核心,外擴(kuò)GM8142擴(kuò)展串口模塊和人機(jī)交互模塊,可應(yīng)用于工業(yè)控制領(lǐng)域要求多串口的場合。經(jīng)過詳細(xì)測試,該串口擴(kuò)展器可以實(shí)現(xiàn)數(shù)據(jù)的成功轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)數(shù)據(jù)精確可靠,具有很強(qiáng)的實(shí)用價(jià)值。
參考文獻(xiàn)
[1] 張毅剛.單片機(jī)原理及應(yīng)用[M].北京:高等教育出版社,2003.
[2] 成都國騰微電子.GM8141/2數(shù)據(jù)手冊[Z].2006.
[3] SARIKAYA B, KOUKOULIDIS V, ESWARA S, et al. Analysis and testing of application layer protocols with an application to FTAM[J]. IEEE Transactions on Communications, 1992, 40(1):7-11.
[4] 王忠義,張有光,潘懷勇.基于MCS-51人機(jī)交互接口[J].電子測量技術(shù),2004(3):43-44.