在树莓派上使用CAN_BUS(即CAN总线技术)来控制小物件对我来说很外行,概念也不深,只能按照小物件的说明来使用,但是使用之前需要进行与树莓派的连接,折腾了好多,这里简单做个梳理,但不过多介绍….因为自己对CAN协议也是一窍不通,囧~
我之前的完成过程基本依靠Google,贴上我参考的国外教程:
1. 硬件相关问题
关于MCP2515 SPI转CAN的芯片,可能有多个“款式”的存在(有些教程里的跟我的芯片不一样),但是必要的针脚的插法都是一致的。1
2
3
4
5
6
7
8RPi 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其他没什么的说的,在肯定自己接线没错误之后,我们需要怀疑芯片是不是坏的,我试的时候前面两个都是坏的,导致挂不上去
2. 配置树莓派
编辑/boot/config.txt并添加以下行,将振荡器参数设置为模块上存在的振荡器参数。大多数模块使用16MHz振荡器作为时钟,但也有使用8MHz(即oscillator=8000000)。你可以通过查看芯片来确定频率。1
2
3dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi-bcm2835-overlay
通过uname -a查看树莓派内核,如果内核为4.4.x,则需要将最后一行配置修改:1
2
3dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi1-1cs
3. 挂载CAN设备1
2
3sudo apt-get update
sudo apt-get install can-utils
sudo reboot
等机器起来之后,我们可以先查看连接是否准确,有没有这个MCP2515设备,有了我们才能继续挂载。1
2
3
4[email protected]:~ $ ls /sys/bus/spi/devices/spi0.0
driver modalias net of_node subsystem uevent
[email protected]:~ $ ls /sys/bus/spi/devices/spi0.0/net
can0
如果连接不准确基本上看不到上面的net文件夹,也就没有can0这个设备了
之后,设置你想要的波特率挂载,我这里用的是125000,sudo ip link set can0 up type can bitrate 125000,挂载成功后,就能在ifconfig中看到:1
2
3
4
5
6
7
8
9
10
11
12
13[email protected]:~ $ sudo ifconfig
can0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
UP RUNNING NOARP MTU:16 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
etho xxxx
....
....
wlan0 xxxx
....
....
每当机器重启之后,这个挂载就会失效,需重新挂载。可以直接做成服务或者放在rc.local中,开机自动启动就行
4. 发送CAN数据
Usage: cansend 1cansend can0 127#DEADBEEF
具体的can_frame格式也不用担心,当你格式数据输的不准确时,命令会自动提示所需的格式。
同时可以再开个终端查看收到的数据:1candump can0
5. 使用Python第三方库向CAN发送数据
当有需求要将功能写入Python脚本中时,可以使用python-can模块,具体的用法这里不多讲,看官方手册即可。
6.尾声
对CAN BUS知之甚少,只能依葫芦画瓢,一步一步慢慢走验证结果,当觉得自己的操作都正确却没有得到正确结果时,怀疑一下硬件本身是否有问题!