1.前言
CAN(Controller Area Network)總線(xiàn),,即控制器局域網(wǎng)總線(xiàn),,是一種有效支持分布式控制或?qū)崟r(shí)控制的串行通信網(wǎng)絡(luò),。由于其高性能,、高可靠性,、及獨(dú)特的設(shè)計(jì)和適宜的價(jià)格而廣 泛應(yīng)用于工業(yè)現(xiàn)場(chǎng)控制、智能樓宇,、醫(yī)療器械,、交通工具以及傳感器等領(lǐng)域,并已被公認(rèn)為幾種最有前途的現(xiàn)場(chǎng)總線(xiàn)之一,。CAN總線(xiàn)規(guī)范已經(jīng)被國(guó)際標(biāo)準(zhǔn)化組織制 訂為國(guó)際標(biāo)準(zhǔn)ISO11898,,并得到了眾多半導(dǎo)體器件廠(chǎng)商的支持。
本文使用華清遠(yuǎn)見(jiàn)FS2416平臺(tái),。FS2416使用Socket網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)和字符設(shè)備驅(qū)動(dòng)兩種方式向Linux內(nèi)核提供MCP2515的驅(qū)動(dòng),,本文詳細(xì)介紹了使用Socket方式設(shè)計(jì)的基于MCP2515的Linux CAN總線(xiàn)驅(qū)動(dòng)程序。
2.FS2416簡(jiǎn)介
圖1 FS2416開(kāi)發(fā)板
FS2416采用的是三星公司的ARM926EJ內(nèi)核CPU S3C2416,,無(wú)論從性能上,,還是成本上, S3C2416都強(qiáng)于2440,是2440的最完美替代者,。
作為32/16 bit RISC指令集,、低成本、低功耗,、高性能的微處理器,。S3C2416使用了65nm的制作工藝從而降低成本、功耗及提高性能,,其使用的ARM926EJ的 核心,,集成了2D圖形加速,添加了低功耗模式,,支持內(nèi)部ROM/RAM引導(dǎo),,支持moviNand啟動(dòng)和低功耗音頻編解碼。此外相對(duì)于其他ARM9芯片,, 它的外設(shè)也得到了升級(jí),,有更多的資源。
圖2 FS2416板級(jí)資源介紹
3.MCP2515簡(jiǎn)介
MCP2515是一種獨(dú)立的CAN總線(xiàn)通信控制器,,是Microchip公司首批獨(dú)立CAN解決方案的 升級(jí)器件,,其傳輸能力較Microchip公司原有CAN控制器(MCP2510)高兩倍,,最高通信速率可達(dá)到1Mbps,。MCP2515能夠接收和發(fā)送 標(biāo)準(zhǔn)數(shù)據(jù)幀和擴(kuò)展數(shù)據(jù)幀以及遠(yuǎn)程幀,通過(guò)兩個(gè)接收屏蔽寄存器和六個(gè)接收過(guò)濾寄存器濾除無(wú)關(guān)報(bào)文,,從而減輕CPU負(fù)擔(dān),。
MCP2515主要功能參數(shù)及電氣特性如下:
(1)支持CAN技術(shù)規(guī)范2.0A/B, 最高傳輸速率達(dá)到1Mbps;
(2)支持標(biāo)準(zhǔn)數(shù)據(jù)幀,、擴(kuò)展數(shù)據(jù)幀和遠(yuǎn)程幀,,每幀數(shù)據(jù)域長(zhǎng)度可為0~8個(gè)字節(jié);
(3)內(nèi)含兩個(gè)的接收緩沖器和三個(gè)發(fā)送緩沖器,并且可編程設(shè)定優(yōu)先級(jí),;
(4)內(nèi)含六個(gè)29位(bit)的接收過(guò)濾寄存器和兩個(gè)29位(bit)的接收屏蔽寄存器,;
(5)高速SPI接口,支持SPI 0,0和1,1模式,;
(6)一次性模式可確保報(bào)文被一次性傳輸,;
(7)具有可編程時(shí)鐘脈沖輸出引腳,可作為其他芯片時(shí)鐘信號(hào)源,;
(8) 幀起始(SOF)信號(hào)輸出功能可被用于在確定的系統(tǒng)中(如時(shí)間觸發(fā)CAN-TTCAN)執(zhí)行時(shí)隙功能,,或在CAN總線(xiàn)診斷中決定早期總線(xiàn)出級(jí);
(9) 采用低功耗CMOS技術(shù),,工作電壓:2.7V~5.5V, 工作電流:5mA(待機(jī)狀態(tài)1μA),;
(10)工作溫度范圍:(I)-40℃到+85℃,(E)-40℃到+125℃,。
4.硬件設(shè)計(jì)
MCP2515與S3C2416的硬件連接圖如圖3所示,。如硬件原理圖可知MCP2515芯片連接在 S3C2416芯片的SPI0上,中斷接在GPF1上,;MCP2515輸出連接SN65HVD230 CAN總線(xiàn)收發(fā)器,,SN65HVD230是德州儀器公司生產(chǎn)的3.3V CAN收發(fā)器。為了節(jié)省功耗,,縮小電路體積,,MCP2515 CAN總線(xiàn)控制器的邏輯電平采用LVTTL,SN65HVD230就是與其配套的收發(fā)器,。
圖3 MCP2515硬件連接圖
5.MCP2515 Socket CAN驅(qū)動(dòng)實(shí)現(xiàn)
FS2416平臺(tái)使用Linux2.6.39的內(nèi)核,,內(nèi)核中為MCP2515提供了Socket CAN驅(qū)動(dòng)程序,我們只需為MCP2515芯片配置內(nèi)核選項(xiàng)就可以使用Socket編程的方式使用MCP2515 CAN總線(xiàn),。
5.1 Socket CAN介紹
Socket CAN是在Linux下CAN協(xié)議實(shí)現(xiàn)的一種實(shí)現(xiàn)方法,。Linux下最早使用CAN的方法是基于字符設(shè)備來(lái)實(shí)現(xiàn)的,與之不同的是Socket CAN使用伯克利的Socket接口和Linux網(wǎng)絡(luò)協(xié)議棧,,這種方法使得CAN設(shè)備驅(qū)動(dòng)可以通過(guò)網(wǎng)絡(luò)接口來(lái)調(diào)用,。Socket CAN的接口被設(shè)計(jì)的盡量接近TCP/IP的協(xié)議,讓那些熟悉網(wǎng)絡(luò)編程的程序員能夠比較容易的學(xué)習(xí)和使用,。
5.2 向Linux內(nèi)核注冊(cè)MCP2515驅(qū)動(dòng)
向Linux內(nèi)核添加SPI驅(qū)動(dòng)在之前的文章已經(jīng)有詳細(xì)的介紹,,根據(jù)硬件原理圖圖3所示,MCP2515掛在SPI0上,,使用中斷GPF1,,所以要向Linux內(nèi)核注冊(cè)MCP2515設(shè)備,注冊(cè)代碼如圖4所示,。
圖4 MCP2515 SPI 注冊(cè)代碼
注冊(cè)完成,,執(zhí)行make menuconfig配置內(nèi)核選項(xiàng),。
1 [*]Networking support->
2 <*>CAN bus subsystem support->
3 <*>Raw CAN Protocal
4 <*>Broadcast Manage CAN Protocal
5 CAN Device Drivers->
6 <*>Platform CAN driver with Netlink support
7 [*]CAN bit-timing calculation
8 <*>Microchip MCP251x SPI CAN controllers
9
10 Device drivers->
11 [*]SPI support ->
12 <*> Samsung S3C2416 series type SPI
編譯內(nèi)核,內(nèi)核啟動(dòng)如圖5顯示即說(shuō)明MCP2515驅(qū)動(dòng)加載成功,。
圖 5 內(nèi)核加載提示
6.Socket CAN測(cè)試
因?yàn)樽钚掳鍮usyBox對(duì)Socket CAN的不支持,,所以為了測(cè)試和使用Socket CAN,我們需要自己編譯Socket CAN的工具,。這里介紹兩個(gè)工具,,分別是iproute2 和 canutils。
6.1 iproute2
(1)下載iproute2的最新源碼http://www.kernel.org/pub/linux/utils/net/iproute2/ ,。筆者下載的是iproute2 3.6.0,。
(2)解壓iproute2-3.6.0.tar.xz,修改Makefile第33行,。
33 #CC = gcc
34 CC = arm-none-linux-gnueabi-gcc
(3)因?yàn)槲覀冎恍枰猧prout2的ip命令,,所以修改Makefile的第42行。
42 #SUBDIRS=lib ip tc bridge misc netem genl man
43 SUBDIRS=lib ip
(4)修改完成執(zhí)行make命令,,生成ip命令,,拷貝到開(kāi)發(fā)板文件系統(tǒng)目錄。
(5)使用ip命令,。
ifconfig can0 down //關(guān)閉can0,,以便配置
./ip link set can0 up type can bitrate 250000 //設(shè)置can0波特率
./ip -details link show can0 //顯示can0信息
圖6 iproute 使用簡(jiǎn)介
6.2 canutils
Canutils是基于GNU GPLv2許可的開(kāi)源代碼,包括canconfig,、canecho,、cansend、candump,、cansequence五個(gè)工具,,用于檢測(cè)和監(jiān)控Socket CAN接口。
(1)下載canutils的最新源碼http://www.pengutronix.de/software/socket-can/download/canutils ,。筆者下載的是canutils 4.0.6,。
(2)因?yàn)閏anutils編譯需要libsocketcan庫(kù)的支持,需要下載libsocketcan,。
http://www.pengutronix.de/software/libsocketcan/download/
筆者下載的是libsocketcan 0.0.9,。
(3)解壓libsocketcan-0.0.9.tar.bz2。執(zhí)行configure命令,。(其中--host是指定交叉工具鏈,,--prefix是指定庫(kù)的生成位置)
./configure --host=arm-none-linux-gnueabi --prefix=/home/linux/workdir/can/tools/libsocketcan
(4)執(zhí)行make編譯庫(kù);
(5)執(zhí)行make install 生成庫(kù),。至此,,libsocketcan編譯完畢,。
(6)解壓canutils-4.0.6.tar.bz2,,執(zhí)行configure命令,。(其中--host是指定交叉工具鏈,--
prefix是指定庫(kù)的生成位置,,libsocketcan_LIBS是指定canconfig需要鏈接的庫(kù),,LDFLAGS是指定外部庫(kù)的路
徑,CPPFLAGS是指定外部頭文件的路徑)
./configure --host=arm-none-linux-gnueabi
--prefix=/home/linux/workdir/can/tools/canutils
libsocketcan_LIBS=-lsocketcan
LDFLAGS=-L/home/linux/workdir/can/tools/socketcan/lib
CPPFLAGS=-I/home/linux/workdir/can/tools/socketcan/include
(7)修改完成執(zhí)行make命令,,生成四個(gè)目錄,,分別拷貝到開(kāi)發(fā)板文件系統(tǒng)的相應(yīng)目錄。
(8)使用canutils工具,。(可以使用[命令 + --help]的方式來(lái)查看命令的詳細(xì)用法,,下面只介紹一些常用的指令)
① 配置CAN的總線(xiàn)通訊波特率:
canconfig canX bitrate + 波特率
圖7 使用canutils 工具設(shè)置CAN總線(xiàn)波特率
② 開(kāi)啟 / 重啟 / 關(guān)閉CAN總線(xiàn)
canconfig canX start
canconfig canX restart
canconfig canX stop
圖8 設(shè)置CAN總線(xiàn)狀態(tài)
③ 查看CAN總線(xiàn)狀態(tài)
canecho canX
圖9 查看CAN總線(xiàn)狀態(tài)
④ 發(fā)送信息
cansend canX –-identifier=ID + 數(shù)據(jù)
圖10 CAN總線(xiàn)發(fā)送數(shù)據(jù)
⑤ 接收數(shù)據(jù)
candump canX
圖11 CAN總線(xiàn)接收數(shù)據(jù)
⑥ 使用濾波器接收ID匹配的數(shù)據(jù)
candump canX –-filter=ID:mask
圖12 CAN總線(xiàn)使用濾波器接收匹配數(shù)據(jù)
7.總結(jié)
至此,使用Socket方式的MCP2515 CAN總線(xiàn)驅(qū)動(dòng)設(shè)計(jì)的就介紹完了,,用戶(hù)可以使用Socket套接字的方式,,參照canutils的源碼設(shè)計(jì)自己的應(yīng)用程序。