在Nvidia Jetson Xavier开发套件上启用CAN

Ramin Nabati
294 0 2020-07-01

本文来自 Ramin Nabati 

转载自:https://medium.com/@ramin.nabati/enabling-can-on-nvidia-jetson-xavier-developer-kit-aaaa3c4d99c9 

在Nvidia Jetson AGX Xavier配有两个控制器局域网(CAN)控制器,但它不具有任何CAN收发器。这些收发器可以轻松添加到Jetson Xavier开发套件中,以实现与其他设备的CAN总线通信。在本教程中,我将介绍在Jetson Xavier开发套件上启用CAN控制器所需的所有步骤。我首先在Jetson Xavier上配置GPIO引脚并启用CAN控制器,然后完成收发器安装步骤。

第1部分:启用CAN控制器

可以通过GPIO扩展头访问Jetson Xavier开发套件中的CAN控制器。默认情况下,CAN控制器的引脚配置为具有GPIO功能,以符合Raspi 40引脚标准,因此,我们要做的第一件事是重新配置这些引脚以启用CAN功能。根据Nvidia Xavier开发人员论坛上的这篇文章(https://forums.developer.nvidia.com/t/enable-can-on-xavier/65869/2),有两种方法可以重新配置这些引脚。第一种方法涉及使用特定的pinmux配置刷新Xavier。由于我不想重新刷新Xavier,因此我将采用第二种解决方案。

第二种解决方案是使用寄存器读/写工具来覆盖与CAN控制器引脚相对应的寄存器值。该解决方案唯一的不足是这些设置不是持久性的,这意味着每次打开Jetson Xavier开发套件时都需要重复进行这些设置。我们将通过编写在系统启动时自动运行的配置脚本来解决此问题。让我们从在Jetson Xavier上打开一个终端并按照以下步骤开始。

我们首先安装用于更改Xavier上寄存器值的工具


sudo apt-get install busybox

然后,我们需要重新配置与CAN控制器引脚相对应的四个寄存器值。以下命令将重新配置这些引脚:

sudo busybox devmem 0x0c303000 32 0x0000C400
sudo busybox devmem 0x0c303008 32 0x0000C458
sudo busybox devmem 0x0c303010 32 0x0000C400
sudo busybox devmem 0x0c303018 32 0x0000C458

现在修改了寄存器值,我们可以使用以下modprobe命令安装CAN控制器并加载驱动程序:

sudo modprobe can
sudo modprobe can_raw
sudo modprobe mttcan


下一步是根据您的CAN总线和收发器的规范配置CAN控制器。在这里,我将CAN比特率设置为500 Kbps,启用灵活数据速率(FD),将有效负载比特率设置为2 Mbps,并启用总线错误报告。如果不确定所有这些设置,则可以仅设置该bitrate值,然后忽略其他选项。

sudo ip link set can0 type can bitrate 500000 \
    dbitrate 2000000 berr-reporting on fd on
sudo ip link set can1 type can bitrate 500000 \
    dbitrate 2000000 berr-reporting on fd on


现在我们只需要启动CAN接口: 

sudo ip link set up can0
sudo ip link set up can1

要检查是否成功启用了CAN控制器,请使用ifconfig命令。在输出中,您应该能够在您的网络设备之间看到can0和can1,如下图所示:

要在系统启动时自动完成上述CAN控制器配置,请在根目录中创建一个名为enable_CAN.sh的文件并使其可执行:

touch /enable_CAN.sh
chmod 755 /enable_CAN.sh

将以下行添加到此文件并保存。这些基本与我们配置CAN控制器时使用的命令相同。

#!/bin/bash
sudo busybox devmem 0x0c303000 32 0x0000C400
sudo busybox devmem 0x0c303008 32 0x0000C458
sudo busybox devmem 0x0c303010 32 0x0000C400
sudo busybox devmem 0x0c303018 32 0x0000C458
sudo modprobe can
sudo modprobe can_raw
sudo modprobe mttcan
sudo ip link set can0 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on
sudo ip link set can1 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on
sudo ip link set up can0
sudo ip link set up can1

exit 0


如果您的Jetson Xavier已经存在该文件/etc/rc.local,请跳到下一步。如果不存在,请继续在终端中运行以下命令来创建它:

printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local


将以下行添加到/etc/rc.local 文件中,在exit 0行之前:

sh /enable_CAN.sh &

您的/etc/rc.local文件现在应该如下所示:

现在,enable_CAN.sh脚本应在系统启动时自动运行并配置CAN控制器。要对其进行测试,请重新启动Jetson Xavier,并检查在终端中运行命令时是否仍然看到can0和can1设备ifconfig。

第2部分:安装CAN收发器

我使用两个KNACRO CAN总线收发器进行设置,以便可以同时与两个CAN总线接口。如果仅需要与一根CAN总线进行通信,则只能安装一个收发器。我使用的收发器在3.3V电压下运行,并且已经在总线上焊接了120 Ohm终端电阻。

下图显示了Jetson Xavier上扩展接头的引脚分配以及引脚1的位置。首先,将扩展头连接器的#29(CAN0_DIN)引脚和#31(CAN0_DOUT)引脚连接到其中一个收发器的CRX和CTX引脚。同样,引脚37(CAN1_DIN)和引脚33(CAN1_DOUT)需要连接到另一个收发器上的CRX和CTX引脚。我们还需要将扩展接头连接器上的两组3.3V和GND引脚连接到收发器上的3V3和GND引脚。下图说明了收发器的引脚如何连接到扩展接头引脚。

收发器上的CANH和CANL引脚需要连接到要与之通信的两条CAN总线的CAN High和CAN Low导线。我们还需要某种结构来固定收发器和Jetson Xavier开发人员套件。我们已经制作了一个简单的平台,可以在其上安装板子和收发器。下图显示了连接到Jetson Xavier开发套件并安装在此平台上的收发器。

如上图所示,我使用DB-9连接器与CAN总线接口。两组双绞线是CAN0和CAN1的CANH和CANL线。为了保持较低的错误率,通常将CAN High和CAN Low导线绞合在一起。在DB-9连接器上,我已将针脚1和8用于CAN0的低电平和高电平,并将针脚2和7用于CAN1的低电平和高电平,但是您可以使用适合您的应用的任何其他引脚。

笔记

根据Jetson AGX Xavier开发套件载板规范文件,由于系统默认情况下启用了SoC中的内部3.3V上拉电阻,因此当系统加电时,引脚37、29、33和31被拉至3.3V。因此,您使用的收发器必须能够处理其CTX和CRX引脚上的初始3.3V电压。本教程中使用的收发器似乎可以正常处理此初始3.3V。

Jetson Xavier用户发布了一套非常好的脚本(https://github.com/hmxf/can_xavier),用于在Jetson Xavier上配置和测试CAN控制器。


更多关于Xavier开发套件:

NVIDIA®Jetson™系统在工业网络中的集成

用Jetson Xavier检测无人机拍摄的行人

看一块SSD硬盘如何通吃所有NVIDIA Jetson平台

日本创新公司开发AI骨架检测引擎支持NVIDIA AGX Xavier

Jetson NANO/ Jetson Xavier NX /Jetson Xavier性能到底差了多少?

NVIDIA边缘计算利器 AGX Xavier memory翻倍,更重要的是...



注意,文章中提到一个方便的脚本,地址在:https://github.com/hmxf/can_xavier