本文主要记录使用树莓派4B,通过外接MCP2515模块来实现CAN通信,使用基于Can-utils实现CAN消息的收发。
准备工作:
接下来就是硬件部分,接线完成:
![](https://img-blog.csdnimg.cn/8c58d389f6d84bc88795526a7c710824.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yR5LiA5Liq5ZCnKCpeX14qKQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
买的MCP2515模块附带的原理图:
![](https://img-blog.csdnimg.cn/e9106204995a4b9682d5def601686be4.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yR5LiA5Liq5ZCnKCpeX14qKQ==,size_15,color_FFFFFF,t_70,g_se,x_16)
树莓派与MCP2515模块的接线:
![](https://img-blog.csdnimg.cn/c1334243c8164d41ac4974f5cdf40856.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yR5LiA5Liq5ZCnKCpeX14qKQ==,size_10,color_FFFFFF,t_70,g_se,x_16)
树莓派的引脚图,引自pinout.xyz:
![](https://img-blog.csdnimg.cn/abe3f97db4c947b0b3e839e6d80260f6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yR5LiA5Liq5ZCnKCpeX14qKQ==,size_14,color_FFFFFF,t_70,g_se,x_16)
线接好后按着参考一步一步走,先敲命令,在/boot/config.txt末行加入:
pi@raspberrypi:~ $ sudo nano /boot/config.txt
dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi1-1cs
然后保存配置重启:
sudo reboot
ls /sys/bus/spi/devices/spi0.0/net
dmesg | grep -i '\(can\|spi\)'
得到结果:
![](https://img-blog.csdnimg.cn/dc85ca68157442a3b890aae3eaa7038e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yR5LiA5Liq5ZCnKCpeX14qKQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
表示MCP2515已经加载成功。
接下来,设置环回模式,设置回环 波特率 250K ,用于测试can通路,在没有其它硬件连接测试的情况下,自发自收:
sudo ip link set can0 type can bitrate 500000 loopback on
# 开启can0
sudo ip link set can0 up
但是收发不了数据,启动还会把系统卡死。反复重试,反复卡死。。。
开始调试:
- 排除接线接错
- 换了一个全新的模块,发现结果还是一样
- 通过上面的操作,大概率是配置有问题
于是开始查配置的参数说明,发现这篇里面说的很详细,并指出原来配置中存在的问题,讲的很详细,我就不重复了:
- 打开spi总线,树莓派与MCP2515之前通过spi通信,然后再转成can协议在spi0.0上配置
- MCP2515 CAN控制器,CAN控制器的晶振频率是16MHz,INT脚接到了gpio25
- 原来配置是spi1-1cs,但我们用的是spi0,应该要改为dtoverlay=spi0-1cs,cs0_pin=8
于是我改好配置后,结果还是收发不了数据,启动还会把系统卡死。反复重试,反复卡死。。。
查看树莓派的引脚,如果不行,参考这篇:
![](https://img-blog.csdnimg.cn/8afb908372a64250866e02792288ecb5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yR5LiA5Liq5ZCnKCpeX14qKQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
后面又看到一篇,较之前相比配置做了一些改动,给出我的配置:
dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=25,spimaxfrequency=10000000
dtoverlay=spi-bcm2835-overlay
再次sudo reboot,设置环回模式并开启can0,输入sudo ip -s -d link show can0查看can0通讯状态:
![](https://img-blog.csdnimg.cn/a1394e3cc2794490b4042a580bb3af34.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yR5LiA5Liq5ZCnKCpeX14qKQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
这次竟能启动成功,还没有把系统搞崩,于是测试收发can消息
安装 SocketCAN工具 Can-utils :
sudo apt-get install can-utils
使用cansend发送单条CAN消息:
cansend can0 123#AABBCCDDEEFF
开一个新终端,接收消息:
candump can0
结果:
![](https://img-blog.csdnimg.cn/6b39b6efb91e40659ce5f67c2987e489.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yR5LiA5Liq5ZCnKCpeX14qKQ==,size_14,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/927c7725e8d64b96b765b2f68806f889.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yR5LiA5Liq5ZCnKCpeX14qKQ==,size_11,color_FFFFFF,t_70,g_se,x_16)
使用cangen发送随机CAN消息:
cangen can0
发送:
![](https://img-blog.csdnimg.cn/b26cc01a1821492189fc643e5f6ffdaa.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yR5LiA5Liq5ZCnKCpeX14qKQ==,size_13,color_FFFFFF,t_70,g_se,x_16)
接收:
![](https://img-blog.csdnimg.cn/cb831211f19e4e3ea3014ca9a4402753.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yR5LiA5Liq5ZCnKCpeX14qKQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
终于打通啦!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)