廣東工程職業(yè)技術(shù)學(xué)院機(jī)電工程系 梁芳芳 王 力 李南安
基于PXA168與MCP2515的CAN總線接口設(shè)計(jì)
廣東工程職業(yè)技術(shù)學(xué)院機(jī)電工程系 梁芳芳 王 力 李南安
利用SPI接口為PXA168微處理器擴(kuò)展CAN總線接口,以CAN在環(huán)境設(shè)備控制網(wǎng)絡(luò)中的應(yīng)用為背景,從CAN總線作為網(wǎng)絡(luò)設(shè)備的實(shí)現(xiàn)、驅(qū)動程序的二個方面,詳盡闡述了MCP2515 CAN控制器在linux下的網(wǎng)絡(luò)設(shè)備接口函數(shù)的實(shí)現(xiàn)。采用該方案擴(kuò)展的CAN總線接口已經(jīng)應(yīng)用到自主開發(fā)的環(huán)境儀器的控制系統(tǒng)當(dāng)中,經(jīng)實(shí)驗(yàn)表明,取得了良好的數(shù)據(jù)傳輸效果。
PXA168;MCP2515;CAN總線;SPI;linux
CAN現(xiàn)場總線已經(jīng)成為在儀表裝置通信的新標(biāo)準(zhǔn),其在短距離條件下具有高達(dá)1Mbps的數(shù)據(jù)傳輸能力,由于其成本低,實(shí)時性好,抗干擾能力強(qiáng),因此廣泛應(yīng)用于車載數(shù)據(jù)采集系統(tǒng)及汽車電子控制網(wǎng)絡(luò)。在自動化電子領(lǐng)域的汽車發(fā)動機(jī)控制部件、傳感器、抗滑系統(tǒng)等應(yīng)用中,CAN的位速率可高達(dá)1Mbps。CAN總線允許多站點(diǎn)同時發(fā)送,既保證了信息處理的實(shí)時性,又使得CAN總線網(wǎng)絡(luò)可以構(gòu)成多主結(jié)構(gòu)的系統(tǒng),保證了系統(tǒng)的可靠性。另外,CAN采用短幀結(jié)構(gòu),且每幀信息都有校驗(yàn)及其他檢錯措施,保證了數(shù)據(jù)的實(shí)時性、低傳輸出錯率。
由于PXA168微處理器本身不帶CAN控制器,所以要為處理器平臺擴(kuò)展CAN總線接口。擴(kuò)展的方式可以分為串行擴(kuò)展和并行擴(kuò)展兩種,但考慮到采用并行總線擴(kuò)展而產(chǎn)生的硬件開銷和成本問題,本設(shè)計(jì)最終根據(jù)實(shí)際需求,選用串行SPI總線擴(kuò)展方式。
MCP2515獨(dú)立的CAN控制器結(jié)構(gòu)如圖1所示。微芯公司的MCP2515完全支持CAN V2.0B技術(shù)規(guī)范。能發(fā)送和接收標(biāo)準(zhǔn)和擴(kuò)展數(shù)據(jù)幀以及遠(yuǎn)程幀。MCP2515自帶的兩個驗(yàn)收屏蔽寄存器和六個驗(yàn)收濾波寄存器可以過濾掉不想要的報文,因此減少了MCU的開銷。由于MCP2515采用串行SPI方式與微處理器連接,因此大大節(jié)省了系統(tǒng)的硬件開銷,通訊速率為1Mbps。控制器內(nèi)部帶有兩個接收緩沖器,高速SPI接口支持0,0和1,1方式的SPI模式,頻率可以達(dá)到10MHz。
套接字接口(socket interface)是一組函數(shù),和其他系統(tǒng)函數(shù)結(jié)合起來用于創(chuàng)建網(wǎng)絡(luò)應(yīng)用,圖2給出了典型的客戶端-服務(wù)器事務(wù)的上下文中的套接字接口描述:
大多數(shù)現(xiàn)代操作系統(tǒng)上都實(shí)現(xiàn)了同一套套接字接口,適用于任何底層的協(xié)議。
3.1 套接字地址結(jié)構(gòu)
因特網(wǎng)的套接字地址存放在如下的sockaddr_in的16字節(jié)結(jié)構(gòu)中,其中的IP地址和端口號總是以網(wǎng)絡(luò)字節(jié)順序(大端法)存放的。
其中_in后綴是互聯(lián)網(wǎng)絡(luò)(internet)的縮寫connect函數(shù)、bind和accept函數(shù)要求一個指向與協(xié)議相關(guān)的套接字地址結(jié)構(gòu)的指針,如何定義這些函數(shù),使之能夠接受各種類型的套接字地址結(jié)構(gòu),解決辦法就是這個stuct sockaddr結(jié)構(gòu),我們將所有的與協(xié)議特定的結(jié)構(gòu)的指針轉(zhuǎn)換成這個通用結(jié)構(gòu)就可以,因此定義了一個類型typedef struct sockaddr SA,使用的時候,將所有的sockaddr_in轉(zhuǎn)換成SA類型。
圖1 MCP2515獨(dú)立的CAN控制器系統(tǒng)結(jié)構(gòu)
圖2 套接字接口概述
3.2 socket函數(shù)
客戶端和服務(wù)器使用socket函數(shù)來創(chuàng)建一個套接字描述符(socket descriptor)
int socket(int domain,int type,int protocol);
因此在我們的代碼中,經(jīng)常這樣調(diào)用socket函數(shù):
clientfd=Socket(PF_CAN,SOCK_RAW,CAN_RAW);
PF_CAN表示使用CAN網(wǎng)絡(luò)、SOCK_RAW表示該套接字用于原始SOCK,CAN_RAW表示CAN的原始包結(jié)構(gòu)。clientfd描述符僅是部分打開,還不能進(jìn)行讀寫,要完成打開套接字的工作,取決于是客戶端還是服務(wù)器?;綜AN幀結(jié)構(gòu)如下:
3.3 bind函數(shù)
通過該函數(shù)綁定CAN接口。
3.4 read/write函數(shù)
3.5 通過這兩個函數(shù)進(jìn)行數(shù)據(jù)的讀和寫完成。
CAN總線屬于現(xiàn)場總線的一種,屬于控制器局部網(wǎng),因此把其歸并到網(wǎng)絡(luò)設(shè)備更合理,MCP2515驅(qū)動程序是網(wǎng)絡(luò)設(shè)備程序與MCP2515硬件的接口,需要屏蔽設(shè)備的工作細(xì)節(jié)提供給用戶程序一系列的標(biāo)準(zhǔn)調(diào)用,其主要就是調(diào)用操作MCP2515的底層函數(shù)實(shí)現(xiàn)open,read,write,ioctl,release等系統(tǒng)調(diào)用函數(shù),來完成與內(nèi)核的通信,為了方便網(wǎng)絡(luò)設(shè)備程序與驅(qū)動的交互,可以根據(jù)CAN控制器的工作特點(diǎn)定義MCP2515的設(shè)備結(jié)構(gòu)體。
open函數(shù)實(shí)現(xiàn)對S3C2440的SPI口的初始化,以及通過SPI口對MCP2515的寄存器進(jìn)行相應(yīng)的初始化。包括CAN總線波特率的設(shè)置,設(shè)置報文濾波以及屏蔽寄存器,開啟中斷使能等。
關(guān)閉設(shè)備,以及釋放申請的中斷號和分配的內(nèi)存空間。
Linux內(nèi)核將所有的中斷統(tǒng)一編號,使用一個irq_desc結(jié)構(gòu)數(shù)組來描述這些中斷;每個數(shù)組項(xiàng)對應(yīng)一個中斷號,里面記錄了中斷處理函數(shù)入口,底層的硬件訪問接口,中斷狀態(tài)等,嵌入式linux內(nèi)核會維護(hù)一個中斷信號線注冊表,所以在使用中斷前必須先申請中斷號,使用完之后要釋放該中斷號,這里使用的就是函數(shù)request_threaded_irq(spi->irq,NULL,mcp251x_can_ist,IRQF_TRIGGER_FALLING,DEVICE_NAME,priv)來注冊一個中斷處理程序,spi->irq為IRQ_EINT3是所要申請的中斷號,can_interrupt是中斷處理函數(shù)的指針,IRQT_FALLING是中斷觸發(fā)的方式,這里選擇的是下降沿觸發(fā),DEVICE_NAME是產(chǎn)生中斷的設(shè)備名稱,dev_id主要用于共享中斷線,當(dāng)一個中斷處理程序需要釋放時,內(nèi)核可以根據(jù)該參數(shù)找到中斷處理函數(shù)鏈表中的需要刪除的中斷處理程序,由于MCP2515的中斷比較多,所以在中斷處理程序需要處理各緩沖器的接收和發(fā)送中斷以及喚醒和錯誤處理。中斷函數(shù)代碼片段如下:
上述代碼中intf保存的是從MCP2515的CANINTF寄存器中讀取的中斷信息,根據(jù)將intf分別進(jìn)行讀,寫和其他操作,在讀時調(diào)用netif_rx進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)讀操作,在寫時調(diào)用netif_wake_queue喚醒發(fā)送內(nèi)部線程進(jìn)行發(fā)送,其他的中斷都可以按這種方法實(shí)現(xiàn)。
為節(jié)省調(diào)試時間和調(diào)試成本,在進(jìn)行PXA1689與MCP2515的CAN總線接口設(shè)計(jì)時,編譯調(diào)試采用的是 武漢吉陽光電科技有限公司的GY8508 USB-CAN總線適配器。這樣,PC可以直接通過USB總線連接至CAN-bus網(wǎng)絡(luò),不用每次調(diào)試都在控制器的CAN數(shù)據(jù)就能構(gòu)成現(xiàn)場總線等CAN-bus網(wǎng)絡(luò)領(lǐng)域中的CAN-bus網(wǎng)絡(luò)控制節(jié)點(diǎn),加快調(diào)試進(jìn)度。
采用帶SPI接口的MCP2515獨(dú)立CAN控制器給PXA168微處理器擴(kuò)展CAN接口,既降低了硬件電路的復(fù)雜性,也保證了CAN總線通訊的穩(wěn)定性和效率。采用該方案擴(kuò)展的CAN總線接口已經(jīng)應(yīng)用到自行開發(fā)的車載終端無線傳輸系統(tǒng)中,經(jīng)實(shí)驗(yàn)表明,取得了良好的數(shù)據(jù)傳輸效果。
[1]基于S3C2410與MCP2515的CAN總線接口設(shè)計(jì).黑龍江:佳木斯大學(xué)學(xué)報(自然科學(xué)版)(第29卷第2期)2011年03月.
[2]Microchip公司.Stand-A lon e CAN C ont rollerW ith SPI Interface,2003.
[3]鄔寬明.CAN總線原理和應(yīng)用系統(tǒng)設(shè)計(jì)[M].北京:北京航空航天人學(xué)出版社,1996.
[4]廣州周立功單片機(jī)發(fā)展有限公司.CAN-bus規(guī)范V2.0版,http://www.zlgm cu.com.
[5]陶志東,周純杰,宋明權(quán),龔云生.基于PXA168的CAN總線通信設(shè)計(jì)與開發(fā)[J].可編程控制器與工廠自動化,2006,01.
[6]王繼國,吉吟東,孫新亞.CAN總線控制器MCP2515的原理及應(yīng)用[J].電測與儀表,2004,41(1).
梁芳芳(1976—),女,廣東梅州人,畢業(yè)于中山大學(xué),碩士,電子工程師,講師,現(xiàn)供職于廣東工程職業(yè)技術(shù)學(xué)院,主要研究方向:通信技術(shù)。
王力(1984—),男,廣東梅州人,畢業(yè)于電子科技大學(xué),碩士,現(xiàn)供職于廣東工程職業(yè)技術(shù)學(xué)院,研究方向:電子技術(shù)。