快速入门指南

了解主板

要开始使用 RAMN,您需要带有四个 ECU 的主板。

您可以通过丝印标识来识别主板上的各个 ECU:

  • ECU A 位于左上角,紧邻 USB 连接器。
  • ECU B 位于 ECU A 的下方。
  • ECU C 位于 ECU B 的右侧。
  • ECU D 位于 ECU A 的右侧。

添加扩展

为了与 ECU 进行物理接口连接,您可以为每个 ECU 添加扩展。这些扩展应按照以下动画所示的方式进行连接。

注意

如果您不打算使用这些控制装置(例如,您只想尝试 UDS 命令),则无需安装扩展模块。

您可以通过查看丝印来识别每个控制装置的作用:

  • ECU A 配备了一个显示屏,可在其上显示 CAN 总线的相关信息。
  • ECU B 配备了一个旋转电位器用于模拟方向盘,一个两位开关用于模拟驻车制动器,以及一个四位置旋转开关用于模拟灯光控制。
  • ECU C 配备了一个滑动电位器用于模拟油门踏板,另一个滑动电位器用于模拟制动踏板,以及一个操纵杆用于模拟换挡杆。该操纵杆可通过上下按压来请求换挡,左右拨动来控制转向灯,中间按下则可模拟鸣笛操作。
  • ECU D 配备了一个发动机钥匙和八个 LED 指示灯。发动机钥匙有三个位置:OFF(关闭)、ACC(附件)和 IGN(点火)。

控制功能测试

在继续操作之前,您应先验证开发板是否正常工作。将开发板连接到电脑的 USB 端口,或连接到能够提供超过 300mA 电流的 USB 电源。每个控制的状态应显示在 ECU A 屏幕的底部。移动每个控制,并确认其状态在屏幕上得到更新(必要时 LED 指示灯也会相应变化)。如果未出现上述情况,您可能需要重新刷写开发板固件(参见 固件刷写 )。ECU D 扩展板上的 LED 模拟了一个简单的仪表盘,可以帮助您验证每个控制是否正常工作。默认情况下,只要电源接通,CAN 总线始终处于激活状态,因此您可以将控制置于任何您偏好的状态(例如,发动机钥匙置于 OFF 位置)。

您可以通过按下 ECU C 上“SHIFT”操纵杆的 LEFT 或 RIGHT 来切换 ECU A 的不同屏幕。在某些屏幕上,您还可以通过按下 UP、DOWN 或 CENTER 进一步进行交互。

  • LED D1 是左转向指示灯。当您向左按下 ECU C 的操纵杆时,它应开始闪烁。
  • LED D2 是右转向指示灯。如果您在 ECU C 上向右按下操纵杆,该指示灯应开始闪烁。
  • LED D3、D4 和 D5 分别代表示廓灯、近光灯和远光灯。当您打开 ECU B 上的灯光控制开关时,这些指示灯应按顺序依次点亮。
  • LED D6 是“电池”指示灯。默认情况下,当发动机钥匙处于“ACC”或“IGN”位置时,该指示灯会亮起。
  • LED D7 是“检查发动机”指示灯。默认情况下,当使用自动驾驶算法且方向盘电位计未归中时,该指示灯会亮起。它用于提示当前已忽略自动驾驶算法的指令,转而采用方向盘电位计的当前位置。
  • LED D8 是“驻车制动”指示灯。当驻车制动处于激活状态时,该指示灯会亮起。与真实车辆不同的是,当踩下制动踏板时,该指示灯也会亮起。
注意

尽管在真实车辆中,“电池”和“发动机检查”指示灯会让人感到担忧,但这并不意味着您的 RAMN 板出现了故障。

警告

如果在您将方向盘回正时,屏幕上未显示“转向 0%”,则表明您为配备线性电位器的板子安装了对数型固件,反之亦然。这种情况下,该板仍可正常使用,但如果您希望在模拟器中驾驶车辆,可能需要更新 ECU B 的固件。

在粗暴操作过程中,点烟器开关和转向电位器的盖子可能会脱落,请务必注意不要丢失。同时也要小心屏幕,它相当脆弱。

选择您的 CAN 适配器与工具

要与 RAMN 的 CAN 总线进行交互,您有两种适配器可供选择:

  1. 使用您自己的适配器,例如公开可用的 CAN 适配器(如 CANtact),以及 savvyCAN 等软件。
  2. 使用 RAMN 内置适配器(RAMN 本身通过 USB 充当“slcan”适配器,因此如果您的软件兼容 slcan,则无需连接任何硬件)。

此外,还有两种(软件)工具可供选择:

  1. 使用您自己的工具,例如 SavvyCAN、BUSMaster、scapy-automotive,或您自己编写的 python-can 脚本。
  2. 使用 Linux 命令行工具(即 can-utils)。

如果您想使用自己的适配器,只需将适配器的“CANH”和“CANL”线缆连接到 RAMN CAN 总线接线端子上,该接线端子位于电路板右上角。接线端子的每个引脚由一个较大的圆形孔和一个较小的矩形孔组成。您应将要连接的线缆插入圆形孔中,内部弹簧会将其锁定到位。如需移除线缆,可将工具(例如精密螺丝刀)插入矩形孔中并拉动线缆即可。该接线端子共有三个引脚,对应的信号已在丝印旁进行了标注:

  • 最上面的引脚为 GND(地)。
  • 中间的引脚为 CANL(CAN 低电平)。
  • 最下面的引脚为 CANH(CAN 高电平)。

您只需将 RAMN 的 CANH 和 CANL 引脚连接到您的 CAN 适配器的 CANH 和 CANL 引脚即可。完成连接后,您就可以使用自己喜爱的工具集了。只要 RAMN 板通电,CAN 总线就会始终保持激活状态。

本文件的其余部分将重点介绍内置 RAMN 适配器和内置 Linux 工具。

使用内置工具

要在 RAMN 上开始进行 CAN 总线分析,我们建议您准备一个带有 can-utils 的 Linux 环境(虚拟或原生)。

准备配备 can-utils 的 Linux 机器

Windows

在 Windows 系统上,我们建议您安装 VirtualBox 并使用 Linux 发行版镜像。汽车爱好者的一个常见选择是 Kali Linux [ 1 ]

从这里开始,您应该能够按照以下 Linux 说明进行操作。

脚注
[ 1 ]:

如果您无法(或不愿)在虚拟机中运行 Linux 以使用 can-utils 工具,我们建议您学习并使用跨平台的 python-can 库,它可在所有(Python)平台上运行,包括 Windows。

Linux

  • 打开终端窗口(例如,右键单击桌面并选择“在此处打开终端”)。
  • 输入以下命令以安装 can-utils:
sudo apt-get update sudo apt-get install can-utils

USB 连接

使用 USB 数据线将开发板连接到您的计算机。在 Windows 系统中,它应显示为“USB 串行设备”(或复合设备),并分配一个 COM 端口号(例如 COM1)。如果未出现这种情况,您可能需要安装 STM32 虚拟 COM 端口驱动程序

一旦 Windows 识别到该板卡,您必须将 USB 端口转发至 Virtual Box。选择“设备”>“USB”,然后单击“丰田汽车公司 RAMN”。您也可以打开“设备”>“USB”>“USB 设置…”,然后单击“+”图标以添加 RAMN,这样 Virtual Box 就会始终自动转发该 USB 端口。

在 Linux 系统中,RAMN 应出现在 dmesg 命令的末尾,并被分配一个设备文件(通常为/dev/ttyACM0)。如果遇到问题,请参阅USB 不稳定

启动 slcand

默认情况下,RAMN 充当 slcan 适配器。您可以使用 slcand 命令将 RAMN 作为原生 Linux CAN 接口启动。

sudo slcand -o -c /dev/ttyACM0 && sudo ip link set up can0

请将 /dev/ttyACM0 替换为您计算机所分配的设备文件。

执行此命令后,您应该能够使用 ifconfig 看到 CAN 接口显示为“can0”:

ifconfig

使用 Cansniffer 观察 CAN 流量

要观察每个标识符的最新 CAN 消息并突出显示位变化,可以使用以下命令:

cansniffer -c can0

每条消息的前两个字节表示板上某项的状态。尝试移动控制部件,并观察这些值如何变化。接下来的两个字节表示消息计数器,最后四个字节表示前四个字节的 CRC32 校验值。

转储 CAN 流量

如果您想查看所有 CAN 帧,而不是每个标识符的最新帧,可以使用 candump 命令。

candump can0

此命令将转储所有 CAN 帧,可能会导致信息过载。您可以使用过滤器仅显示特定的 CAN ID。要添加过滤器,请在 CAN 接口名称后加上 ,<filter>:<mask> 。例如,若仅需显示 ID 为 0x150 的帧,请使用以下命令:

candump can0,150:7ff

此命令应仅显示 ID 为 0x150 的 CAN 帧。移动 ECU B 扩展上的照明控制开关,并观察第一个字节的变化情况。这将帮助您理解 ECU B 如何通过 CAN 总线传输该开关的状态。

发送 CAN 帧

您可以使用 cansend 命令来发送 CAN 消息。请确保将 ECU B 上的照明控制开关拨至最左侧位置,以关闭车身 ECU 扩展上的照明 LED(D3 至 D5 LED)。然后,您可以发送以下消息来“欺骗”照明控制:

cansend can0 150#02 cansend can0 150#03 cansend can0 150#04

您应该能够通过终端短暂地控制车身扩展上 LED 的状态。但只能短暂控制,因为 ECU B 仍在持续发送 CAN 帧,覆盖您的 CAN 消息。实际上,您可能会在 ECU A 上看到一条错误信息,提示 CAN 总线出现异常,这是因为两个 ECU 正在发送具有相同 ID 的 CAN 帧。要解决这个问题,您需要阻止 ECU B 发送 CAN 消息。一个快速的方法是使用 UDS。

发送 UDS 命令

UDS 是一组标准诊断命令,可通过 ISO-TP 传输层发送。您可以使用 isotpsend、isotprecv 和 isotpdump 命令轻松地与这些层进行交互。

输入以下命令以转储包含 UDS 命令的 CAN 消息:

candump can0,7e0:7F0

此命令将转储 ID 范围从 0x7e0 到 0x7eF 的消息,这些 ID 对应于 RAMN 的 UDS 层所使用的 ID。目前应该不会显示任何内容,因为尚未发送任何 UDS 消息。

打开另一个终端,并输入以下命令:

isotpdump -s 7e1 -d 7e9 -c -u -a can0

此命令将转储并解析针对 ECU B 的 UDS 命令,该 ECU 在 ID 为 0x7e1 处接收命令,并在 ID 为 0x7e9 处作出响应。目前,此命令也应暂无任何输出。

再打开一个终端,并输入以下命令:

isotprecv -s 7e1 -d 7e9 -l can0

此命令将接收并显示您发送至 ECU B 的 UDS 命令的响应。

最后,打开第四个终端,并输入以下命令以向 ECU B 发送您的第一个 UDS 命令:

echo "3E 00" | isotpsend -s 7e1 -d 7e9 can0

此命令将向 ECU B 发送一个 2 字节的命令“3E 00”,对应于“测试器存在”命令。这是一个可选命令,用于告知 ECU 当前正在进行诊断,并且它应等待您的后续指令。您应在“isotprecv”终端上看到 ECU B 已回复“7E 00”,这表示命令已被接受。您可以在“isotpdump”终端上查看对应的交互过程,其中红色表示请求,蓝色表示响应。如果您查看“candump”终端,将看到相应的 CAN 报文。请注意,这些报文实际上是 3 字节长:这是因为第一个字节用于指定 UDS 有效载荷的长度,而此处的有效载荷长度为 2 字节。

你可以使用 UDS 来发送和接收大容量负载。例如,使用“按标识符读取数据”服务(0x22)向 ECU 查询其编译时间(参数 0xF184):

echo "22 F1 84" | isotpsend -s 7e1 -d 7e9 can0

你应该能在“isotprecv”终端中看到已接收到一个较大的响应,该响应应由你的“isotpdump”终端进行解析。在“candump”终端中,你可以观察到已经交换了许多 CAN 报文。这对应于 ISO-TP 层,该层允许通过仅包含小于 8 字节的 CAN 帧来传输大消息。isotpdump、isotpsend 和 isotprecv 使这一层对你而言是透明的。

最后,你可以使用 RAMN 自定义例程控制(UDS 服务 0x31)来请求 ECU B 停止发送 CAN 报文(例程 0x0200)。

echo "31 01 02 00" | isotpsend -s 7e1 -d 7e9 can0

移动照明开关,观察 ECU D 的 LED 指示灯不再发生变化。现在,您可以通过以下命令控制照明开关,而无需 ECU B 的干扰。

cansend can0 150#02 cansend can0 150#03 cansend can0 150#04

恭喜您,您已成为 CAN 总线专家。请参阅完整的用户指南 ,以了解更多内容。