胡立群,陳敦軍
(南京大學(xué)電子科學(xué)與工程學(xué)院江蘇省光電信息功能材料重點(diǎn)實(shí)驗(yàn)室,江蘇南京210093)
許多數(shù)字化設(shè)備、測(cè)量?jī)x器都具有RS232串行接口[1]。在某些場(chǎng)合需要多臺(tái)這樣的設(shè)備聯(lián)合測(cè)量,并與計(jì)算機(jī)等主控設(shè)備交換數(shù)據(jù),接受主控設(shè)備的控制。最簡(jiǎn)單的方法是直接將設(shè)備連接到計(jì)算機(jī)的串口上,但一般臺(tái)式計(jì)算機(jī)本身所帶的串口數(shù)量只有1~2個(gè),有時(shí)難以滿足需要。盡管還可以采用具有PCI總線的多串口卡對(duì)計(jì)算機(jī)系統(tǒng)進(jìn)行擴(kuò)充,但需要額外占用系統(tǒng)資源,并且一些情況下的局限性限制了這種方法的應(yīng)用。
本文介紹了一種不同于多串口卡的串口擴(kuò)展方法,采用該方法建立的多串口系統(tǒng),主體由多個(gè)單片機(jī)組成,單片機(jī)同時(shí)具有串口和SPI接口,單片機(jī)之間基于SPI總線“主—從”互連,系統(tǒng)中的1個(gè)“主串口”用于連接計(jì)算機(jī),其余的“從串口”可以連接其他的串口設(shè)備。因此,系統(tǒng)工作時(shí)只需占用計(jì)算機(jī)的1個(gè)串口資源或1個(gè)USB接口。連接到該系統(tǒng)上的其他串口設(shè)備通過該系統(tǒng)的控制轉(zhuǎn)發(fā),可以與計(jì)算機(jī)進(jìn)行正常的數(shù)據(jù)交換。
一片單片機(jī)一般只有1個(gè)全雙工異步串行口(UART),也就是說(shuō),一片單片機(jī)只能連接1個(gè)外部串口設(shè)備。如果一個(gè)系統(tǒng)需要同時(shí)連接多個(gè)外部串口設(shè)備,則可采用多片單片機(jī)構(gòu)成系統(tǒng)的主體,這些單片機(jī)各自分別與1個(gè)串口設(shè)備連接并交換數(shù)據(jù)。系統(tǒng)中的主控制單元采用某種方式協(xié)調(diào)這些單片機(jī)與上位計(jì)算機(jī)的數(shù)據(jù)交換,從而達(dá)到計(jì)算機(jī)串口擴(kuò)展的目的。
現(xiàn)在一些通用的單片機(jī)功能都很強(qiáng)大,片上不僅集成有全雙工異步串行口(UART),還集成有全雙工同步串行接口(SPI),這為上述構(gòu)想的實(shí)現(xiàn)提供了必要條件。
根據(jù)上述構(gòu)想,設(shè)計(jì)一個(gè)系統(tǒng),主體是由多個(gè)具有全雙工同步串行接口(SPI)的單片機(jī)構(gòu)成,將其中的1個(gè)CPU作為主機(jī)(主控制單元),其余為從機(jī)。通過SPI總線,可以很方便地將這些單片機(jī)進(jìn)行連接,形成“單主—多從”的結(jié)構(gòu),主器件主導(dǎo)SPI通訊[2-7]。系統(tǒng)中,主機(jī)的UART與上位計(jì)算機(jī)的串口連接,每個(gè)從機(jī)的UART與1個(gè)外部串口設(shè)備連接,由此形成一個(gè)“基于SPI互連的多串口系統(tǒng)”,實(shí)現(xiàn)對(duì)計(jì)算機(jī)串口資源的擴(kuò)展。
這種基于SPI的多串口收發(fā)控制系統(tǒng),不同于多串口卡,采用外置式設(shè)計(jì),僅占用1個(gè)計(jì)算機(jī)的串口或1個(gè)USB口。系統(tǒng)中各從機(jī)獨(dú)立運(yùn)行,并行工作。系統(tǒng)中的主機(jī)完成“一對(duì)多”的任務(wù)調(diào)配,起到溝通上位計(jì)算機(jī)與多個(gè)外部串口設(shè)備的作用。圖1顯示了該系統(tǒng)中的主—從互連結(jié)構(gòu)及與計(jì)算機(jī)、外部串口設(shè)備的連接。

圖1 基于SPI主—從互連多串口系統(tǒng)示意圖Fig.1 Schematic diagram of multi-serial-port system based on master/slave mode SPI
STC12C5410系列單片機(jī),以8051為內(nèi)核,并具有以下特點(diǎn):1 T周期單片機(jī),在線可編程(ISP),I/O可配置為4種方式,具有SPI同步串行高速接口、UART異步串行接口,片上擴(kuò)展外部數(shù)據(jù)存儲(chǔ)器XRAM等。由于具有上述特點(diǎn),STC12C5410很適合用來(lái)構(gòu)成基于SPI的多串口收發(fā)控制系統(tǒng)。
STC12C5410系列單片機(jī)具有SPI接口,有2種操作模式:主模式和從模式。在主模式中支持高達(dá)3 Mbit/s的速率(工作頻率為12 MHz時(shí),如果CPU主頻采用20~36 MHz,則可更高),還具有傳輸完成標(biāo)志和寫沖突標(biāo)志保護(hù)。
SPI接口有4個(gè)管腳:CLK/P1.7,MOSI/P1.5,MISO/P1.6,SS/P1.4。
CLK,MOSI,MISO通常和2個(gè)或更多SPI器件連接在一起。數(shù)據(jù)通過MOSI由主機(jī)傳送到從機(jī),通過MISO由從機(jī)傳送到主機(jī)。CLK信號(hào)在主模式時(shí)為輸出,在從模式時(shí)為輸入。如果SPI被禁止,這些管腳都可作為I/O口使用。
SS為從機(jī)選擇管腳。在典型配置中,SPI主機(jī)使用I/O口選擇1個(gè)SPI器件作為當(dāng)前的從機(jī)。
該系列單片機(jī),有3個(gè)與SPI功能模塊相關(guān)的特殊功能寄存器,分別是SPI控制寄存器(SPCTL),SPI狀態(tài)寄存器(SPSTAT),SPI數(shù)據(jù)寄存器(SPDAT),如表1所示。寄存器的各位功能描述見表2、表3。

表1 SPI功能模塊特殊功能寄存器Tab.1 Special function registers of SPI functional module

表2 SPI控制寄存器的位描述Tab.2 Bits description of SPI control register

表3 SPI狀態(tài)寄存器的位描述Tab.3 Bits description of SPI state register
SPI操作時(shí),主機(jī)和從機(jī)的2個(gè)SPI數(shù)據(jù)寄存器都可以看成1個(gè)16位循環(huán)移位寄存器,當(dāng)數(shù)據(jù)從主機(jī)移位傳送到從機(jī)的同時(shí),數(shù)據(jù)也以相反的方向移入。這意味著在1個(gè)移位周期,主機(jī)和從機(jī)數(shù)據(jù)相互交換[2,4]。
STC12C5410的UART的控制方式,與其他8051系列單片機(jī)基本一樣,只是由于STC12C5410是1 T周期單片機(jī),通過對(duì)輔助寄存器(AUXR)的設(shè)置,可以改變定時(shí)器0、定時(shí)器1、UART的速度。AUXR地址為8EH。表4為AUXR有關(guān)的位描述。

表4 AUXR有關(guān)的位描述Tab.4 Related bit description of AUXR
為了兼容傳統(tǒng)的8051單片機(jī),定時(shí)器0、定時(shí)器1復(fù)位后是12分頻。如果UART以定時(shí)器1作為波特率發(fā)生器,則T1_12決定了UART串口是1T還是12T。
ESPI是SPI中斷控制位。SPI的中斷順序號(hào)為5[4]。
SPI通訊可以看成主機(jī)控制下的主機(jī)—從機(jī)SPI數(shù)據(jù)寄存器內(nèi)容的互換,主機(jī)不僅得到從機(jī)中的數(shù)據(jù),也同時(shí)將數(shù)據(jù)發(fā)送給從機(jī)[2,4]。因此,采用SPI通訊,主機(jī)既可以得到從機(jī)連接的串口設(shè)備傳來(lái)的數(shù)據(jù),也可以通過從機(jī)將來(lái)自主機(jī)的控制數(shù)據(jù)傳遞給外部串口設(shè)備。
為了描述方便,將主機(jī)向從機(jī)傳遞的信息分為2種類型,“命令信息(command-info.)”和“數(shù)據(jù)信息(data-info.)”。從機(jī)將接收到的外部串口設(shè)備的數(shù)據(jù)暫存在接收緩沖區(qū)中,主機(jī)為了得到這些數(shù)據(jù)向從機(jī)所發(fā)送的信息稱為“命令信息”。主機(jī)為了控制外部串口設(shè)備而向從機(jī)發(fā)送的信息稱為“數(shù)據(jù)信息”。
主機(jī)所傳遞的兩類“信息”,通過字節(jié)的第7位(特征位)來(lái)區(qū)別,1代表是“命令信息”,0代表是“數(shù)據(jù)信息”。從機(jī)根據(jù)接收到的信息類型,采取對(duì)應(yīng)的處理方式,將接收緩沖區(qū)中的數(shù)據(jù)傳回給主機(jī),或?qū)⒅鳈C(jī)數(shù)據(jù)暫放在發(fā)送緩沖區(qū)中,等待傳遞給外部設(shè)備,圖2顯示了數(shù)據(jù)流動(dòng)方向。
2.1.1 定 義命令信息(Command-info.)
由于從機(jī)只能被動(dòng)地與主機(jī)交換數(shù)據(jù),“命令信息”可使從機(jī)知道主機(jī)的操作意圖,準(zhǔn)備好要交換的數(shù)據(jù)。表5列出了所定義的4個(gè)“命令信息”。
通過“命令信息”,主機(jī)得到從機(jī)“數(shù)據(jù)接收緩沖區(qū)”中的數(shù)據(jù),也就是得到與該從機(jī)連接的外部串口設(shè)備傳來(lái)的數(shù)據(jù)。

圖2 數(shù)據(jù)流動(dòng)示意圖Fig.2 Diagram of data transfers

表5 定義的4個(gè)命令信息Tab.5 Defined four command-info.
2.1.2 數(shù) 據(jù)信息(Data-info)及構(gòu)成
“數(shù)據(jù)信息”由主機(jī)發(fā)出,通知從機(jī)將有關(guān)數(shù)據(jù)發(fā)往所連接的外部串口設(shè)備。
“數(shù)據(jù)信息”含有特征位,第7位固定為0,不能完整表達(dá)所要傳送的一個(gè)數(shù)據(jù)字節(jié)(見圖3),所以1個(gè)“數(shù)據(jù)字節(jié)”要用2個(gè)“數(shù)據(jù)信息”字節(jié)表達(dá)。表達(dá)方式是:將該數(shù)據(jù)字節(jié)分割為字節(jié)的高4位和字節(jié)的低4位兩部分,并分別作為2個(gè)“數(shù)據(jù)信息”字節(jié)的低4位,然后在這2個(gè)“數(shù)據(jù)信息”的高4位添加特征位。其中“數(shù)據(jù)信息”的第6位用來(lái)區(qū)分?jǐn)?shù)據(jù)字節(jié)的高4位或低4位(見圖4)。

圖3 數(shù)據(jù)字節(jié)的格式Fig.3 Format of data byte

圖4 “數(shù)據(jù)信息”字節(jié)的格式Fig.4 Format of data_info.
“數(shù)據(jù)信息”的D4~D7位為特征位,D0~D3位為數(shù)據(jù)位。主機(jī)兩次SPI傳送,先高后低。從機(jī)將接收到的2個(gè)字節(jié)的“數(shù)據(jù)信息”重新合成1個(gè)完整的字節(jié)還原出原始數(shù)據(jù),并將該數(shù)據(jù)存放在發(fā)送緩沖區(qū)中,然后通過UART傳遞給所連接的串口設(shè)備上。
主機(jī)通過發(fā)送“0X70”,結(jié)束“數(shù)據(jù)信息”傳送。
主機(jī)通過UART和計(jì)算機(jī)的串口連接,通過SPI與從機(jī)相連。計(jì)算機(jī)通過主機(jī)實(shí)現(xiàn)一對(duì)多操作,從而實(shí)現(xiàn)串口的擴(kuò)展。主機(jī)根據(jù)上位計(jì)算機(jī)的指向,將數(shù)據(jù)傳遞給對(duì)應(yīng)的從機(jī),而將來(lái)自從機(jī)的數(shù)據(jù)加上相應(yīng)從機(jī)信息發(fā)送給計(jì)算機(jī)。在數(shù)據(jù)交換時(shí),必須指明數(shù)據(jù)來(lái)源或數(shù)據(jù)的去向。
主機(jī)—計(jì)算機(jī)間交換數(shù)據(jù)的格式如圖5所示。其中D5~D7位指明從機(jī)地址,可尋址8個(gè)從機(jī);D4位用于區(qū)分D0~D3位是數(shù)據(jù)字節(jié)的高4位或數(shù)據(jù)字節(jié)低4位。兩個(gè)這樣的標(biāo)識(shí)字節(jié)才能完整表達(dá)一個(gè)數(shù)據(jù)字節(jié)。

圖5 主機(jī)—計(jì)算機(jī)之間的數(shù)據(jù)交換格式Fig.5 Format of data exchange between master and computer
從機(jī)的功能較為單一,主要是通過UART與連接的串口設(shè)備交換數(shù)據(jù),以及與主機(jī)通過SPI交換數(shù)據(jù)。
在從機(jī)中開辟2個(gè)數(shù)據(jù)緩沖區(qū),一個(gè)用于暫存接收到的外部串口數(shù)據(jù),等待傳送給主機(jī),即數(shù)據(jù)接收緩沖區(qū);另一個(gè)暫存來(lái)源于主機(jī)的數(shù)據(jù),用于控制所連接的外部串口設(shè)備,即數(shù)據(jù)發(fā)送緩沖區(qū)。
主機(jī)的工作相對(duì)復(fù)雜,需要溝通上位計(jì)算機(jī)和多個(gè)從機(jī)的聯(lián)絡(luò)。在主機(jī)中為每個(gè)從機(jī)開辟有2個(gè)數(shù)據(jù)緩沖區(qū),分別用于保存接收到的從機(jī)數(shù)據(jù)和發(fā)送給從機(jī)的數(shù)據(jù),這些數(shù)據(jù)同時(shí)也用于與計(jì)算機(jī)交換。主機(jī)以SPI方式定時(shí)查詢各個(gè)從機(jī),并交換數(shù)據(jù);然后以UART方式與上位計(jì)算機(jī)交換。在數(shù)據(jù)交換時(shí),主機(jī)需要對(duì)這些數(shù)據(jù)按前面介紹的方法進(jìn)行重新編碼。
主機(jī)與計(jì)算機(jī)的數(shù)據(jù)交換量可能遠(yuǎn)高于從機(jī)與外部串口設(shè)備之間的數(shù)據(jù)量,因此,適當(dāng)提高主機(jī)的波特率加大數(shù)據(jù)吞吐,降低從機(jī)的波特率,開辟合適的緩沖區(qū),可以不發(fā)生數(shù)據(jù)溢出丟失現(xiàn)象。
主機(jī)和從機(jī)的SPI中斷被允許。主機(jī)以定時(shí)方式順次啟動(dòng)與各個(gè)從機(jī)的SPI傳送,一旦啟動(dòng),后續(xù)的SPI傳送在中斷處理程序中觸發(fā),直至緩沖區(qū)中的數(shù)據(jù)交換完畢[4,9]。圖6為主機(jī)SPI中斷服務(wù)程序流程圖。
被主機(jī)選中的從機(jī)接收到主機(jī)傳來(lái)的數(shù)據(jù),產(chǎn)生SPI中斷,在中斷程序中判斷信息類型,采用對(duì)應(yīng)處理方式。圖7為從機(jī)SPI中斷服務(wù)程序流程圖。

圖6 主機(jī)SPI中斷服務(wù)程序流程圖Fig.6 Flow chart of SPI interrupt program in master

圖7 從機(jī)SPI中斷服務(wù)程序流程圖Fig.7 Flow chart of SPI interrupt program in slave
主機(jī)與上位計(jì)算機(jī)的數(shù)據(jù)交換,以及從機(jī)與外部串口設(shè)備的數(shù)據(jù)交換,采用串行口中斷方式處理[4,9,10]。從機(jī)與外部串口設(shè)備交換數(shù)據(jù)自主進(jìn)行,不需要主機(jī)干預(yù)。
基于SPI“主—從”互連的多串口系統(tǒng),從機(jī)獨(dú)立完成與外部設(shè)備的串口通訊,主機(jī)啟動(dòng)SPI,分別獲取各個(gè)從機(jī)接收到的串口數(shù)據(jù)并通過從機(jī)控制所連接的外部串口設(shè)備;主機(jī)通過UART與上位計(jì)算機(jī)交換數(shù)據(jù)。因此,計(jì)算機(jī)通過該“多串口系統(tǒng)”,可以同時(shí)連接多個(gè)串口設(shè)備,實(shí)現(xiàn)了計(jì)算機(jī)串口擴(kuò)展的目標(biāo)。這種串口擴(kuò)展方法,是“多串口卡”方案外的另一種選擇,由于采用外置方式,僅需占用計(jì)算機(jī)1個(gè)串口或1個(gè)USB口,相對(duì)于多串口卡,使用相對(duì)方便。
根據(jù)所設(shè)計(jì)的數(shù)據(jù)交換協(xié)議,基于SPI“主—從”互連的多串口系統(tǒng),具有同時(shí)連接多達(dá)8個(gè)串口設(shè)備的能力。
由于主機(jī)與上位計(jì)算機(jī)通訊波特率高于從機(jī)與外設(shè)的若干倍,并且SPI通訊速率遠(yuǎn)高于串口通訊速率,系統(tǒng)內(nèi)建數(shù)據(jù)接收/發(fā)送緩沖區(qū),這就確保了主機(jī)的數(shù)據(jù)吞吐量大于所有從機(jī)數(shù)據(jù)吞吐量之和,因此盡管串口得到擴(kuò)充,但傳送的數(shù)據(jù)不會(huì)丟失。
[1]謝瑞和.串行技術(shù)大全[M].北京:清華大學(xué)出版社,2003.[2]宋建國(guó).AVR單片機(jī)原理及應(yīng)用[M].北京:北京航空航天大學(xué)出版社,1998:37-41.
[3]三恒星科技.AVR單片機(jī)原理與應(yīng)用實(shí)例[M].北京:電子工業(yè)出版社,2009.
[4]宏晶科技.STC12C5410AD系列單片機(jī)器件手冊(cè)[EB/OL].(2009-02-05)[2010-6-10].http://www.mcu-memory.com/datasheet/stc/STC-AD-PDF/STC12C5410AD.pdf.
[5]童長(zhǎng)飛.C8051F系列單片機(jī)開發(fā)與C語(yǔ)言編程[M].北京:北京航空航天大學(xué)出版社,2005.
[6]Silicon Laboratories.C8051F330 Mixed Signal ISP Flash MCU Family[EB/OL].(2006-01-06)[2010-06-10].http://www.datasheetdir.com/C8051F330+download.
[7]胡大可.MSP430系列FLASH型超低功耗16位單片機(jī)[M].北京:北京航空航天大學(xué)出版社,2001.
[8]宏晶科技.STC11/10XX系列單片機(jī)器件手冊(cè)[EB/OL].(2010-05-10)[2010-06-10].http://www.mcu-memory.com/datasheet/stc/STC-AD-PDF/STC11F-10Fxx.pdf
[9]徐愛均,彭秀華.Keil Cx51 V7.0單片機(jī)高級(jí)語(yǔ)言編程與μVision2應(yīng)用實(shí)踐[M].北京:電子工業(yè)出版社,2004.
[10]趙建領(lǐng).51系列單片機(jī)開發(fā)寶典[M].北京:電子工業(yè)出版社,2007.