RAMN 的 ECU A 配备了一个实现虚拟串行端口功能的 USB 接口。通过标准的 Slcan 命令 ,该串行端口可以将 ECU A 转换为一个 USB 转 CAN 适配器。这也是本指南中我们之前使用的程序能够通过 RAMN 的 USB 端口读取和接收 CAN 消息的方式。
RAMN 的 USB 端口还实现了多种自定义 RAMN 命令 ,可用于执行 slcan 协议未涵盖的操作,例如禁用特定 ECU 的电源。虽然与 slcan 兼容的自定义命令使用起来不太方便,但也可以使用一个类似于传统 Linux 界面的命令行界面来替代。
如果您不熟悉串行终端,请注意以下事项:
更改 CAN 设置的命令(例如 CAN 滤波器或 CAN 波特率)通常要求您重新打开 CAN 外设(例如使用命令 O)。
在 Windows 上,可以使用诸如 TeraTerm 或 Putty 之类的程序访问串口。本指南中我们使用 TeraTerm。
将 RAMN 连接到您电脑的 USB 端口。打开 TeraTerm,选择“串行”,然后按确定以打开串口。如果您看到多个 COM 端口,请通过插拔 RAMN 时出现和消失的端口来确定哪个 COM 端口分配给了 RAMN。如果您未看到任何 COM 端口,请确认它当前未被转发到虚拟机。如果您未看到 COM 端口,而是看到一个“DFU”设备,则意味着您需要先刷写该板(请参阅刷写脚本 )。

打开端口后,在顶部菜单栏中选择“设置 -> 终端...”,并更改以下设置:

此时,您应该能够输入串行命令,并在终端上观察其响应。
如果您更倾向于使用 Linux,您需要使用一个能够良好处理“CR 换行”设备的终端。我们建议您使用 picocom,可以通过以下命令进行安装:
通过命令 dmesg 确定您的设备被分配的名称(在插入 RAMN 板时查找出现的设备)。通常会分配一个类似“dev/ttyACM0”的名称。您可以使用以下命令打开 RAMN 的串口:
从这里,您应该能够在终端中直接与 RAMN 进行交互。输入 control A 再按 control Q 即可退出界面,返回到正常的 Linux 终端。
您可以在原始的 LAWICEL CAN232 手册中找到 slcan 命令列表。RAMN 的实现经过了轻微简化,以更好地容忍用户可能犯的更多错误。部分 slcan 命令未被实现,或进行了轻微修改,以便更适配 STM32 的 CAN FD 控制器。
Slcan 命令仅使用 ASCII 字符发送;一个字节的原始数据实际上由两个十六进制 ASCII 字符表示 [ 1 ]
成功的 slcan 命令将由可选参数和一个“CR”字符(ASCII 13)响应。失败的 slcan 命令将由一个“BELL”字符(ASCII 7)响应,在 TeraTerm 中,该字符应伴随错误声音。
您可以通过使用 V 命令获取 slcan 适配器的软件版本:

同样,您也可以使用 N 命令获取硬件序列号:

该数字对应于一个“N”,其后连接了 ECU A 的 STM32 微控制器的 12 字节唯一设备 ID。
您可以通过在终端中输入 O(大写字母 o)并按下 ENTER 键,开始将 CAN 消息转发到串行接口。此命令无需任何参数。
此命令应会显示当前的 CAN 流量,以确认您的电路板工作正常。

您可以通过使用命令 C 来停止上一条命令产生的流量,该命令会关闭端口,且无需任何参数。
O 命令将 CAN 控制器设置为正常模式,这意味着您也可以发送 CAN 消息。而 L 命令则允许您使用 CAN 控制器的“仅监听”模式,从而禁止您发送 CAN 消息,并避免无意中影响正在进行的 CAN 流量。
S 命令允许您更改 CAN 控制器的波特率。更改后,您需要重新打开端口(例如使用 O 或 L 命令)以验证更改是否生效。S 命令使用一位数字标识符来指定波特率。有关这些标识符的列表,请参阅 CAN 波特率 。
例如,您可以使用此命令并指定波特率标识符 6,该标识符对应 RAMN 的默认波特率 500 kbps:
请注意,RAMN 默认自动采用 500 kbps 波特率,因此实际上您无需执行此命令。
如果所需的波特率没有对应的标识符,您也可以使用 s 命令来更改波特率。您不能直接指定波特率,而必须为 CAN 控制器提供位定时参数。有关位定时的工作原理,请参阅位定时 。
您必须为该函数提供两个字节:TSEG1 和 TSEG2,假设时钟频率为 40 MHz。例如,要直接设置 500 kbps 的波特率,您可以使用以下命令:
这将根据位定时中的示例,将 TSEG1 设置为 0x3C(60),TSEG2 设置为 0x13(19)。
您可以使用 t 发送带有标准标识符的 CAN 帧,使用 T 发送带有扩展标识符的 CAN 帧。您必须按顺序提供 CAN ID、DLC 和有效载荷。
对于标准标识符,您必须提供 3 位数字;对于扩展标识符,则需提供 8 位数字。位数是固定的,因此如有必要,您必须用零进行填充。DLC 仅为一位 。有效载荷紧随 DLC 之后,以十六进制形式表示。
例如,您可以使用以下命令发送一个具有标准标识符 0x024、DLC 为 2 以及二进制数据“0x11 0xFF”的 CAN 帧:
要传输带有扩展标识符的 CAN 帧,请改用“T”命令:
请注意,没有“接收”命令:当 CAN 适配器接收到 CAN 消息时,它会通过 t 和 T 命令将其转发到 USB 串行接口,但此时您是在接收而非发送这些消息。
命令 r 和 R 的使用方式与 t 和 T 类似,但分别用于 RTR 命令的标准标识符和扩展标识符。您不应为此命令提供有效载荷,但仍需提供一位数的 DLC。
例如,要发送一个带有标准标识符 0x701 且 DLC 为 8 的 RTR 请求:
而要使用扩展标识符发送相同的帧:
如果您不加过滤器直接输入此命令,将很难观察到 ECU B 的响应。
硬件滤波器可使用 M 和 m 命令进行设置:M 用于选择数值,m 用于选择掩码。有关 CAN 滤波器的默认工作原理,请参阅 CAN 过滤器 。
该格式与原始规范中的格式略有不同。 滤波器对标准标识符和扩展标识符独立生效。
如果要为标准标识符应用滤波器,请使用三位参数;对于扩展标识符,则使用八位参数。
例如,要应用滤波器值“701”和掩码“7ff”(仅接收 ID 0x701),请使用:
然而,这将无法让您过滤扩展标识符。如果您还希望接收具有扩展标识符的相同 ID,则还需要为扩展标识符设置相同的过滤器:
您需要通过再次打开 CAN 外设来应用此过滤器(例如:O 或 L)。应用此过滤器后,您应该能够发送一个 RTR 帧,并直接在终端中观察到响应:

最后一个命令应由终端接收,而非由您自行发送。
软件工具(例如 candump)通常对 slcan 帧使用软件滤波器,而非硬件滤波器。如果在硬件中应用了滤波器,它可能会一直保留到下次重置,并且可能无法被 CAN 软件工具中的滤波器设置所覆盖。
RAMN 默认使用在 CAN 过滤器中说明的“值与掩码”过滤器。您可以使用稍作修改的命令“W”,以指定不同的过滤器类型。
使用“M”命令为过滤器提供第一个参数,使用“m”命令提供第二个参数。
例如,使用“W0”可直接指定您希望接收的 ID 范围。如果您想接收从 0x700 到 0x703 的 ID,可以使用:
这种方式比等效的“值与掩码”方式更具可读性。同样,这仅适用于标准标识符,因此您还必须同时使用 m00000700 和 M00000703 来接收扩展标识符。
此命令返回一个字节(以两个十六进制字符表示),用于报告 CAN 控制器的状态。各比特位的含义请参阅 CAN232 数据手册 (F[CR]命令)。“仲裁丢失”标志不受支持。
此命令是为了与 slcan 兼容而实现的,但建议您改用自定义命令“E”直接读取 STM32 控制器标志。
您可以通过 Z1 启用时间戳,通过 Z0 将其禁用。时间戳以 2 字节值(四位数字)的形式附加在每帧末尾,每毫秒递增一次,并在 0xEA60(60000)处溢出。请注意,这些实际上并非真正的“CAN 硬件”时间戳,而是使用 freeRTOS 定时器实现的软件时间戳。

RAMN 不支持以下 slcan 命令:“X”、“U”、“P”、“A”、“Q”。不过,这不应妨碍您将 RAMN 与大多数工具(例如 slcand)一起使用。
此命令会转储 STM32 的 CAN FD 控制器所有可能的 CAN 错误以及 CAN 协议状态寄存器。有关每个位的含义,请参阅 ramn_debug.c 中的 RAMN_DEBUG_DumpCANErrorRegisters 。
此命令会转储所有可能的 FIFO 状态变量。有关每个位的含义,请参阅 main.c 中的 reportFIFOStatus_USB。
此命令会转储 CAN 统计信息,例如接收和发送的消息数量。有关每个位的含义,请参阅 ramn_debug.c 中的 RAMN_DEBUG_ReportCANStats。
此命令可用于通过 2 字节预分频器设置标称位定时。其格式为 kxxxxyyzz,其中 xxxx 为预分频器,yy 为 TSEG1,zz 为 TSEG2。例如,要设置 500 kbps 的波特率,可以不使用 TSEG1 = 69 和 TSEG2 = 20,而是使用预分频器 2,并将 TSEG1 设置为 30(0x1E),TSEG2 设置为 9(0x9):
此命令允许您设置 CAN FD 控制器的同步跳转宽度 (SJW) 参数。您可以使用 Gxx 仅提供标称 SJW(xx),或使用 Gxxyy 同时提供标称 SJW(xx)和数据 SJW(yy)。
例如,使用以下命令将标称 SJW 设置为 10(0x0A):
例如,你可以观察到使用较大的 SJW 能够让你容忍更多的时序误差。比如,如果你输入:
如果将波特率错误地设置为 506.3 kbps,同时将 SJW 值设为较小的 1,则不会观察到任何报文,只会出现 CAN 错误。然而,如果你重新复位板卡,并将波特率设置为 506.3 kbps,同时将 SJW 值设为较大的 16,你应该能够无误地观察到 RAMN 的 500 kbps 流量:
a 命令可用于启用 CAN 消息的自动重传功能。启用后,如果 ECU A 未能成功发送某条消息,则会自动进行重传。使用 a0 可将其禁用,而使用 a1 则可将其启用。
l 命令(小写 l)可用于以“受限操作”模式启动 CAN 外设,在此模式下,外设能够确认 CAN 帧,但无法发送帧或错误/过载帧。这与仅监听模式(L)不同,因为该模式确实会确认 CAN 帧。
以下自定义命令可用于在 RAMN 的 ECU A 上使用 CAN FD。请注意,这些设置仅适用于 ECU A,不适用于其他 ECU。有关 CAN FD 的更多信息,请参阅 CAN FD。
使用 f 来选择以何种模式打开 FD CAN 外设:
f0 用于经典 CAN 模式f1 用于无比特率切换的 CAN FD 模式f2 用于带比特率切换的 CAN FD 模式使用 i0 在非 ISO CAN FD 模式下设置外设,使用 i1 在 ISO CAN FD 模式下设置外设。
使用 Kxxyyzz 将 xx 设置为预分频器,yy 设置为 TSEG1,zz 设置为 TSEG2。请注意,对于此命令,预分频器仅为一个字节。
例如,要使用 2 Mbps 的数据波特率,请使用:
以 0 开始一帧,以指定您希望以不含 BRS 的 CAN FD 方式执行剩余的命令。例如,使用以下命令发送一个不含比特率切换的 CAN FD 帧 ,其 CAN ID 为 0x24,DLC 为 2,有效载荷为 0x01FF。
您还可以对 r、t 和 T 命令使用相同的前缀。
同样,以 1 开始一个帧,以指定您希望将命令的剩余部分作为带有 BRS 的 CAN FD 来执行。例如,使用以下命令发送一个带有比特率切换的 CAN FD 帧 ,CAN ID 为 0x24,DLC 为 2,有效载荷为 0x01FF。
您还可以为 r、t 和 T 命令使用相同的前缀。
使用 v0 和 v1 来启用或禁用在设置了“ESI”标志为“PASSIVE”的 CAN FD 帧末尾添加“i”字符。
此命令会返回 RAMN 文档的链接。也可以通过 h 和 ? 调用。 %%
此命令从 ECU A 的真随机数生成器中返回一个随机的字节 。
此命令从 ECU A 的真随机数生成器中返回一个随机的整数 。
此命令可启用调试日志:错误将以人类可读的方式显示。输入 d1 以启用调试日志,输入 d0 以禁用调试日志。
命令 @1 将在检测到错误时自动转储 CAN FIFO 状态和 CAN 错误状态寄存器。可通过 @0 将其禁用。
此命令可用于在 DFU 模式下重启微控制器,以便通过 USB 重新刷新固件(详情请参阅 STM32 嵌入式引导程序接口 )。请使用 DzZ 来执行该命令。
此命令可用于将 ECU B、C 或 D 重启至引导程序模式,以便通过 CAN FD 对其进行重新刷写(从 ECU A 的 USB 进行;详情请参阅 STM32 嵌入式引导加载程序接口)。使用 pB 可将 ECU B 启动至引导程序模式,pC 用于 ECU C,pD 用于 ECU D。
命令 n 将对所有 ECU 执行复位操作。
此命令可用于分别独立地启用或禁用 ECU B、C 和 D 的电源。其格式为 yxz,其中 x 为 ECU 名称,z 为电源状态(0 或 1)。例如,输入以下命令可禁用 ECU D 的电源。
您应该能够看到 LED 指示灯熄灭。输入以下命令可再次启用 ECU D 的电源:
此命令与之前的命令类似,但几乎同时应用于 ECU B、C 和 D。使用 Y0 可禁用所有这些 ECU 的电源,而使用 Y1 则可重新启用它们。
命令 % 可用于通过 USB 向 ECU A 发送 UDS 消息,而无需使用 CAN。只需以十六进制字符串形式提供大小和 UDS 有效载荷即可。其中,大小应首先以三位数字的形式给出。例如,使用以下命令发送一个“测试器存在”UDS 命令(2 字节有效载荷)“3E00”:

输入 # 以进入更友好的命令行界面。与直接的 slcan 串口界面不同,它支持退格字符,并提供更具可读性的命令名称。
命令 b 可用于退出命令行界面
命令 X 可用于显示 FreeRTOS 运行时统计信息,包括 CPU 使用率和堆栈使用情况。请注意,统计信息从启动时开始计算且不会被重置(因此,CPU 使用率仅表示自启动以来的整体平均值)。
以下命令由 RAMN 的脚本在内部使用:
c 命令(使用 c0 启用或 c1 禁用)用于将设备激活为“CARLA”模式,在此模式下,设备会通过串行数据包定期向驾驶模拟器更新 CAN 总线状态。u 命令是一个更新命令,用于同步驾驶模拟器与 RAMN 板。w 命令用于在不打开 slcan 端口的情况下应用新的 CAN 外设设置。RAMN 的命令行界面 (CLI) 提供了与通过 CAN 接口相同的自定义功能,但以更加友好的方式呈现。只需输入 # 自定义 slcan 命令即可打开它。然后,您可以输入常规命令,例如“help”以显示帮助页面。
例如,您可以输入 play 1 来启动一个 Chip-8 游戏,或者输入 theme 3 将屏幕主题更改为主题编号 3。如果您输入了无效的命令,系统将显示一条易于理解的错误信息,而不仅仅是发出“BELL”提示音。

例如,要发送“7F”来表示字节 0x7F,实际上是在二进制数据中发送 ASCII 字符 0x37(“7”)和 0x46(“F”)。