1、写在前面
树莓派没有CAN通讯能力,但有mcp2515模块的驱动,可以通过树莓派的SPI控制mcp2515进行CAN通讯。
硬件:树莓派4B + 32G 内存 (Ubuntu22.04系统)+ MCP2515模块
参考教程:注意网络上大部分教程都是树莓派官方系统Raspberry Pi OS(下面三个都是),可以看一下流程知道大概需要什么步骤
树莓派4b+mcp2515实现CAN总线通讯和系统编程(一.配置树莓派CAN总线接口)_树莓派 can-CSDN博客https://blog.csdn.net/weixin_42968757/article/details/127774345#:~:text=%E6%A0%91%E8%8E%93%E6%B4%BE%E6%9C%AC%E8%BA%AB%E6%98%AF%E6%B2%A1%E6%9C%89CAN%E9%80%9A%E8%AE%AF%E8%83%BD%E5%8A%9B%E7%9A%84%EF%BC%8C%E4%BD%86%E4%BB%96%E6%9C%89mcp2515%E6%A8%A1%E5%9D%97%E7%9A%84%E9%A9%B1%E5%8A%A8%EF%BC%8C%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87SPI%E6%9D%A5%E6%8E%A7%E5%88%B6mcp2515%E8%BF%9B%E8%A1%8CCAN%E7%9A%84%E9%80%9A%E8%AE%AF%E3%80%82,%E6%9C%AC%E7%AB%A0%E4%B8%BB%E8%A6%81%E8%AE%B2%2C%E5%A6%82%E4%BD%95%E4%BD%BF%E8%83%BD%E6%A0%91%E8%8E%93%E6%B4%BE%E7%9A%84mcp2515%E9%A9%B1%E5%8A%A8%EF%BC%8C%E7%84%B6%E5%90%8E%E7%94%A8can-utils%E7%9A%84%E5%B7%A5%E5%85%B7%E6%9D%A5%E6%B5%8B%E8%AF%95CAN%E7%9A%84%E9%80%9A%E8%AE%AF%E3%80%82%20%E6%A0%91%E8%8E%93%E6%B4%BE%E5%92%8Cmcp2515%E6%A8%A1%E5%9D%97%E6%98%AF%E9%80%9A%E8%BF%87spi%E8%BF%9B%E8%A1%8C%E9%80%9A%E8%AE%AF%E7%9A%84%EF%BC%8C%E9%99%A4%E4%BA%86spi%E7%9A%844%E6%A0%B9%E7%BA%BFmosi%E3%80%81miso%E3%80%81sck%E3%80%81cs%EF%BC%8C%E5%92%8C%E7%94%B5%E6%BA%90%E7%9A%84vcc%E5%92%8Cgnd%EF%BC%8C%E6%88%91%E4%BB%AC%E8%BF%98%E9%9C%80%E8%A6%81%E8%BF%9E%E6%8E%A5MCP2515%E7%9A%84INT%E5%BC%95%E8%84%9A%E3%80%82在树莓派上使用基于MCP2515的CAN总线模块_树莓派 spi转can-CSDN博客
https://blog.csdn.net/chilinghuoyu/article/details/108305609?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-2-108305609-blog-127774345.235%5Ev43%5Epc_blog_bottom_relevance_base4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-2-108305609-blog-127774345.235%5Ev43%5Epc_blog_bottom_relevance_base4&utm_relevant_index=5
如果跟我一样是Ubuntu22.04系统,按照上面的教程不会产生net文件,也没有can0,Ubuntu系统参考下面链接
树莓派+MCP2515+总线工具完成can报文收发 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/611724997
2、加载MCP2515内核驱动,驱动默认在linux内核中
加载MCP2515驱动,使用如下命令:
sudo modprobe mcp251x
进入nano模式准备修改配置文件:
sudo nano /boot/firmware/config.txt #(ubuntu是这个,raspiberrypi是/boot/config)
默认开启了spi接口,我们需要加两条命令映射mcp2515到can0,配置相关参数。
我的mcp2515 控制器的晶振频率为8 MHz(外观能看到),MCP2515 控制器使用 GPIO25 作为中断引脚。
dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=25
加完以后就是下面这个样子(最后一行是加的内容,我用的MobaXterm远程):
配置完成后重启,命令如下:
sudo reboot
查看can0是否加载,命令:
ifconfig -a
结果如下:
查看mcp2515是否成功加载:
3、开启/关闭CAN口
开启can0,设置速度传输速率,命令如下:
sudo ip link set can0 type can bitrate 500000 loopback on #设置can0网卡波特率250k,回环模式
sudo ip link set can0 up #开启can0网卡
提示:我一开始没有设置环回模式,测试收发就总是收不到,后面关闭can0,重新打开并设置回环模式才能自发自收
bitrate 500000:比特率设置为500k,在这里比特率是波特率的两倍,所以波特率为250k
loopback on : 将MCP2515的工作模式设置为环回模式
环回模式允许器件内部的发送缓冲器和接收缓冲器之间进行报文的自发自收,而无需通过CAN 总线。此模式可用于系统开发和测试。环回模式下,确认位ACK 无效,器件接收自己发送的报文就象在接收来自其他节点的报文。环回模式是一种安静模式,即器件在此模式下不会发送任何报文(包括错误标志或确认信号)。该模式下TXCAN 引脚处于隐性状态。
这时再次查看网络属性,发现can0网卡状态变成了up和running
查看can0状态使用命令:
ifconfig can0
查看can0配置信息使用命令:
sudo ip -details -statistics link show can0
如果需要修改参数配置,需要先关闭can口,命令:
sudo ip link set can0 down
开启can口只在当前会话生效,设备重启需要重新输入,想要开机自动挂载can口,可在系统的配置文件/etc/network/interfaces添加如下内容,我没有在系统更改配置,我准备在项目文件中开启can口:
auto can0
iface can0 can
bitrate 500000
使用下面命令进入nano模式增加即可:
sudo nano /etc/network/interfaces
4、测试CAN口收发数据
1、安装SocketCAN工具CAN-utils:
2、发送和接收
开启两个终端,可以用vs code开两个终端,或者用MobaXterm和Putty开两个终端都行(图中是左边是MobaXterm(发送),右边是Putty(接收))。
在终端中输入 candump can0
,开启接收can总线的信息。
新建一个终端,输入 cansend can0 123#1122334455667788
,往can总线上发送,can ID为0x123,数据为1122334455667788的报文。