在树莓派上使用基于MCP2515的CAN总线模块

本文介绍如何在树莓派上配置CAN总线模块MCP2515,并使用基于SocketCAN的工具Can-utils实现CAN消息的收发。

MCP2515概述:

Microchip 的MCP2515 是一款独立控制器局域网络(Controller Area Network, CAN)协议控制器,完全支持CAN V2.0B 技术规范。
该器件主要由三个部分组成:
1. CAN 模块,包括CAN 协议引擎、验收滤波寄存
器、验收屏蔽寄存器、发送和接收缓冲器。
2. 用于配置该器件及其运行的控制逻辑和寄存器。
3. SPI 协议模块。

MCP2515芯片结构框图

图片和芯片概述引自MCP2515参考手册

获取硬件

淘宝上有许多商家在售MCP2515 SPI转CAN的控制器通信模块,并且这些模块大都集成了CAN收发器。这些模块可能看起来样式不同,但是基本的针脚接法是一致的。

模块结构图

模块电路图

图片引自某淘宝卖家

接线

RPi Pin    RPi Label     CAN Module
02---------5V------------VCC
06---------GND-----------GND
19---------GPIO10--------MOSI (SI)
21---------GPIO9---------MISO (SO)
22---------GPIO25--------INT
23---------GPIO11--------SCK
24---------GPIO8---------CS

树莓派引脚图,引自pinout.xyz

使能树莓派SPI并加载MCP2515内核驱动

为了激活MCP2515的驱动,需要在文件/boot/config.txt加如下几行:

dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi1-1cs

如果内核是4.4.x之前的版本,需要修改最后一行:

dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi-bcm2835-overlay

可以通过uname -a查看树莓派内核:

MCP2515 device tree overlay的具体参数说明请参考/boot/overlays/README

Name:   mcp2515-can0
Info:   Configures the MCP2515 CAN controller on spi0.0
Load:   dtoverlay=mcp2515-can0,<param>=<val>
Params: oscillator              Clock frequency for the CAN controller (Hz)

        spimaxfrequency         Maximum SPI frequence (Hz)

        interrupt               GPIO for interrupt signa

修改配置后重启树莓派查看MCP2515是否加载成功:

pi@piv2:~ $ ls /sys/bus/spi/devices/spi0.0/net
can0

看到can0说明已经加载成功

启动CAN接口

使用ip link命令启动can接口:

pi@raspberrypi:~ $ sudo ip link set can0 up type can bitrate 500000 loopback on

bitrate 500000:比特率设置为500k,在这里比特率是波特率的两倍,所以波特率为250k

loopback on : 将MCP2515的工作模式设置为环回模式

10.4 环回模式
环回模式允许器件内部的发送缓冲器和接收缓冲器之间进行报文的自发自收,而无需通过CAN 总线。此模式可用于系统开发和测试。环回模式下,确认位ACK 无效,器件接收自己发送的报文就象在接收来自其他节点的报文。环回模式是一种安静模式,即器件在此模式下不会发送任何报文(包括错误标志或确认信号)。该模式下TXCAN 引脚处于隐性状态。

引自MCP2515中文手册。

启动成功后可以通过ifconfig can查看can0信息:

pi@raspberrypi:~ $ ifconfig can0
can0: flags=193<UP,RUNNING,NOARP>  mtu 16
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)
        RX packets 23  bytes 52 (52.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 23  bytes 52 (52.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

如果需要修改参数配置,需要先关闭can接口:

pi@raspberrypi:~ $ sudo ip link set can0 down

可以通过help查看支持的配置参数:

pi@raspberrypi:~ $ ip link set can0 type can help
Usage: ip link set DEVICE type can
        [ bitrate BITRATE [ sample-point SAMPLE-POINT] ] |
        [ tq TQ prop-seg PROP_SEG phase-seg1 PHASE-SEG1
          phase-seg2 PHASE-SEG2 [ sjw SJW ] ]

        [ dbitrate BITRATE [ dsample-point SAMPLE-POINT] ] |
        [ dtq TQ dprop-seg PROP_SEG dphase-seg1 PHASE-SEG1
          dphase-seg2 PHASE-SEG2 [ dsjw SJW ] ]

        [ loopback { on | off } ]
        [ listen-only { on | off } ]
        [ triple-sampling { on | off } ]
        [ one-shot { on | off } ]
        [ berr-reporting { on | off } ]
        [ fd { on | off } ]
        [ fd-non-iso { on | off } ]
        [ presume-ack { on | off } ]

        [ restart-ms TIME-MS ]
        [ restart ]

        [ termination { 0..65535 } ]

        Where: BITRATE  := { 1..1000000 }
                  SAMPLE-POINT  := { 0.000..0.999 }
                  TQ            := { NUMBER }
                  PROP-SEG      := { 1..8 }
                  PHASE-SEG1    := { 1..8 }
                  PHASE-SEG2    := { 1..8 }
                  SJW           := { 1..4 }
                  RESTART-MS    := { 0 | NUMBER }

如果想要开机自动挂载CAN接口,在/etc/network/interfaces添加:

auto can0
iface can0 can static
    bitrate 500000 

测试收发CAN消息

安装 SocketCAN工具 Can-utils

pi@raspberrypi:~ $ sudo apt-get install can-utils

使用cansend发送单条CAN消息:

pi@raspberrypi:~ $ cansend can0 123#AABBCCDDEEFF

使用cangen发送随机CAN消息:

pi@raspberrypi:~ $ candump can0

使用Python库收发CAN消息

python-can :为不同的can控制器硬件设备提供通用的接口和一系列的消息收发工具。

cantools : CAN数据库解析,CAN消息、诊断DID编解码,candump输出解码。

使用cantools对candump输出解码:

0x123在数据库DBC中的定义:

CAN相关文章:

DBC文件格式解析

CANoe精选教程 | 自动化测试功能-Test Module/Test Unit

不同格式CAN 数据库(DBC、Excel、arxml等)相互转化

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值