田梅蘭,李向功
(1.中國石油大學(xué)(華東)機(jī)電工程學(xué)院,山東 青島 266580;2.一汽解放青島汽車有限公司,山東 青島 266043)
基于Linux的CAN總線通信實(shí)驗(yàn)平臺(tái)研究
田梅蘭1,李向功2
(1.中國石油大學(xué)(華東)機(jī)電工程學(xué)院,山東 青島 266580;2.一汽解放青島汽車有限公司,山東 青島 266043)
∶目前的CAN總線實(shí)驗(yàn)設(shè)備大多屬于演示型設(shè)備,學(xué)生很難參與到CAN總線通信的設(shè)計(jì)中,為解決此問題,將Linux系統(tǒng)中SocketCAN通信方式引入到汽車電子CAN總線實(shí)驗(yàn)中,SocketCAN通信方式屏蔽了對(duì)底層硬件的操作,學(xué)生可以基于SAE J1939協(xié)議對(duì)CAN報(bào)文進(jìn)行設(shè)計(jì),對(duì)深入掌握CAN總線通信機(jī)制有很大幫助。文章提出了一種基于嵌入式Linux的CAN總線通信實(shí)驗(yàn)平臺(tái),經(jīng)測試表明,實(shí)驗(yàn)平臺(tái)運(yùn)行穩(wěn)定,能夠很好地運(yùn)用到汽車電子實(shí)驗(yàn)中。
∶汽車電子;嵌入式Linux;CAN總線通信;SocketCAN
10.16638/j.cnki.1671-7988.2016.09.057
CLC NO.: U467Document Code: AArticle ID: 1671-7988 (2016)09-166-03
汽車內(nèi)部控制系統(tǒng)的數(shù)據(jù)通信都是基于CAN總線來實(shí)現(xiàn)的,CAN總線由于其突出的可靠性、靈活性、實(shí)時(shí)性使它在車載總線上的應(yīng)用遠(yuǎn)遠(yuǎn)高于其他現(xiàn)場總線,學(xué)習(xí)和掌握CAN總線通信機(jī)制成為了汽車電子課程中必不可少的一部分[1-7]。如何直觀、形象地將CAN總線通信原理講授給學(xué)生也成為了汽車電子實(shí)驗(yàn)中一項(xiàng)值得深入思考的問題。
目前,CAN總線相關(guān)的實(shí)驗(yàn)設(shè)備大多屬于演示型,學(xué)生很難深入理解CAN報(bào)文發(fā)送與接收機(jī)制。Linux系統(tǒng)提供了一種簡單便捷的CAN總線通信實(shí)現(xiàn)方式-SocketCAN,在使用上更加通用、更加靈活,解決了原來用字符設(shè)備實(shí)現(xiàn)上的一些困難,為學(xué)習(xí)CAN總線通信提供了一個(gè)新思路和新方法。同時(shí),本文提出了一種用嵌入式Linux開發(fā)板實(shí)現(xiàn)的CAN總線通信實(shí)驗(yàn)平臺(tái),能很好地應(yīng)用于汽車電子實(shí)驗(yàn),對(duì)車輛工程專業(yè)實(shí)驗(yàn)教學(xué)有很大的現(xiàn)實(shí)意義。
Linux下最初是使用字符設(shè)備來實(shí)現(xiàn)CAN通信的,字符設(shè)備是依特定的硬件設(shè)備而存在的,需要對(duì)硬件進(jìn)行直接操作,并且提供的功能很少,如果在使用過程中更換另一個(gè)CAN控制器,則必須同時(shí)換用另一個(gè)設(shè)備驅(qū)動(dòng),還需要修改應(yīng)用程序來適應(yīng)新驅(qū)動(dòng)的接口。SocketCAN使用的是Socket接口和Linux網(wǎng)絡(luò)協(xié)議棧來實(shí)現(xiàn)CAN協(xié)議。它的設(shè)計(jì)非常地接近TCP/IP協(xié)議,這樣就能像使用以太網(wǎng)通信一樣來使用CAN總線通信,在使用上也變得更加通用、更加靈活[3]。
Linux下使用SocketCAN實(shí)現(xiàn)CAN總線通信一般要有以下步驟:
⑴初始化:要想使用SocketCAN實(shí)現(xiàn)CAN通信,必須在應(yīng)用程序中包含兩個(gè)頭文件:linux/can.h和sys/socket.h,其中,linux/can.h中定義了SocketCAN通信中需要使用的大部分的數(shù)據(jù)結(jié)構(gòu)和函數(shù);頭文件sys/socket.h中定義了與網(wǎng)絡(luò)套接字相關(guān)的數(shù)據(jù)結(jié)構(gòu)和函數(shù)。
SocketCAN通信和標(biāo)準(zhǔn)套接字通信最大的區(qū)別在于,SocketCAN是通過特定的結(jié)構(gòu)體can_frame進(jìn)行通信的,在can_frame中將數(shù)據(jù)封裝成幀來實(shí)現(xiàn)CAN報(bào)文的發(fā)送和接收。can_frame的定義如下:
由can_frame結(jié)構(gòu)體的定義可知,學(xué)生可以靈活定義需要發(fā)送的CAN報(bào)文數(shù)據(jù)內(nèi)容,可以深入學(xué)習(xí)CAN總線通信機(jī)制。
就像使用TCP/IP通信一樣,使用SocketCAN通信之前,首先要打開一個(gè)套接字,創(chuàng)建方法和普通套接字創(chuàng)建方式一樣。
⑵綁定套接字:創(chuàng)建套接字以后,要將其綁定在一個(gè)CAN接口上。
⑶發(fā)送/接收CAN總線報(bào)文:綁定套接字以后,即可進(jìn)行報(bào)文的發(fā)送和接收,發(fā)送報(bào)文可以使用send()、 sendto()、sendmsg()函數(shù),接收報(bào)文可以使用read()或recv()函數(shù)。
設(shè)計(jì)實(shí)現(xiàn)的CAN總線通信實(shí)驗(yàn)平臺(tái)的主要功能如下:
⑴CAN報(bào)文發(fā)送功能:能夠發(fā)送常用的CAN報(bào)文,如車速、發(fā)動(dòng)機(jī)轉(zhuǎn)速、冷卻液溫度、燃油液位和里程等車況信息。
⑵CAN報(bào)文接收功能:能夠接收發(fā)送過來的CAN報(bào)文,并且能夠過濾干擾信息。
⑶ CAN報(bào)文數(shù)據(jù)處理功能:對(duì)CAN報(bào)文中的有用信息能夠進(jìn)行提取和計(jì)算。
基于上述功能需求,設(shè)計(jì)的CAN總線通信平臺(tái)由四部分組成:
⑴硬件層:選用S3C6410,S3C6410是三星公司推出的一款高性能、低功耗的“準(zhǔn)64位”RISC微處理器,它基于ARM11內(nèi)核,有很好的外部存儲(chǔ)器接口,同時(shí),片內(nèi)還集成了豐富的硬件資源[4]。MCP2515控制器自帶SPI接口,SPI接口的使用可以簡化CAN總線的應(yīng)用設(shè)計(jì)。
⑵硬件抽象層:主要是啟動(dòng)代碼和固件程序;
⑶操作系統(tǒng)層:即嵌入式Linux操作系統(tǒng);
⑷應(yīng)用程序?qū)樱簩?shí)現(xiàn)CAN總線的收發(fā)、解析功能。
應(yīng)用程序的設(shè)計(jì)分為兩部分,一部分為發(fā)送CAN報(bào)文程序,另一部分為接收CAN報(bào)文程序。
接收端程序設(shè)計(jì)過程如下:
①添加頭文件,創(chuàng)建套接字:首先先創(chuàng)建一個(gè)SocketCAN通信的套接字,方法如下:
②綁定套接字:將創(chuàng)建好的套接字綁定在CAN的一個(gè)接口上,套接字的綁定使用的是bind()函數(shù)。
③CAN報(bào)文的過濾:在接收報(bào)文之前,首先要過濾掉一些干擾信息。SocketCAN中過濾報(bào)文是通過設(shè)置過濾規(guī)則來實(shí)現(xiàn)的,過濾規(guī)則由結(jié)構(gòu)體can_filter實(shí)現(xiàn),其定義如下:
④接收CAN總線報(bào)文:報(bào)文的接收使用函數(shù)read()來實(shí)現(xiàn)。
⑤報(bào)文解析:按照SAE J1939協(xié)議要求將CAN總線報(bào)文中所包含的信息進(jìn)行解析。
接收端程序設(shè)計(jì)的和發(fā)送端程序的前兩步相同,此處不再贅述,第三步為CAN報(bào)文的發(fā)送,由send()函數(shù)來實(shí)現(xiàn)。
經(jīng)測試表明,所設(shè)計(jì)的CAN總線通信實(shí)驗(yàn)平臺(tái)性能穩(wěn)定,能有效發(fā)送和接收CAN報(bào)文。
Linux系統(tǒng)下SocketCAN通信方式的使用有效屏蔽了對(duì)底層硬件的操作,使用更加方便靈活。CAN報(bào)文格式可以根據(jù)SAE J1939協(xié)議進(jìn)行設(shè)計(jì),學(xué)生可以深入理解與掌握CAN總線通信機(jī)制。提出的一種基于嵌入式Linux的CAN總線通信實(shí)驗(yàn)平臺(tái)性能穩(wěn)定,能很好地應(yīng)用于汽車電子實(shí)驗(yàn)。
[1] 吳曉娜.基于Linux和CAN總線的重型卡車監(jiān)測系統(tǒng)設(shè)計(jì)[D].成都:西南交通大學(xué),2007.
[2] 何柏濤.CAN總線技術(shù)在嵌入式收費(fèi)車道機(jī)中的應(yīng)用[J].北方交通,2009(7):99-101.
[3] 譚海鵬.LinuxSocketCAN在機(jī)車走形部監(jiān)測裝置中的應(yīng)用[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2013,13(7):68-71.
[4] 吳柳.基于S3C6410的嵌入式圖像采集及壓縮系統(tǒng)的研究[D].安徽:安徽理工大學(xué),2012.
[5] 章健,袁義江.U-Boot在ARM平臺(tái)上的移植及應(yīng)用[J].微計(jì)算機(jī)信息,2007(03Z):137-138 [6]LeeCT,LinJM,HongZW, etal.Anapplica tion-orientedLinuxkernelcustomizationforembeddedsystems[J].J.Inf. Sci.Eng.,2004,20(6):1093-1107.
[6] KimH,WonY,KangS.EmbeddedNANDflashfilesystemformobilemult imediadevices[J].ConsumerElectronics,IEEETransactionson,2009,5 5(2):545-552.
The research on the experimental platform of CAN bus communication based on Linux
Tian Meilan1, Li Xianggong2
(1.College of Mechanical and Electrical Engineering, China University of Petroleum, Shandong Qingdao 266580; 2.FAW-Jiefang automobile corporation of Qingdao, Shandong Qingdao 266043)
At present,The CAN bus experimental equipment mostly belongs to generative-presentation, students are difficult to participate in the design of CAN bus communication. In order to solve this problem, the SocketCAN communication mode of Linux is introduced into the CAN bus experiments. The SocketCAN communication mode blocks access to the operation of the underlying hardware, students can design the CAN message based on SAE J1939 protocol. This method is of great help to further grasp the CAN bus communication mechanism. The paper put forward a CAN bus communication experimental platform based on Embedded Linux,the tests showed that the experimental platform running stability,and it can be effectively used in automobile electronic experiment.
Automobile electronics; Embedded Linux; CAN bus communication; SocketCAN
∶U467
∶A
∶1671-7988 (2016)09-166-03
田梅蘭(1989-),女,助理實(shí)驗(yàn)師,就職于中國石油大學(xué)(華東)機(jī)電工程學(xué)院,研究方向,嵌入式控制與汽車電子技術(shù)。