鄭 煒
(廣州海格通信集團(tuán)股份有限公司,廣州510663)
某通信控制平臺(tái)系統(tǒng)方案中對(duì)數(shù)據(jù)傳輸總線(xiàn)的設(shè)計(jì)是通信控制平臺(tái)單機(jī)內(nèi)的主板數(shù)據(jù)傳輸總線(xiàn)采用工業(yè)控制領(lǐng)域成熟的PCI總線(xiàn),其數(shù)據(jù)傳輸速率高,可靠性高,可即插即用;平臺(tái)的外部遠(yuǎn)程遙控總線(xiàn)采用國(guó)際標(biāo)準(zhǔn)的現(xiàn)場(chǎng)總線(xiàn)CAN,具有傳輸字節(jié)短、速度快、容錯(cuò)性好、數(shù)據(jù)傳輸可靠等特性[1],有效支持分布式控制和實(shí)時(shí)控制,支持多主方式,總線(xiàn)上分布的任意節(jié)點(diǎn)均可主動(dòng)向其他的節(jié)點(diǎn)發(fā)送信息。
為實(shí)現(xiàn)外部遙控命令直接送到平臺(tái)控制板的嵌入式處理器中,需要設(shè)計(jì)高速、低成本的PCI-CAN總線(xiàn)交換電路。文獻(xiàn)[1-3]主要介紹了CAN總線(xiàn)的特點(diǎn)、總線(xiàn)標(biāo)準(zhǔn)及應(yīng)用,以及芯片 PCI9052和SJA1000的應(yīng)用方案和設(shè)計(jì)要求,文獻(xiàn)[4]主要介紹了VxWorks操作系統(tǒng)下開(kāi)發(fā)PCI總線(xiàn)驅(qū)動(dòng)程序的基本方法。本文結(jié)合設(shè)計(jì)需求和文獻(xiàn)相關(guān)內(nèi)容設(shè)計(jì)開(kāi)發(fā)了PCI-CAN總線(xiàn)交換的硬件電路和驅(qū)動(dòng)程序,并給出了設(shè)計(jì)中的關(guān)鍵點(diǎn)和處理建議。
PCI-CAN總線(xiàn)交換硬件電路設(shè)計(jì)主要由PCI橋芯片PCI9052、CAN總線(xiàn)控制器SJA1000和CAN總線(xiàn)驅(qū)動(dòng)器PCA82C251組成。
PCI9052兼容PCI V2.1規(guī)范,支持目標(biāo)設(shè)備的直接數(shù)據(jù)傳輸,具有4個(gè)片選空間,可通過(guò)I/O空間映射或Memory空間映射將PCI總線(xiàn)訪問(wèn)直接映射到局部總線(xiàn)訪問(wèn),局部總線(xiàn)支持8位、16位或32位總線(xiàn)模式[2]。設(shè)計(jì)中PCI總線(xiàn)和局部總線(xiàn)端均采用Little Endian模式。
SJA1000是獨(dú)立的CAN總線(xiàn)控制器,位速率可達(dá)1 Mb/s,兼容CAN2.0B協(xié)議[3]。PCA82C251是用于CAN總線(xiàn)與總線(xiàn)控制器SJA1000之間的物理接口驅(qū)動(dòng)芯片,最高傳輸速率為1 Mb/s,抗干擾能力強(qiáng),具有芯片熱保護(hù)能力。
傳統(tǒng)設(shè)計(jì)方案會(huì)在PCI9052與SJA1000之間加一級(jí)控制芯片和雙口RAM,以方便進(jìn)行協(xié)議解析和數(shù)據(jù)緩存,但同時(shí)會(huì)增加總線(xiàn)數(shù)據(jù)協(xié)議轉(zhuǎn)換的處理延時(shí)。本方案考慮到降低成本和轉(zhuǎn)換延時(shí)的要求,以及考慮到實(shí)際使用中遙控終端與通信控制平臺(tái)間的控制命令、數(shù)據(jù)交互并不頻繁,協(xié)議中的單幀數(shù)據(jù)指令不長(zhǎng),不會(huì)因頻繁的中斷和數(shù)據(jù)讀寫(xiě)影響嵌入式處理器的實(shí)時(shí)性能,因此設(shè)計(jì)中直接使用PCI9052的局部總線(xiàn)以數(shù)據(jù)地址復(fù)用方式訪問(wèn)SJA1000,原理框圖如圖1所示。
圖1 硬件原理框圖Fig.1 Schematic diagram of hardware
如圖2所示,CAN接口電路由PCA82C251總線(xiàn)驅(qū)動(dòng)器實(shí)現(xiàn)總線(xiàn)控制器SJA1000與CAN總線(xiàn)間的物理接口,R37為斜率電阻,需根據(jù)實(shí)際的總線(xiàn)傳輸速率進(jìn)行調(diào)整,取值范圍一般在10 Ψ~100 kΨ之間。
圖2 CAN接口電路原理圖Fig.2 The CAN interface circuit
SJA1000與PCI9052之間采用局部總線(xiàn)的地址數(shù)據(jù)復(fù)用方式連接,PCI9052需通過(guò)MODE管腳的上拉配置為復(fù)用方式。在軟件的驅(qū)動(dòng)配置過(guò)程中需對(duì)PCI9052的相關(guān)寄存器進(jìn)行配置,將其局部總線(xiàn)位寬設(shè)置為8 b,同時(shí)配置CS0片選空間的基地址和范圍,本例為24000h和4000h,其余寄存器保持上電默認(rèn)值的狀態(tài)下即可通過(guò)PCI9042的Memory空間將PCI總線(xiàn)地址的訪問(wèn)直接映射到局部總線(xiàn)CS0片選空間的地址訪問(wèn)。
LINT為中斷信號(hào),設(shè)計(jì)中配置為邊沿觸發(fā),當(dāng)SJA1000接收到CAN總線(xiàn)上的有效數(shù)據(jù)后拉低該信號(hào)線(xiàn),由PCI9052轉(zhuǎn)換成PCI中斷通知嵌入式處理器來(lái)讀數(shù)據(jù),縮短處理器的響應(yīng)時(shí)間。LCLK為局部總線(xiàn)的時(shí)鐘輸入信號(hào),為保證PCI9052與SJA1000之間讀寫(xiě)數(shù)據(jù)的有效性,保持地址數(shù)據(jù)建立和保持時(shí)間的一致性,設(shè)計(jì)上將LCLK與SJA1000的時(shí)鐘輸入接到同源時(shí)鐘上。
SJA1000的復(fù)位輸入信號(hào)由PCI9052的LRESET#輸出管腳產(chǎn)生,滿(mǎn)足復(fù)位時(shí)間要求,同時(shí)可以保證兩者上電后初始化配置順序的合理性。SJA1000可通過(guò)MODE管腳選擇工作于Intel或Motorola模式,本例設(shè)計(jì)為上拉,即采用Intel模式。
調(diào)試過(guò)程中,應(yīng)重點(diǎn)關(guān)注CS0片選信號(hào)有效時(shí),對(duì)應(yīng)的地址/數(shù)據(jù)是否正確,其與讀寫(xiě)信號(hào)、時(shí)鐘信號(hào)間的時(shí)序關(guān)系是否正確以及ALE鎖存是否工作正常。在對(duì)SJA1000進(jìn)行初始化配置時(shí)建議將時(shí)鐘分頻配置為1/4以區(qū)別于默認(rèn)的1/2時(shí)鐘分頻設(shè)置,這樣可以通過(guò)CLKOUT管腳的時(shí)鐘輸出頻率值判斷是否初始化配置成功。
如圖3所示,PCI接口部分的電路主要由PCI9052和NM93CS46組成,NM93CS46為支持連續(xù)數(shù)據(jù)讀寫(xiě)的EEPROM,存儲(chǔ)空間為1 kb,EEPROM用于存儲(chǔ)PCI配置寄存器的初始化配置數(shù)據(jù),在上電后PCI端口自動(dòng)讀取EEPROM中的數(shù)據(jù)執(zhí)行初始化操作。需要注意的是PCI9052僅支持1 kb的可連續(xù)數(shù)據(jù)讀寫(xiě)的EEPROM,常用型號(hào)如93C46、93C56的芯片不能支持。
PCI9052的EEDO管腳用于選擇是否從EEPROM讀取值來(lái)進(jìn)行自動(dòng)初始化,當(dāng)該管腳配置為下拉時(shí),可選擇使用PCI9052的默認(rèn)值來(lái)進(jìn)行自動(dòng)初始化。TEST管腳在芯片正常工作時(shí)一定要下拉或直接接地。建議設(shè)計(jì)中將PCI總線(xiàn)側(cè)的控制和地址/數(shù)據(jù)信號(hào)線(xiàn)串接33 Ψ的吸收匹配電阻,降低信號(hào)線(xiàn)阻抗失配引起的信號(hào)反射,提高信號(hào)完整性。硬件PCB設(shè)計(jì)過(guò)程中需要注意PCI總線(xiàn)側(cè)信號(hào)線(xiàn)的長(zhǎng)度差要控制在一定的范圍,通常不超過(guò)100 mil。
圖3 PCI接口電路原理圖Fig.3 The PCI interface circuit
通信控制平臺(tái)的嵌入式處理器運(yùn)行的操作系統(tǒng)是VxWorks,需要開(kāi)發(fā)基于VxWorks的驅(qū)動(dòng)程序?qū)CI橋芯片PCI9052和CAN總線(xiàn)控制器SJA1000進(jìn)行初始化配置。
標(biāo)準(zhǔn)PCI設(shè)備要求具有3種地址空間:配置空間、Memory空間和I/O空間[4]。上電后,驅(qū)動(dòng)程序掃描PCI總線(xiàn),并通過(guò)設(shè)備的配置空間確定PCI總線(xiàn)上的PCI設(shè)備和配置要求,以進(jìn)行系統(tǒng)初始化配置。配置空間可分為頭標(biāo)區(qū)和設(shè)備有關(guān)區(qū)兩部分,頭標(biāo)區(qū)的長(zhǎng)度為64 B,結(jié)構(gòu)內(nèi)容如圖4所示。
圖4 PCI總線(xiàn)配置空間頭標(biāo)區(qū)寄存器Fig.4 Registers in PCI bus configuration space
PCI設(shè)備驅(qū)動(dòng)程序的基本流程是查找PCI設(shè)備、確定廠商ID、設(shè)備ID、基地址等配置信息,初始化PCI設(shè)備、設(shè)置中斷服務(wù)函數(shù)的入口地址及啟動(dòng)功能模塊。具體程序流程圖如圖5所示。
圖5 PCI設(shè)備驅(qū)動(dòng)程序流程圖Fig.5 The PCI device driver program process
驅(qū)動(dòng)程序啟動(dòng)后首先啟動(dòng)GetCpciDevice查找PCI設(shè)備、確定廠商ID、設(shè)備ID、基地址等配置信息,然后進(jìn)行軟硬件端口號(hào)的映射。
通過(guò)上述操作后,可以通過(guò)對(duì)Memory空間地址的訪問(wèn)實(shí)現(xiàn)對(duì)PCI9052配置寄存器的訪問(wèn)。程序中的sysPciConfigRead函數(shù)為VxWorks提供的標(biāo)準(zhǔn)PCI驅(qū)動(dòng)庫(kù)函數(shù)。程序找到PCI設(shè)備后,執(zhí)行OpenCpciDev函數(shù)對(duì)PCI設(shè)備進(jìn)行初始化以及中斷配置、開(kāi)中斷等。
通過(guò)上述程序,完成了PCI地址到局部總線(xiàn)地址的映射,隨后可以通過(guò)對(duì)起始地址為90124000h(其中90100000h為I/O空間基地址),大小為4000h的地址范圍的訪問(wèn)實(shí)現(xiàn)對(duì)SJA1000的內(nèi)存訪問(wèn)。
程序中的中斷掛接函數(shù)主要完成掛接中斷,將中斷向量和中斷服務(wù)程序相關(guān)聯(lián)。VxWorks為用戶(hù)提供了PCI中斷掛接函數(shù)pciIntConnect,該掛接函數(shù)將PCI中斷服務(wù)程序InterruptFunc-CAN加入到中斷服務(wù)鏈表中。同時(shí),程序調(diào)用了標(biāo)準(zhǔn)PCI驅(qū)動(dòng)庫(kù)函數(shù)中的pciIntDisable和pciIntEnable來(lái)開(kāi)關(guān)PCI中斷,調(diào)用sysOutLong執(zhí)行PCI空間的數(shù)據(jù)讀寫(xiě)操作。
CAN總線(xiàn)控制器SJA1000的初始化是CAN接口電路驅(qū)動(dòng)程序設(shè)計(jì)的重要部分,成功的初始化配置是保證CAN總線(xiàn)數(shù)據(jù)正確接收和發(fā)送的基礎(chǔ)。程序初始化過(guò)程中要設(shè)置的芯片工作參數(shù)主要有:選擇SJA1000的工作模式,設(shè)定總線(xiàn)通信波特率,設(shè)置驗(yàn)收碼寄存器和驗(yàn)收屏蔽寄存器等。程序初始化流程圖如圖6所示。
圖6 SJA1000初始化流程圖Fig.6 SJA1000 initial program process
設(shè)計(jì)中CAN總線(xiàn)控制器SJA1000的輸入時(shí)鐘為12 MHz,CLKOUT管腳上電后默認(rèn)輸出為輸入時(shí)鐘的1/2,即6 MHz,當(dāng)執(zhí)行上述代碼完成對(duì)芯片初始化配置后,CLKOUT輸入變?yōu)? MHz,表明初始化成功。其后即可通過(guò)讀寫(xiě)SJA1000的接收和發(fā)送寄存器完成CAN總線(xiàn)數(shù)據(jù)的收發(fā)操作。
研究成果已成功應(yīng)用于某短波通信產(chǎn)品的通信控制平臺(tái)中,并隨系統(tǒng)產(chǎn)品通過(guò)了常溫功能和性能測(cè)試、環(huán)境試驗(yàn)、用戶(hù)試用以及定型評(píng)審。各項(xiàng)測(cè)試結(jié)果表明,本方案的設(shè)計(jì)成果可實(shí)現(xiàn)PCI和CAN總線(xiàn)間的數(shù)據(jù)交換,功能正常。性能測(cè)試方面,從CAN總線(xiàn)接收到遙控?cái)?shù)據(jù)命令開(kāi)始,到完成數(shù)據(jù)協(xié)議轉(zhuǎn)換并以中斷方式通知嵌入式處理器讀取為止,所計(jì)平均延時(shí)時(shí)間為0.3 μ s,最大延時(shí)不超過(guò)0.5 μ s,優(yōu)于傳統(tǒng)方案,且生產(chǎn)成本降低了30%。本方案設(shè)計(jì)簡(jiǎn)單、成本低、延時(shí)小,滿(mǎn)足高速、實(shí)時(shí)處理的要求,且具有很好的兼容性和通用性,可移植應(yīng)用于各種有類(lèi)似功能需求的產(chǎn)品中。
本文針對(duì)低成本、低時(shí)延和實(shí)時(shí)處理的設(shè)計(jì)需求,設(shè)計(jì)了低成本的PCI-CAN總線(xiàn)交換硬件實(shí)現(xiàn)方案和驅(qū)動(dòng)程序,對(duì)比傳統(tǒng)實(shí)現(xiàn)方案,在數(shù)據(jù)時(shí)延和實(shí)時(shí)處理的性能方面有較大的提升,且實(shí)現(xiàn)簡(jiǎn)單、成本更低,更有利于實(shí)際產(chǎn)品的批量生產(chǎn)。同時(shí),結(jié)合實(shí)際調(diào)試經(jīng)驗(yàn),指出了軟硬件設(shè)計(jì)和調(diào)試過(guò)程中的關(guān)鍵點(diǎn),給出了相應(yīng)的建議和指導(dǎo),并對(duì)軟件源代碼進(jìn)行了詳細(xì)的解讀,對(duì)工程應(yīng)用中此類(lèi)功能需求的設(shè)計(jì)開(kāi)發(fā)具有一定的參考價(jià)值。
[1]鄔寬民.CAN總線(xiàn)原理與應(yīng)用系統(tǒng)設(shè)計(jì)[M].北京:北京航空航天大學(xué)出版社,2004:32-158.WU Kuan-min.Principle andApplication of CAN BusSystem Design[M].Beijing:Beijing University of Aeronautics and Astronautics Press,2004:32-158.(in Chinese)
[2]PLX Technology Inc.PCI9052 Data Book v1.02[EB/OL].2000[2012-06-25].http://www.plxtech.com/products/io/pci9052.
[3]岑雪松.SJA1000在CAN總線(xiàn)系統(tǒng)節(jié)點(diǎn)的應(yīng)用[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2002(3):50-54.CEN Xue-song.Application of SJA1000 inthe SystemNode of CAN Bus[J].Microcontrollers&Embedded Systems,2002(3):50-54.(in Chinese)
[4]王宇磊,周東.VxWorks下PCI總線(xiàn)驅(qū)動(dòng)程序設(shè)計(jì)與實(shí)現(xiàn)[J].自動(dòng)化與儀表,2008(7):45-48.WANG Yu-lei,ZHOU Dong.Driver Design and Realize of PCI Bus Under VxWorks[J].Automatization and Instrument,2008(7):45-48.(in Chinese)