L4T 32.7.2 [ JetPack 4.61 ]
Ubuntu 18.04.6 LTS
Kernel Version: 4.9.253-tegra
JetPack从版本4.6开始已经将mcp2515及其驱动集成至device tree了,可以使用“jetson-io”对其进行配置,但是,直到版本4.61存在bug(本文碰到的问题是能够接收数据但不能发送数据)需要手动修改,这将在后面说明
首先使用jetsonUtilities查看JetPack版本,如果高于4.6则使用jetson-io.py直接配置mcp2515,如果版本低于4.6则需要手动添加(手动添加过程略复杂,本文只给出连接供参考)
在终端输入命令:
sudo /opt/nvidia/jetson-io/jetson-io.py
选择“Configure Jetson 40pin Header”,在其子页面中选择“Configure for compatible hardware”:
随后选择“MCP251x CAN Controller”,此时将看到pin的分配将spi1(19,21,23,24,26)和spi2(13,16,18,22,37)置位,即可以同时连接两个mcp2515:
选择“Save pin changes”以及随后的“Save and reboot to reconfigure pins”:
重启后,在终端输入命令:
ip link
将看到can0(如果只接了一个mcp2515模块),以及can1(接了两个mcp2515模块)
至此,mcp2515已经配置完毕,理论上使用“can-utils”即可测试验证,但如前述JetPack4.6/4.61存在bug,本文碰到的现象是mcp2515只能接收数据不能发送数据,类似现象在Nvidia论坛已经有讨论:
https://forums.developer.nvidia.com/t/bug-jetson-nano-p3450-b00-with-mcp2515-can-receive-but-cannot-send/187683
需要修改Nano启动的device tree文件,区别于树莓派“/boot”目录下的设备配置文件,Jetson series的“/boot”目录下存放的是device tree文件dtb
首先,需要确定Nano当前使用的dtb文件,在终端输入命令:
sudo nano /boot/extlinux/extlinux.conf
文件中以“FDT”开头的即为当前使用的dtb文件:
得到当前使用的dtb文件后,即可对其修改,使用dtc命令首先将dtb转换为dts(可编辑的device tree文件),然后再转回dtb,在终端输入命令:
cd /boot
sudo dtc -I dtb -O dts -f /boot/kernel_tegra210-p3448-0000-p3449-0000-b00-user-custom.dtb -o /boot/try.dts
该命令将当前dtb转换为一个临时的dts文件“try.dts”,用于属性修改,该文件命名可自行决定:
dtb文件转换为dts后即可对其进行修改,继续在终端输入命令:
sudo pluma try.dts
找到“can_clock”语句,修改mcp2515的晶振频率,市面上采购的mcp2515模块其晶振几乎都为8MHz,因此将语句“clock-frequency = <0x1312d00>”修改为“clock-frequency = < 0x7a1200>”,即从原来的20,000,000修改为8,000,000:
TIP:这里为16进制,也可以直接使用10进制,比如<8000000>
该文件另一个需要修改的地方是spi的状态属性,找到“spi@”语句,对标注有“compatible = “microchip,mcp2515”;”语句的spi添加状态
status = "okay";
对标注有“compatible = “tegra-spidev”;”语句的spi添加状态
status = "disabled";
NOTE:这里有两组spi,每一组都需要设置状态,说明中只示例了一组
保存文件,并退出。然后再次使用dtc命令将修改过的dts,转换回dtb文件,在终端继续输入命令:
sudo dtc -I dts -O dtb -f /boot/try.dts -o /boot/kernel_tegra210-p3448-0000-p3449-0000-b00-user-custom.dtb
转换完成后,重启,继续输入命令:
reboot
重启后即可启动can
NOTE:区别于树莓派通过“/boot”下的配置文件进行mcp2515中断管脚的设置,Jetson series写入了dts,可以通过dts查看其所配置的中断管脚,也可以通过命令:
cat /proc/interrupts | grep mcp
查看到当前mcp2515模块所配置的中断为“GPIO 200”,查看GPIO map即为管脚31,这也是“连线”章节所标注的中断管脚
在终端输入命令:
sudo ip link set can0 up type can bitrate 500000
其中bitrate这里设置为500Kbps
can启动后,可以通过命令查看其状态及基本参数:
ip -d -s link show can0
可以看到can0的基本信息,其中“clock 4000000”也是目前kernel的bug,理论上应该是“800000”,这里可以忽略
在终端输入命令:
sudo apt install can-utils
该工具可以以命令行的方式通过SocketCAN接口测试can0,其主要命令如下:
candump – Dump can packets – display, filter and log to disk.
canplayer – Replay CAN log files.
cansend – Send a single frame.
cangen – Generate random traffic.
canbusload – display the current CAN bus utilisation.
我们将使用其中的cadump和cansend命令进行接收和发送的验证
本文利用USB-ttl CAN模块及其上位机做为验证can controller,tb采购
在Nano终端利用can-utils开启接受数据,输入命令:
candump can0
在USB-CAN上位机中输入发送的数据,比如“CAN Test”,其16进制为“43 41 4e 20 54 65 73 74”点击“发送”按钮,随后可以看到Nano接收数据的终端将显示所接收到的数据
用can-utils在Nano开启发送数据的终端,并发送数据至USB-CAN上位机,我们发送字符串“hello”至上位机,设备号定为1,其16进制数据“68 65 6c 6c 6f”
在终端中输入命令:
cansend can0 001#68656c6c6f
JetPack版本高于4.6,使用“jetson-io.py”配置时,看不到“MCP251x CAN Controller”
可能的原因是已经在“Configure header pins manually”中将spi1和spi2配置占用了,通过“jetson-io”将其取消后即可看到:
JetPack版本低于4.6不能使用“jetson-io”进行配置,需要纯手动修改dts,过程比较复杂,本文不重点讨论,有需要的可以参考连接:
https://github.com/Thor-x86/seeed-linux-dtoverlays
以及Nvidia官方论坛的讨论:
https://forums.developer.nvidia.com/t/jetson-nano-and-mcp2515-can-module/112271
至此,整个mcp2515和Jetson Nano的配置及通信验证完成,可以使用mcp2515开展CANBUS相关的运用开发。本文是苇航智能在实现利用CANBUS进行通信时所碰到坑的一个记录,也希望能对大家带来帮助,如果文中有错误和不明确的地方,欢迎指正,共同交流,[email protected]