基于MCP2515的Linux CAN总线驱动程序设计

简介: <p class="grey" style="color:rgb(102,102,102); line-height:24px; text-indent:28px"> <strong>MCP2515简介</strong></p> <p class="grey" style="color:rgb(102,102,102); line-height:24px; text-indent:28

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℃。

MCP2515 Socket CAN驱动实现

内核中为MCP2515提供了Socket CAN驱动程序,我们只需为MCP2515芯片配置内核选项就可以使用Socket编程的方式使用MCP2515 CAN总线。

Socket CAN介绍

Socket CAN是在Linux下CAN协议实现的一种实现方法。Linux下最早使用CAN的方法是基于字符设备来实现的,与之不同的是Socket CAN使用伯克利的Socket接口和Linux网络协议栈,这种方法使得CAN设备驱动可以通过网络接口来调用。Socket CAN的接口被设计的尽量接近TCP/IP的协议,让那些熟悉网络编程的程序员能够比较容易的学习和使用。

向Linux内核注册MCP2515驱动

向Linux内核添加SPI驱动在之前的文章已经有详细的介绍,根据硬件原理图图3所示,MCP2515挂在SPI0上,使用中断GPF1,所以要向Linux内核注册MCP2515设备,


注册完成,执行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

编译内核,内核启动如图显示即说明MCP2515驱动加载成功。


Socket CAN测试

因为最新版BusyBox对Socket CAN的不支持,所以为了测试和使用Socket CAN,我们需要自己编译Socket CAN的工具。这里介绍两个工具,分别是iproute2 和 canutils。

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信息


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 + 波特率


② 开启 / 重启 / 关闭CAN总线
        canconfig canX start
        canconfig canX restart
        canconfig canX stop


③ 查看CAN总线状态
        canecho canX


④ 发送信息
        cansend canX –-identifier=ID + 数据


⑤ 接收数据
        candump canX


⑥ 使用滤波器接收ID匹配的数据
        candump canX –-filter=ID:mask





目录
相关文章
|
1月前
|
Linux Android开发
嵌入式linux中Framebuffer 驱动程序框架分析
嵌入式linux中Framebuffer 驱动程序框架分析
27 0
|
1月前
|
Linux C语言 SoC
嵌入式linux总线设备驱动模型分析
嵌入式linux总线设备驱动模型分析
32 1
|
1月前
|
存储 缓存 Linux
探秘Linux块设备驱动程序:成为内核开发大师的第一步
探秘Linux块设备驱动程序:成为内核开发大师的第一步
92 0
|
1月前
|
Linux 编译器 测试技术
探索Linux设备树:硬件描述与驱动程序的桥梁
探索Linux设备树:硬件描述与驱动程序的桥梁
62 0
|
1月前
|
存储 缓存 安全
掌握Linux字符设备驱动程序的核心要点
掌握Linux字符设备驱动程序的核心要点
58 0
|
2月前
|
Linux
Linux 驱动开发基础知识——总线设备驱动模型(八)
Linux 驱动开发基础知识——总线设备驱动模型(八)
40 0
Linux 驱动开发基础知识——总线设备驱动模型(八)
|
2月前
|
Linux
Linux 驱动开发基础知识——总线设备驱动模型(七)
Linux 驱动开发基础知识——总线设备驱动模型(七)
50 0
Linux 驱动开发基础知识——总线设备驱动模型(七)
|
2月前
|
Linux 编译器 芯片
Linux 驱动开发基础知识—— 具体单板的 LED 驱动程序(五)
Linux 驱动开发基础知识—— 具体单板的 LED 驱动程序(五)
50 0
Linux 驱动开发基础知识—— 具体单板的 LED 驱动程序(五)
|
2月前
|
Linux
Linux 驱动开发基础知识—— LED 驱动程序框架(四)
Linux 驱动开发基础知识—— LED 驱动程序框架(四)
57 0
Linux 驱动开发基础知识—— LED 驱动程序框架(四)
|
Linux
手把手教你写第一个Linux驱动程序
说到写第一个linux内核驱动程序,再简单不过了。以前也写过,这次将做一个图形化的整理。 我这里以我的开发环境tiny4412为主,我将在这上面写第一个驱动程序。 首先,我在driver/目录下创建yangyx目录, 在目录下新建一个hello.c和一个Makefile hello.c内容如下: hello.c包含的头文件就类似咱们写标准C一样的头文件。
1204 0