硬件环境

Jetson Nano

tb采购的Nano 4GB套件
在这里插入图片描述

MCP2515 CANBUS模块

tb采购的模块,晶振频率8MHz,传输芯片为TJA1050
在这里插入图片描述


Jetson Nano软件环境

L4T 32.7.2 [ JetPack 4.61 ]
Ubuntu 18.04.6 LTS
Kernel Version: 4.9.253-tegra


连线

在这里插入图片描述


加载mcp2515驱动

JetPack从版本4.6开始已经将mcp2515及其驱动集成至device tree了,可以使用“jetson-io”对其进行配置,但是,直到版本4.61存在bug(本文碰到的问题是能够接收数据但不能发送数据)需要手动修改,这将在后面说明

jetson-io.py配置

首先使用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

bug修改

需要修改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,这也是“连线”章节所标注的中断管脚


启动can

在终端输入命令:

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”,这里可以忽略


通信验证

安装can-utils

在终端输入命令:

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采购
在这里插入图片描述

  1. 连接USB-CAN模块的TX到MCP2515的H,RX到L
    在这里插入图片描述

  2. 将USB-CAN插入电脑,并启动其客户端,点击“自动搜索”按钮,将自动选择USB-CAN的串口端口;选择“透传模式”
    在这里插入图片描述

  3. 点击“设置模块”,确定bitrate是否与mcp2515所设置一致
    在这里插入图片描述

  4. 在Nano终端利用can-utils开启接受数据,输入命令:

 candump can0

开启等待接受数据
在这里插入图片描述

  1. 在USB-CAN上位机中输入发送的数据,比如“CAN Test”,其16进制为“43 41 4e 20 54 65 73 74”点击“发送”按钮,随后可以看到Nano接收数据的终端将显示所接收到的数据
    在这里插入图片描述

  2. 用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的配置

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进行通信时所碰到坑的一个记录,也希望能对大家带来帮助,如果文中有错误和不明确的地方,欢迎指正,共同交流,xinjue.zou.whi@gmail.com

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐