您的位置:首页 > 运维架构 > Linux

socket can

2017-01-22 00:00 246 查看
基于MCP2515的Linux CAN总线驱动程序设计(一)

转自:http://www.embedu.org/Column/Column596.htm

作者:李老师,华清远见嵌入式学院讲师。

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的源码设计自己的应用程序。

-----------------------------------------2014年11月30日10:38:07: 编译的步骤:

1, 鼠标右键解压iproute2-3.6.0.tar.xz,修改Makefile中的
#CC = gcc
为==> CC = arm-none-linux-gnueabi-gcc
修改Makefile中的
#SUBDIRS=lib ip tc bridge misc netem genl man
为==> SUBDIRS=lib ip
然后执行make命令,生成ip命令,拷贝到开发板文件系统目录。

2,解压libsocketcan-0.0.9.tar.bz2。执行configure命令
./configure --host=arm-none-linux-gnueabi --prefix=/home/sno/pv210_xi_an/can/tools/libsocketcan
make; make install;

3,解压canutils-4.0.6.tar.bz2; tar jxvf canutils-4.0.6.tar.bz2;
./configure --host=arm-none-linux-gnueabi --prefix=/home/sno/pv210_xi_an/can/tools/canutils libsocketcan_LIBS=-lsocketcan LDFLAGS=-L/home/sno/pv210_xi_an/can/tools/libsocketcan/lib libsocketcan_CFLAGS=-I/home/sno/pv210_xi_an/can/tools/libsocketcan/include CFLAGS=-I/home/sno/pv210_xi_an/can/tools/libsocketcan/include

make;make install

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

[root@GEC210 sno]# ./ip link set can0 up type can bitrate 250000

<6>mcp251x spi1.0: CNF: 0x01 0xb5 0x01
[ 201.172925] mcp251x spi1.0: CNF: 0x01 0xb5 0x01
[root@GEC210 sno]# ./ip -details link show can0
2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEF
AULT qlen 10
link/can
can state ERROR-ACTIVE restart-ms 0
bitrate 250000 sample-point 0.875
tq 250 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1
mcp251x: tseg1 3..16 tseg2 2..8 sjw 1..4 brp 1..64 brp-inc 1
clock 8000000
[root@GEC210 sno]# canconfig can0 bitrate 500000
RTNETLINK answers: Device or resource busy
failed to set bitrate of can0 to 500000
[root@GEC210 sno]#
[root@GEC210 sno]# sync
<7>save exit: isCheckpointed 1
[root@GEC210 sno]# canconfig can0 bitrate 500000
RTNETLINK answers: Device or resource busy
failed to set bitrate of can0 to 500000
[root@GEC210 sno]# sleep 1
[root@GEC210 sno]# canconfig can0 bitrate 500000
RTNETLINK answers: Device or resource busy
failed to set bitrate of can0 to 500000
[root@GEC210 sno]# canconfig can0 start
can0 state: ERROR-ACTIVE
[root@GEC210 sno]# canconfig can0 restart
Device is not in BUS_OFF, no use to restart
can0: failed to restart
[root@GEC210 sno]# canconfig can0 stop
can0 state: STOPPED &nb
4000
sp;
[root@GEC210 sno]# canecho can0
interface-in = can0, interface-out = can0, family = 29, type = 3, proto = 1
read: Network is down
[root@GEC210 sno]# cansend can0 --identifier=0x123 0x12
interface = can0, family = 29, type = 3, proto = 1
write: Network is down
[root@GEC210 sno]# ifconfig can0 up
<6>mcp251x spi1.0: CNF: 0x01 0xb5 0x01
[ 346.817252] mcp251x spi1.0: CNF: 0x01 0xb5 0x01
[root@GEC210 sno]# cansend can0 --identifier=0x123 0x12
interface = can0, family = 29, type = 3, proto = 1
[root@GEC210 sno]# candump can0
interface = can0, family = 29, type = 3, proto = 1
^C
[root@GEC210 sno]#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  can socket socketcan linux