设为首页 收藏本站
查看: 749|回复: 0

[经验分享] 基于MCP2515的Linux CAN总线驱动程序设计(一)

[复制链接]

尚未签到

发表于 2015-12-11 09:27:25 | 显示全部楼层 |阅读模式


1.前言
CAN(Controller Area Network)总线,即控制器局域网总线,是一种有效支持分布式控制或实时控制的串行通信网络。由于其高性能、高可靠性、及独特的设计和适宜的价格而广泛应用于工业现场控制、智能楼宇、医疗器械、交通工具以及传感器等领域,并已被公认为几种最有前途的现场总线之一。CAN总线规范已经被国际标准化组织制订为国际标准ISO11898,并得到了众多半导体器件厂商的支持。
本文使用华清远见FS2416平台。FS2416使用Socket网络设备驱动和字符设备驱动两种方式向Linux内核提供MCP2515的驱动,本文详细介绍了使用Socket方式设计的基于MCP2515的Linux CAN总线驱动程序。
2.FS2416简介
DSC0000.jpg
图1 FS2416开发板

FS2416采用的是三星公司的ARM926EJ内核CPU S3C2416,无论从性能上,还是成本上, S3C2416都强于2440,是2440的最完美替代者。
作为32/16 bit RISC指令集、低成本、低功耗、高性能的微处理器。S3C2416使用了65nm的制作工艺从而降低成本、功耗及提高性能,其使用的ARM926EJ的核心,集成了2D图形加速,添加了低功耗模式,支持内部ROM/RAM引导,支持moviNand启动和低功耗音频编解码。此外相对于其他ARM9芯片,它的外设也得到了升级,有更多的资源。
DSC0001.jpg
图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就是与其配套的收发器。
DSC0002.jpg
图3 MCP2515硬件连接图

5.MCP2515 Socket CAN驱动实现
FS2416平台使用Linux2.6.39的内核,内核中为MCP2515提供了Socket CAN驱动程序,我们只需为MCP2515芯片配置内核选项就可以使用Socket编程的方式使用MCP2515 CAN总线。
5.1Socket 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所示。
DSC0003.jpg
图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驱动加载成功。
    DSC0004.jpg
    图 5 内核加载提示

    6.Socket CAN测试
    因为最新版BusyBox对Socket CAN的不支持,所以为了测试和使用Socket CAN,我们需要自己编译Socket CAN的工具。这里介绍两个工具,分别是iproute2 和 canutils。
    6.1iproute2
    (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信息

    DSC0005.jpg
    图6 iproute 使用简介

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

    DSC0006.jpg
    图7 使用canutils 工具设置CAN总线波特率

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

    DSC0007.jpg
    图8 设置CAN总线状态

    ③ 查看CAN总线状态
            canecho canX

    DSC0008.jpg
    图9 查看CAN总线状态

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

    DSC0009.jpg
    图10 CAN总线发送数据

    ⑤ 接收数据
            candump canX

    DSC00010.jpg
    图11 CAN总线接收数据

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

    DSC00011.jpg
    图12 CAN总线使用滤波器接收匹配数据

    7.总结
    至此,使用Socket方式的MCP2515 CAN总线驱动设计的就介绍完了,用户可以使用Socket套接字的方式,参照canutils的源码设计自己的应用程序。
    下一篇文章将会详细介绍使用SPI子系统的方式,设计MCP2515 CAN总线的字符设备驱动的方法。

  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-149512-1-1.html 上篇帖子: * Linux内核源码分析--内核启动之(2)Image内核启动(汇编部分)(Linux-3.0 ARMv7) 下篇帖子: linux内核栈与用户栈(转)
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表