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