胡立群,陳敦軍
(南京大學電子科學與工程學院江蘇省光電信息功能材料重點實驗室,江蘇南京210093)
許多數(shù)字化設備、測量儀器都具有RS232串行接口[1]。在某些場合需要多臺這樣的設備聯(lián)合測量,并與計算機等主控設備交換數(shù)據(jù),接受主控設備的控制。最簡單的方法是直接將設備連接到計算機的串口上,但一般臺式計算機本身所帶的串口數(shù)量只有1~2個,有時難以滿足需要。盡管還可以采用具有PCI總線的多串口卡對計算機系統(tǒng)進行擴充,但需要額外占用系統(tǒng)資源,并且一些情況下的局限性限制了這種方法的應用。
本文介紹了一種不同于多串口卡的串口擴展方法,采用該方法建立的多串口系統(tǒng),主體由多個單片機組成,單片機同時具有串口和SPI接口,單片機之間基于SPI總線“主—從”互連,系統(tǒng)中的1個“主串口”用于連接計算機,其余的“從串口”可以連接其他的串口設備。因此,系統(tǒng)工作時只需占用計算機的1個串口資源或1個USB接口。連接到該系統(tǒng)上的其他串口設備通過該系統(tǒng)的控制轉發(fā),可以與計算機進行正常的數(shù)據(jù)交換。
一片單片機一般只有1個全雙工異步串行口(UART),也就是說,一片單片機只能連接1個外部串口設備。如果一個系統(tǒng)需要同時連接多個外部串口設備,則可采用多片單片機構成系統(tǒng)的主體,這些單片機各自分別與1個串口設備連接并交換數(shù)據(jù)。系統(tǒng)中的主控制單元采用某種方式協(xié)調(diào)這些單片機與上位計算機的數(shù)據(jù)交換,從而達到計算機串口擴展的目的。
現(xiàn)在一些通用的單片機功能都很強大,片上不僅集成有全雙工異步串行口(UART),還集成有全雙工同步串行接口(SPI),這為上述構想的實現(xiàn)提供了必要條件。
根據(jù)上述構想,設計一個系統(tǒng),主體是由多個具有全雙工同步串行接口(SPI)的單片機構成,將其中的1個CPU作為主機(主控制單元),其余為從機。通過SPI總線,可以很方便地將這些單片機進行連接,形成“單主—多從”的結構,主器件主導SPI通訊[2-7]。系統(tǒng)中,主機的UART與上位計算機的串口連接,每個從機的UART與1個外部串口設備連接,由此形成一個“基于SPI互連的多串口系統(tǒng)”,實現(xiàn)對計算機串口資源的擴展。
這種基于SPI的多串口收發(fā)控制系統(tǒng),不同于多串口卡,采用外置式設計,僅占用1個計算機的串口或1個USB口。系統(tǒng)中各從機獨立運行,并行工作。系統(tǒng)中的主機完成“一對多”的任務調(diào)配,起到溝通上位計算機與多個外部串口設備的作用。圖1顯示了該系統(tǒng)中的主—從互連結構及與計算機、外部串口設備的連接。
圖1 基于SPI主—從互連多串口系統(tǒng)示意圖Fig.1 Schematic diagram of multi-serial-port system based on master/slave mode SPI
STC12C5410系列單片機,以8051為內(nèi)核,并具有以下特點:1 T周期單片機,在線可編程(ISP),I/O可配置為4種方式,具有SPI同步串行高速接口、UART異步串行接口,片上擴展外部數(shù)據(jù)存儲器XRAM等。由于具有上述特點,STC12C5410很適合用來構成基于SPI的多串口收發(fā)控制系統(tǒng)。
STC12C5410系列單片機具有SPI接口,有2種操作模式:主模式和從模式。在主模式中支持高達3 Mbit/s的速率(工作頻率為12 MHz時,如果CPU主頻采用20~36 MHz,則可更高),還具有傳輸完成標志和寫沖突標志保護。
SPI接口有4個管腳:CLK/P1.7,MOSI/P1.5,MISO/P1.6,SS/P1.4。
CLK,MOSI,MISO通常和2個或更多SPI器件連接在一起。數(shù)據(jù)通過MOSI由主機傳送到從機,通過MISO由從機傳送到主機。CLK信號在主模式時為輸出,在從模式時為輸入。如果SPI被禁止,這些管腳都可作為I/O口使用。
SS為從機選擇管腳。在典型配置中,SPI主機使用I/O口選擇1個SPI器件作為當前的從機。
該系列單片機,有3個與SPI功能模塊相關的特殊功能寄存器,分別是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操作時,主機和從機的2個SPI數(shù)據(jù)寄存器都可以看成1個16位循環(huán)移位寄存器,當數(shù)據(jù)從主機移位傳送到從機的同時,數(shù)據(jù)也以相反的方向移入。這意味著在1個移位周期,主機和從機數(shù)據(jù)相互交換[2,4]。
STC12C5410的UART的控制方式,與其他8051系列單片機基本一樣,只是由于STC12C5410是1 T周期單片機,通過對輔助寄存器(AUXR)的設置,可以改變定時器0、定時器1、UART的速度。AUXR地址為8EH。表4為AUXR有關的位描述。
表4 AUXR有關的位描述Tab.4 Related bit description of AUXR
為了兼容傳統(tǒng)的8051單片機,定時器0、定時器1復位后是12分頻。如果UART以定時器1作為波特率發(fā)生器,則T1_12決定了UART串口是1T還是12T。
ESPI是SPI中斷控制位。SPI的中斷順序號為5[4]。
SPI通訊可以看成主機控制下的主機—從機SPI數(shù)據(jù)寄存器內(nèi)容的互換,主機不僅得到從機中的數(shù)據(jù),也同時將數(shù)據(jù)發(fā)送給從機[2,4]。因此,采用SPI通訊,主機既可以得到從機連接的串口設備傳來的數(shù)據(jù),也可以通過從機將來自主機的控制數(shù)據(jù)傳遞給外部串口設備。
為了描述方便,將主機向從機傳遞的信息分為2種類型,“命令信息(command-info.)”和“數(shù)據(jù)信息(data-info.)”。從機將接收到的外部串口設備的數(shù)據(jù)暫存在接收緩沖區(qū)中,主機為了得到這些數(shù)據(jù)向從機所發(fā)送的信息稱為“命令信息”。主機為了控制外部串口設備而向從機發(fā)送的信息稱為“數(shù)據(jù)信息”。
主機所傳遞的兩類“信息”,通過字節(jié)的第7位(特征位)來區(qū)別,1代表是“命令信息”,0代表是“數(shù)據(jù)信息”。從機根據(jù)接收到的信息類型,采取對應的處理方式,將接收緩沖區(qū)中的數(shù)據(jù)傳回給主機,或?qū)⒅鳈C數(shù)據(jù)暫放在發(fā)送緩沖區(qū)中,等待傳遞給外部設備,圖2顯示了數(shù)據(jù)流動方向。
2.1.1 定 義命令信息(Command-info.)
由于從機只能被動地與主機交換數(shù)據(jù),“命令信息”可使從機知道主機的操作意圖,準備好要交換的數(shù)據(jù)。表5列出了所定義的4個“命令信息”。
通過“命令信息”,主機得到從機“數(shù)據(jù)接收緩沖區(qū)”中的數(shù)據(jù),也就是得到與該從機連接的外部串口設備傳來的數(shù)據(jù)。
圖2 數(shù)據(jù)流動示意圖Fig.2 Diagram of data transfers
表5 定義的4個命令信息Tab.5 Defined four command-info.
2.1.2 數(shù) 據(jù)信息(Data-info)及構成
“數(shù)據(jù)信息”由主機發(fā)出,通知從機將有關數(shù)據(jù)發(fā)往所連接的外部串口設備。
“數(shù)據(jù)信息”含有特征位,第7位固定為0,不能完整表達所要傳送的一個數(shù)據(jù)字節(jié)(見圖3),所以1個“數(shù)據(jù)字節(jié)”要用2個“數(shù)據(jù)信息”字節(jié)表達。表達方式是:將該數(shù)據(jù)字節(jié)分割為字節(jié)的高4位和字節(jié)的低4位兩部分,并分別作為2個“數(shù)據(jù)信息”字節(jié)的低4位,然后在這2個“數(shù)據(jù)信息”的高4位添加特征位。其中“數(shù)據(jù)信息”的第6位用來區(qū)分數(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ù)位。主機兩次SPI傳送,先高后低。從機將接收到的2個字節(jié)的“數(shù)據(jù)信息”重新合成1個完整的字節(jié)還原出原始數(shù)據(jù),并將該數(shù)據(jù)存放在發(fā)送緩沖區(qū)中,然后通過UART傳遞給所連接的串口設備上。
主機通過發(fā)送“0X70”,結束“數(shù)據(jù)信息”傳送。
主機通過UART和計算機的串口連接,通過SPI與從機相連。計算機通過主機實現(xiàn)一對多操作,從而實現(xiàn)串口的擴展。主機根據(jù)上位計算機的指向,將數(shù)據(jù)傳遞給對應的從機,而將來自從機的數(shù)據(jù)加上相應從機信息發(fā)送給計算機。在數(shù)據(jù)交換時,必須指明數(shù)據(jù)來源或數(shù)據(jù)的去向。
主機—計算機間交換數(shù)據(jù)的格式如圖5所示。其中D5~D7位指明從機地址,可尋址8個從機;D4位用于區(qū)分D0~D3位是數(shù)據(jù)字節(jié)的高4位或數(shù)據(jù)字節(jié)低4位。兩個這樣的標識字節(jié)才能完整表達一個數(shù)據(jù)字節(jié)。
圖5 主機—計算機之間的數(shù)據(jù)交換格式Fig.5 Format of data exchange between master and computer
從機的功能較為單一,主要是通過UART與連接的串口設備交換數(shù)據(jù),以及與主機通過SPI交換數(shù)據(jù)。
在從機中開辟2個數(shù)據(jù)緩沖區(qū),一個用于暫存接收到的外部串口數(shù)據(jù),等待傳送給主機,即數(shù)據(jù)接收緩沖區(qū);另一個暫存來源于主機的數(shù)據(jù),用于控制所連接的外部串口設備,即數(shù)據(jù)發(fā)送緩沖區(qū)。
主機的工作相對復雜,需要溝通上位計算機和多個從機的聯(lián)絡。在主機中為每個從機開辟有2個數(shù)據(jù)緩沖區(qū),分別用于保存接收到的從機數(shù)據(jù)和發(fā)送給從機的數(shù)據(jù),這些數(shù)據(jù)同時也用于與計算機交換。主機以SPI方式定時查詢各個從機,并交換數(shù)據(jù);然后以UART方式與上位計算機交換。在數(shù)據(jù)交換時,主機需要對這些數(shù)據(jù)按前面介紹的方法進行重新編碼。
主機與計算機的數(shù)據(jù)交換量可能遠高于從機與外部串口設備之間的數(shù)據(jù)量,因此,適當提高主機的波特率加大數(shù)據(jù)吞吐,降低從機的波特率,開辟合適的緩沖區(qū),可以不發(fā)生數(shù)據(jù)溢出丟失現(xiàn)象。
主機和從機的SPI中斷被允許。主機以定時方式順次啟動與各個從機的SPI傳送,一旦啟動,后續(xù)的SPI傳送在中斷處理程序中觸發(fā),直至緩沖區(qū)中的數(shù)據(jù)交換完畢[4,9]。圖6為主機SPI中斷服務程序流程圖。
被主機選中的從機接收到主機傳來的數(shù)據(jù),產(chǎn)生SPI中斷,在中斷程序中判斷信息類型,采用對應處理方式。圖7為從機SPI中斷服務程序流程圖。
圖6 主機SPI中斷服務程序流程圖Fig.6 Flow chart of SPI interrupt program in master
圖7 從機SPI中斷服務程序流程圖Fig.7 Flow chart of SPI interrupt program in slave
主機與上位計算機的數(shù)據(jù)交換,以及從機與外部串口設備的數(shù)據(jù)交換,采用串行口中斷方式處理[4,9,10]。從機與外部串口設備交換數(shù)據(jù)自主進行,不需要主機干預。
基于SPI“主—從”互連的多串口系統(tǒng),從機獨立完成與外部設備的串口通訊,主機啟動SPI,分別獲取各個從機接收到的串口數(shù)據(jù)并通過從機控制所連接的外部串口設備;主機通過UART與上位計算機交換數(shù)據(jù)。因此,計算機通過該“多串口系統(tǒng)”,可以同時連接多個串口設備,實現(xiàn)了計算機串口擴展的目標。這種串口擴展方法,是“多串口卡”方案外的另一種選擇,由于采用外置方式,僅需占用計算機1個串口或1個USB口,相對于多串口卡,使用相對方便。
根據(jù)所設計的數(shù)據(jù)交換協(xié)議,基于SPI“主—從”互連的多串口系統(tǒng),具有同時連接多達8個串口設備的能力。
由于主機與上位計算機通訊波特率高于從機與外設的若干倍,并且SPI通訊速率遠高于串口通訊速率,系統(tǒng)內(nèi)建數(shù)據(jù)接收/發(fā)送緩沖區(qū),這就確保了主機的數(shù)據(jù)吞吐量大于所有從機數(shù)據(jù)吞吐量之和,因此盡管串口得到擴充,但傳送的數(shù)據(jù)不會丟失。
[1]謝瑞和.串行技術大全[M].北京:清華大學出版社,2003.[2]宋建國.AVR單片機原理及應用[M].北京:北京航空航天大學出版社,1998:37-41.
[3]三恒星科技.AVR單片機原理與應用實例[M].北京:電子工業(yè)出版社,2009.
[4]宏晶科技.STC12C5410AD系列單片機器件手冊[EB/OL].(2009-02-05)[2010-6-10].http://www.mcu-memory.com/datasheet/stc/STC-AD-PDF/STC12C5410AD.pdf.
[5]童長飛.C8051F系列單片機開發(fā)與C語言編程[M].北京:北京航空航天大學出版社,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位單片機[M].北京:北京航空航天大學出版社,2001.
[8]宏晶科技.STC11/10XX系列單片機器件手冊[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單片機高級語言編程與μVision2應用實踐[M].北京:電子工業(yè)出版社,2004.
[10]趙建領.51系列單片機開發(fā)寶典[M].北京:電子工業(yè)出版社,2007.