摘 要: 針對(duì)傳統(tǒng)CAN總線設(shè)備存在的系統(tǒng)規(guī)模大、功耗高、成本高等問題,提出并實(shí)現(xiàn)了一種高性價(jià)比CAN適配" title="適配">適配卡系統(tǒng)。介紹了系統(tǒng)總體結(jié)構(gòu),闡述了軟硬件組成及其功能,并給出硬件具體設(shè)計(jì)方案及驅(qū)動(dòng)程序的實(shí)現(xiàn)方法。經(jīng)實(shí)踐證明,該適配卡系統(tǒng)完全可滿足實(shí)際需要且結(jié)構(gòu)簡(jiǎn)單、能耗低、穩(wěn)定性能好。
關(guān)鍵詞: CAN總線; 適配卡; 驅(qū)動(dòng)程序; 動(dòng)態(tài)鏈接庫(kù)
?
CAN總線是眾多現(xiàn)場(chǎng)總線中的一種,因其廉價(jià)高效的特點(diǎn)在工業(yè)生產(chǎn)的各個(gè)領(lǐng)域得到極廣泛的應(yīng)用。目前市場(chǎng)上有很多型號(hào)的CAN總線設(shè)備,大多數(shù)使用并行總線器件和可編程邏輯器件,從而增加了規(guī)模和復(fù)雜程度,提高了系統(tǒng)功耗和成本。針對(duì)以上問題,本文提出一種高性價(jià)比CAN適配卡設(shè)計(jì)方案。該方案采用廉價(jià)高性能的16位ARM芯片LPC2212為核心控制器,以低能耗的SPI接口器件MCP2515代替?zhèn)鹘y(tǒng)的并行接口器件作為CAN總線控制器,以帶PCI總線控制器的128KB雙口RAM 芯片CY7C09449PV-AC作為上位機(jī)" title="上位機(jī)">上位機(jī)與局部總線" title="局部總線">局部總線的連接中介,免去復(fù)雜的時(shí)序設(shè)計(jì),有效地降低了系統(tǒng)的功耗,縮小了系統(tǒng)的規(guī)模,實(shí)現(xiàn)了高性價(jià)比。
1 系統(tǒng)總體結(jié)構(gòu)
圖1為適配卡系統(tǒng)結(jié)構(gòu)圖。系統(tǒng)由上位機(jī)總線接口和CAN總線接口兩大模塊組成,選擇PCI為與上位機(jī)接口的總線。如圖1所示,PCI總線接口由PCI接口控制器和EEPROM組成, PCI接口控制器完成將PCI信號(hào)轉(zhuǎn)換成局部總線信號(hào)的功能,EEPROM則存儲(chǔ)PCI總線和局部總線的配置信息,系統(tǒng)上電時(shí),PCI接口控制器會(huì)自動(dòng)讀取完成配置過程[1]。CAN總線接口由微處理器、CAN控制器、CAN收發(fā)器和光電隔離器四部分組成[2]。CAN控制器是CAN總線的核心單元,完成CAN通信協(xié)議的全部要求。CAN收發(fā)器提供對(duì)總線的差動(dòng)發(fā)送能力和對(duì)控制器的差動(dòng)接收能力。光電隔離器則實(shí)現(xiàn)收發(fā)器與控制器之間的電氣隔離,保護(hù)控制系統(tǒng)電路。系統(tǒng)采用16位微處理器LPC2212為控制器,主要功能是對(duì)CAN控制器的初始化和上行傳輸數(shù)據(jù)(CAN總線向上位機(jī)傳送數(shù)據(jù))、下行傳輸數(shù)據(jù)(CAN總線向下位機(jī)傳送數(shù)據(jù))的預(yù)處理。
?

?
2 系統(tǒng)硬件設(shè)計(jì)
2.1 PCI總線接口芯片的選擇
PCI總線功能強(qiáng)大,具有良好的兼容性。但同時(shí)它的協(xié)議十分復(fù)雜,設(shè)計(jì)上有一定的難度。其接口芯片的選擇最簡(jiǎn)單有效的方法就是使用芯片廠商制造的專用PCI總線接口芯片。選擇帶PCI總線控制器的128KB雙口SRAM存儲(chǔ)器CY7C09449PV-AC作為PCI總線和局部總線的橋接芯片。
CY7C09449PV-AC包含有128KB的共享存儲(chǔ)空間,能提供滿足PCI 2.2規(guī)范的主、從模式接口,且具有與局部總線微處理器兼容的接口,是一款優(yōu)質(zhì)廉價(jià)的PCI總線控制器[3]。
除了完成將兩種總線連接的基本功能外,CY7C09449PV-AC的使用還能夠避免冗余復(fù)雜的時(shí)序設(shè)計(jì)。因其含有一個(gè)可供PCI總線和局部總線共享的雙口RAM,在需要進(jìn)行通信時(shí),將通信發(fā)起方待發(fā)送信息存儲(chǔ)到共享RAM中,再由通信的接收方讀取存儲(chǔ)在RAM中的內(nèi)容,從而實(shí)現(xiàn)通信,避免了CPLD、FPGA等可編程邏輯器件的使用,大大簡(jiǎn)化了系統(tǒng)的復(fù)雜程度。
2.2 CAN總線接口的實(shí)現(xiàn)
采用16位ARM微處理器芯片LPC2212、獨(dú)立CAN控制器MCP2515、高速CAN收發(fā)器TJA1050以及光電隔離器6N137共同完成CAN總線接口電路的實(shí)現(xiàn)。MCP2515是一款獨(dú)立CAN協(xié)議控制器,它因帶有兩個(gè)驗(yàn)收屏蔽寄存器和六個(gè)驗(yàn)收濾波寄存器而可以過濾掉不滿足條件的報(bào)文,減少微處理器的開銷。此外,它不同于一般的并行總線控制器,MCP2515與微控制器的數(shù)據(jù)傳輸是通過SPI接口來實(shí)現(xiàn)的,大大節(jié)省了I/O" title="I/O">I/O口和降低系統(tǒng)功耗[4]。高速CAN收發(fā)器TJA1050是傳統(tǒng)CAN總線收發(fā)器PCA82C250的后繼產(chǎn)品,能夠?qū)崿F(xiàn)CAN控制器和通信線路的物理連接,提高CAN總線的驅(qū)動(dòng)能力和穩(wěn)定性。為了進(jìn)一步提高系統(tǒng)的抗干擾能力,將MCP2515的TXCAN、RXCAN引腳通過高速光電隔離器6N137后與TJA1050相連,這樣可以使適配卡不受地面環(huán)流的影響,有效地實(shí)現(xiàn)電氣隔離,確保系統(tǒng)穩(wěn)定性。
圖2為CAN接口硬件連接圖。需要特別指出的是:(1)MCP2515的片選信號(hào)直接連接到LPC2212任一標(biāo)準(zhǔn)I/O口引腳,在進(jìn)行數(shù)據(jù)傳輸時(shí)須通過編程將該I/O口引腳的電平拉低,以確保MCP2515時(shí)刻被選中,否則傳輸將被終止; (2)同一時(shí)刻系統(tǒng)只允許一個(gè)主機(jī)操作總線,系統(tǒng)配置LPC2212為 SPI主機(jī),根據(jù)其使用規(guī)則,SSEL引腳必須保持高電平,才能真正執(zhí)行主機(jī)功能[3];(3)圖2(a)是MCP2515的復(fù)位電路。MCP2515有兩種復(fù)位方式:硬件復(fù)位和SPI復(fù)位,系統(tǒng)采用在RESET引腳上連一個(gè)RC電路實(shí)現(xiàn)MCP2515的硬件復(fù)位。電路中二極管的作用是在VDD5掉電時(shí)幫助電容快速放電。R2的作用是限制從電容流入RESET引腳的電流,以避免RESET引腳因靜電放電或過度電性應(yīng)力而擊穿,其阻值選取在1kΩ~10kΩ之間。
?

2.3 PCI_CAN總線互連設(shè)計(jì)
因CY7C09449PV-AC提供了與局部微處理器兼容的接口,故可直接與LPC2212連接。CY7C09449PV-AC與LPC2212的連接電路圖如圖3所示。READ和WRITE分別是存儲(chǔ)器的讀、寫信號(hào)線,LPC2212沒有專門的引腳提供讀寫信號(hào),采用兩個(gè)I/O口連接到外部存儲(chǔ)器的讀寫引腳,通過編程產(chǎn)生讀寫信號(hào)時(shí)序。RDY_IN和RDY_IN是局部總線引腳,表明局部微處理器已準(zhǔn)備好進(jìn)行數(shù)據(jù)操作,將兩引腳分別上拉和下拉,表示總是有效。IRQ_IN和IRQ_OUT分別是數(shù)據(jù)存儲(chǔ)器的中斷輸入和中斷輸出引腳,IRQ_IN可以接收來自LPC2212的中斷信息,并通過PCI控制器傳遞到INTA引腳,進(jìn)而到達(dá)上位機(jī);IRQ_OUT可將中斷信息傳送到局部微處理器以便進(jìn)行數(shù)據(jù)操作。如圖3所示,將IRQ_OUT連接到LPC2212的P0.3外部中斷1輸入引腳,而配置P1.16為標(biāo)準(zhǔn)I/O口連接到CY7C09449PV-AC的IRQ_IN,并編程實(shí)現(xiàn)中斷信號(hào)的輸出。RDY_OUT為CY7C09449PV-AC的準(zhǔn)備好應(yīng)答信號(hào),當(dāng)此引腳電平有效時(shí),說明存儲(chǔ)器已準(zhǔn)備進(jìn)行數(shù)據(jù)操作,將其與LPC2212的已配置為標(biāo)準(zhǔn)I/O口的P1.17相連,編程查詢存儲(chǔ)器的狀態(tài)。MCP2515的片選信號(hào)是由LPC2212的部分地址線通過DPLD(地址解碼PLD)邏輯處理后產(chǎn)生。其優(yōu)點(diǎn)是地址解碼PLD電路不僅提供CY7C09449PV-AC的片選信號(hào)還可以提供其他器件的片選信號(hào),給系統(tǒng)留下充分的擴(kuò)展空間。

?
3 系統(tǒng)軟件設(shè)計(jì)
3.1 適配卡程序設(shè)計(jì)
適配卡程序調(diào)度微處理器完成MCP2515的初始化、上行數(shù)據(jù)傳輸和下行數(shù)據(jù)傳輸三大功能。MCP2515的初始化主要包括:設(shè)置模式、總線時(shí)序、中斷使能、標(biāo)識(shí)符表格等,這些設(shè)置均通過向其對(duì)應(yīng)的寄存器賦值來完成。進(jìn)行下行數(shù)據(jù)傳輸時(shí),由CY7C09449PV-AC接收來自上位機(jī)的數(shù)據(jù)并向LPC2212發(fā)出中斷信號(hào),LPC2212讀取共享存儲(chǔ)器中的數(shù)據(jù)并將其通過CAN控制器MCP2515發(fā)送到CAN總線上。進(jìn)行上行數(shù)據(jù)傳輸時(shí),MCP2515接收到來自CAN總線的數(shù)據(jù)并向LPC2212發(fā)出中斷信號(hào),LPC2212將存儲(chǔ)在MCP2515接收緩沖器中的數(shù)據(jù)傳送到共享存儲(chǔ)器,并通過CY7C09449PV-AC向PCI總線發(fā)出中斷,上位機(jī)程序讀取數(shù)據(jù)。
CY7C09449PV-AC作為兩種總線的中介部分,該雙口RAM有16KB的共享空間。以上位機(jī)為參照把它分成單個(gè)容量為8KB的兩個(gè)區(qū)間,如圖4所示。0x4000H~0x5fff為發(fā)送幀空間,0x6000H~0x7fffH為接收幀空間,0x4E8H是上位機(jī)對(duì)局部處理器的郵箱HLDATA的地址,0x4F8H是局部處理器對(duì)上位機(jī)的郵箱LHDATA的地址。把發(fā)送空間和接收空間設(shè)計(jì)成兩個(gè)循環(huán)分別用兩個(gè)指針來控制,在HLDATA中存放上位發(fā)送幀地址指針和上位接收幀地址指針,在LHDATA中存放局部發(fā)送幀地址指針和局部接收幀地址指針。上位機(jī)每接收一個(gè)幀,上位接收幀地址加1;每發(fā)送一個(gè)幀,上位發(fā)送幀地址加1。LPC2212每接收一個(gè)幀,局部接收幀地址加 1;每發(fā)送一個(gè)幀,局部發(fā)送幀地址加1。這樣能有效直觀地控制共享區(qū)間,簡(jiǎn)單實(shí)用。
?

3.2 上位機(jī)軟件設(shè)計(jì)
系統(tǒng)上位機(jī)軟件包括CAN適配卡驅(qū)動(dòng)程序和應(yīng)用程序動(dòng)態(tài)鏈接庫(kù)" title="動(dòng)態(tài)鏈接庫(kù)">動(dòng)態(tài)鏈接庫(kù)兩大部分。
3.2.1 CAN適配卡驅(qū)動(dòng)程序設(shè)計(jì)
驅(qū)動(dòng)程序主要完成的功能包括:列舉設(shè)備、找到所需設(shè)備、列舉設(shè)備所有資源、鎖定設(shè)備資源、訪問設(shè)備資源、解鎖設(shè)備資源和釋放設(shè)備。具體完成如下工作:(1)幫助上位機(jī)獲取CAN適配卡上的資源;(2)CAN適配卡的I/O口控制,包括上位機(jī)對(duì)適配卡的讀寫;(3)CAN適配器的中斷控制,系統(tǒng)只對(duì)接收中斷開放,當(dāng)MCP2515收到來自CAN網(wǎng)絡(luò)的數(shù)據(jù)時(shí)通過LPC2212產(chǎn)生中斷信號(hào),驅(qū)動(dòng)程序立即進(jìn)行中斷處理,將收到的數(shù)據(jù)放入接收緩沖區(qū)。
采用Windriver開發(fā)系統(tǒng)驅(qū)動(dòng)程序,該軟件主要開發(fā)ISA、USB、PCI接口的硬件設(shè)備驅(qū)動(dòng),并包含有Windriver Wizard、Windriver發(fā)行包、多個(gè)公用程序等資源,完全能夠達(dá)到設(shè)計(jì)要求[5]。開發(fā)過程如下:(1)使用自帶的Driver Wizard工具查找需要編寫驅(qū)動(dòng)程序的適配卡,并用CREATE INF FILE產(chǎn)生INF文件,然后添加新硬件;(2)設(shè)置適配卡上的配置寄存器;(3)對(duì)適配卡上的I/O空間、內(nèi)存空間、中斷資源進(jìn)行配置,以便驅(qū)動(dòng)程序能獲得這些資源;(4)自動(dòng)生成源代碼,并人為進(jìn)行功能代碼的添加,如中斷服務(wù)程序等。
3.2.2 動(dòng)態(tài)鏈接庫(kù)的設(shè)計(jì)
動(dòng)態(tài)鏈接庫(kù)是上層應(yīng)用程序與底層驅(qū)動(dòng)程序的接口,被應(yīng)用程序調(diào)用并借助驅(qū)動(dòng)程序?qū)ξ锢碛布M(jìn)行數(shù)據(jù)操作[6]。由于Windows具有與設(shè)備無關(guān)的特性,如果直接用Windows的API函數(shù)或I/O讀寫指令進(jìn)行訪問和操作,程序運(yùn)行時(shí)往往會(huì)產(chǎn)生保護(hù)模式錯(cuò)誤甚至死機(jī),更嚴(yán)重的情況會(huì)導(dǎo)致系統(tǒng)崩潰。用動(dòng)態(tài)鏈接庫(kù)技術(shù)可以方便地解決上述問題。將Windows的API函數(shù)或I/O讀寫指令的訪問和操作封裝成一個(gè)DLL,用CreateFile( )函數(shù)打開設(shè)備,用I/O管理器構(gòu)造一個(gè)IRP傳送給總線驅(qū)動(dòng)程序,由驅(qū)動(dòng)程序完成該請(qǐng)求或者請(qǐng)求進(jìn)一步傳送給端口驅(qū)動(dòng)程序,然后返回執(zhí)行狀態(tài)。本系統(tǒng)的動(dòng)態(tài)鏈接庫(kù)主要包含以下四個(gè)功能函數(shù):(1)PCICAN_Actv:獲取一個(gè)用于對(duì)適配卡進(jìn)行讀寫操作的指針;(2)PCICAN_TrnsDat:用于向CAN總線上的節(jié)點(diǎn)發(fā)送信息;(3)PCICAN_RecvDat:用于接收來自CAN總線上的信息;(4)PCICAN_Deactv:用以關(guān)閉CAN通信卡,釋放設(shè)備資源。
本文在充分研究了市場(chǎng)上的CAN總線適配卡的基礎(chǔ)上,成功地設(shè)計(jì)了一款基于PCI的CAN總線適配卡。將適配卡插在PC機(jī)上與一自制CAN總線節(jié)點(diǎn)進(jìn)行通信,該卡在長(zhǎng)時(shí)間的測(cè)試中能保持正常運(yùn)轉(zhuǎn)、性能穩(wěn)定、通信速度快、發(fā)熱量低、占用CPU時(shí)間少,有較好的可靠性和實(shí)時(shí)性。且結(jié)構(gòu)簡(jiǎn)單、規(guī)模小、性價(jià)比高,符合當(dāng)今電子設(shè)備的發(fā)展趨勢(shì)。
參考文獻(xiàn)
[1] ?李貴山,戚得虎. PCI局部總線開發(fā)者指南[M]. 西安:西安電子科技大學(xué)出版社,2000.
[2] ?鄔寬明.CAN總線原理和應(yīng)用系統(tǒng)設(shè)計(jì)[M].北京:北京航空航天大學(xué)出版社,1996.
[3] ?Cypress Semiconductor Corporation, CY7C09449PV-AC?data book[S]. 2002.
[4] ?Microchip Technology Inc. MCP2515 data book[S].2005.
[5] ?張熙,王悠. PCI總線高速數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)[J].微計(jì)算機(jī)信息,2007,(1):34,142-143.
[6] ?CANT C著.Windows WDM設(shè)備驅(qū)動(dòng)程序開發(fā)指南[M].孫義,馬莉波,國(guó)雪飛,等譯.北京:機(jī)械工業(yè)出版社,1999.
