树莓派4使用MCP2515模块CAN通信

树莓派4使用MCP2515模块CAN通信_第1张图片
在开始之前,硬件方面你需要一块树莓派4,MCP2515模块和一个CAN分析仪。

我这里的MCP2515模块的晶振为8M的

树莓派4内核为:

pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux

树莓派与MCP2515模块的连接方式为:

PIN Pi  ----------------> MCP2515 
#02 5V -----------------> VCC
#06 GND ----------------> GND
#24 (SPI_CE0)GPIO08 ----> CS
#21 (SPI_MISO)GPIO09 ---> SO
#19 (SPI_MOSI)GPIO10 ---> SI
#23 (SPI_CLK)GPIO11 ----> SCK
#22 (GPIO_GEN6)GPIO25 --> INT

硬件工作准备好后,就让我们开始吧~!
1、首先,你要打开你的树莓派SPI功能,可以通过编辑/boot/config.txt文件来实现:

pi@raspberrypi:~ $ sudo vi /boot/config.txt

在config.txt文件中找到dtparam=spi=on,把它前面的#号去掉,也就是取消这一行的注释。然后在下面新起一行,加入下面的语句:

dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=25 dtoverlay=spi-bcm2835

这一步做完以后,你的config.txt文件可能看起来是这样的:
2020-01-01-045440_1024x600_scrot.png

2、安装CAN tools:

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

安装好之后重启树莓派。

3、看看你的SPI设备中,是否有CAN接口:

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

如果你做完第2步后,成功在/net/目录下有can0这个文件夹,那就说明你的CAN的收发功能能够正常使用。

4、设置你的CAN通信接口:

pi@raspberrypi:~ $ sudo ip link set can0 up type can bitrate 125000

5、向CAN分析仪发送一些数据
首先把MCP2515模块和CAN分析仪连接到一起,再把分析仪连上电脑,打开分析仪专用软件USB_CAN_Tool.exe,打开CAN接收,启动设备:

树莓派4使用MCP2515模块CAN通信_第2张图片

这里CAN参数的波特率设置为125k。

在树莓派终端向CAN分析仪发送一些数据:

pi@raspberrypi:~ $ cansend can0 123#6666666666666666

树莓派4使用MCP2515模块CAN通信_第3张图片

可以在USB_CAN_Tool中看到树莓派发送过来的数据:

树莓派4使用MCP2515模块CAN通信_第4张图片

6、向树莓派发送一些数据
首先,我们要让树莓派准备好接收CAN数据,在终端输入:

pi@raspberrypi:~ $ candump can0

树莓派会进入接收数据的模式,我们用USB_CAN_Tool发送一个ID为0x0100,数据位为99 99 99 99 99 99 99 99的数据,如下图:

树莓派4使用MCP2515模块CAN通信_第5张图片

点击发送消息后,在树莓派终端可以看到接收到的数据:

树莓派4使用MCP2515模块CAN通信_第6张图片

按下Ctrl+C即可退出接收模式。

7、关闭CAN接口

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

进阶

怎么样才能在树莓派保存接收过来的CAN数据呢?
比如说把接收过来的CAN数据保存在本地txt文件,或者将CAN数据在IDE中的控制台中显示(print出来),而不是在树莓派终端显示。

我这里用树莓派自带的Thonny IDE来演示把树莓派接收到的数据,打印在控制台上。
首先,需要你在终端设置好CAN通信接口,也就是第4步骤。
然后,打开Thonny,输入以下python程序:

import subprocess
p = subprocess.Popen('candump can0',shell=True,stdout=subprocess.PIPE)
for i in iter(p.stdout.readline,'b'):
    if not i:
        break
    print(i.decode('gbk'))

运行,
然后你就可以用USB_CAN_Tool向树莓派发CAN数据啦!而且这些数据是实时的,也就是说你可以一直向树莓派发数据,而Thonny的控制台也会持续显示接收到的数据。

树莓派4使用MCP2515模块CAN通信_第7张图片

如果你想保存数据到本地或者另作他用,只需要更改一点程序就行了,这里就不赘述了。

相关资料传送门:
CAN bus on raspberry pi with MCP2515

以上。

你可能感兴趣的:(嵌入式,嵌入式编程,raspberry-pi)