基于MCP2515的Linux CAN總線驅(qū)動(dòng)程序設(shè)計(jì)
圖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總線。
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
5CAN Device Drivers->
6<*>Platform CAN driver with Netlink support
7[*]CAN bit-timing calculation
8<*>Microchip MCP251x SPI CAN controllers
9
10Device 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命令,拷貝到開發(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許可的開源代碼,包括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è)目錄,分別拷貝到開發(fā)板文件系統(tǒng)的相應(yīng)目錄。
(8)使用canutils工具。(可以使用[命令 + --help]的方式來(lái)查看命令的詳細(xì)用法,下面只介紹一些常用的指令)
評(píng)論