CANable V2.5 Candlelight&Slcan 更新说明
- [CANable V2.5 Candlelight&Slcan 更新说明](#CANable V2.5 Candlelight&Slcan 更新说明)
-
- [第1部分 概述](#第1部分 概述)
-
- [1.1 前言](#1.1 前言)
- [1.2 关于Slcan和Candlelight](#1.2 关于Slcan和Candlelight)
- [1.3 关于HUD ECU Hacker](#1.3 关于HUD ECU Hacker)
- [第2部分 说明手册](#第2部分 说明手册)
-
- [2.1 CANable硬件介绍](#2.1 CANable硬件介绍)
- [2.2 原版硬件设计缺陷](#2.2 原版硬件设计缺陷)
- [2.3 CANable官方固件](#2.3 CANable官方固件)
- [2.4 Slcan协议](#2.4 Slcan协议)
- [2.5 Candlelight 协议](#2.5 Candlelight 协议)
- [2.6 USB数据传输效率](#2.6 USB数据传输效率)
- [2.7 Candlelight固件与Windows兼容性问题](#2.7 Candlelight固件与Windows兼容性问题)
- [2.8 全新固件烧录程序](#2.8 全新固件烧录程序)
- [2.9 LED指示灯含义](#2.9 LED指示灯含义)
- [2.10 上位机软件](#2.10 上位机软件)
- [2.11 CANbus设置](#2.11 CANbus设置)
- [2.12 CAN总线过滤器](#2.12 CAN总线过滤器)
- [2.13 采样点和波特率](#2.13 采样点和波特率)
- [2.14 CANbus错误](#2.14 CANbus错误)
- [2.15 发送超时](#2.15 发送超时)
- [2.16 发射回波标记](#2.16 发射回波标记)
- [2.17 时间戳](#2.17 时间戳)
- [2.18 DFU模式](#2.18 DFU模式)
- [2.19 Bug修复](#2.19 Bug修复)
- [2.20 总线负载](#2.20 总线负载)
- [2.21 收发器延迟](#2.21 收发器延迟)
- [第3部分 Slcan应用程序开发手册](#第3部分 Slcan应用程序开发手册)
-
- [3.1 Slcan 指令](#3.1 Slcan 指令)
- [3.2 Slcan响应和事件](#3.2 Slcan响应和事件)
- [3.3 Slcan 版本信息](#3.3 Slcan 版本信息)
- [3.4 Slcan数据包](#3.4 Slcan数据包)
- [3.5 Slcan错误报告](#3.5 Slcan错误报告)
- [3.6 Slcan初始化](#3.6 Slcan初始化)
- [第4部分 Candlelight应用程序开发手册](#第4部分 Candlelight应用程序开发手册)
-
- [4.1 C++ 演示应用程序](#4.1 C++ 演示应用程序)
- [4.2 新的ElmüSoft协议](#4.2 新的ElmüSoft协议)
- [4.3 进入DFU模式](#4.3 进入DFU模式)
- [第5部分 固件开发人员手册](#第5部分 固件开发人员手册)
-
- [5.1 注意事项](#5.1 注意事项)
- [5.2 添加新开发板](#5.2 添加新开发板)
- [5.3 添加新处理器](#5.3 添加新处理器)
- [5.4 USB接口](#5.4 USB接口)
- [5.5 在Windows上编译STM32代码](#5.5 在Windows上编译STM32代码)
- [第6部分 版本说明](#第6部分 版本说明)
-
- [6.1 源代码版本](#6.1 源代码版本)
- [6.2 更新提示](#6.2 更新提示)
- 版本变更记录
CANable V2.5 Candlelight&Slcan 更新说明
第1部分 概述
1.1 前言
CANable 2.5固件是在CANable官方固件Candlelight和Slcan的基础上修改,为CANable V2.0更新的一个开源固件,作者是Elmue。
官网下载到的固件存在着诸多问题且很长时间未被解决,全新的 CANable 2.5 固件不仅修复了一系列的bug,改善了与现在主流Windows系统版本的兼容性,还增加了许多功能,让CANable更适用于专业的CAN总线分析和应用。
不仅如此,Elmue还把CANable适配器融入到了其开发的上位机软件HUD ECU Hacker中,使用其中的固件更新程序,可以将固件一键上传到CANable设备。
本篇文章将着重介绍固件更新的内容,有关固件烧录和HUD ECU Hacker的安装使用,请参考我们的另外一篇教程。
Elmue对旧版CANable固件做了很多吐槽,很有意思,我们也十分推荐您阅读原文。
原文:https://netcult.ch/elmue/CANable Firmware Update/#Sample_Baud
HUD ECU Hacker:https://netcult.ch/elmue/HUD ECU Hacker/
GitHub:https://github.com/Elmue/CANable-2.5-firmware-Slcan-and-Candlelight
1.2 关于Slcan和Candlelight
1、两个原本独立的固件项目Slcan和Candlelight被合并成一个项目,并使用了相同的代码库;
2、全新的CANable 2.5固件质量优秀,并且是开源的;
3、在使用旧版固件时,如果CAN通信无法正常工作,会很难找到原因,CANable 2.5固件增加了报错机制,方便您找到问题所在;
4、尽管增加了很多新功能,但新版本固件与旧版本上位机仍然兼容;
5、该固件已成功测试,支持高达10兆波特的CAN FD波特率;
6、该固件的设计使其易于扩展,以满足未来的需求;
7、该固件由一位拥有40多年编程、逆向工程和电子技术经验的软件开发人员编写。
1.3 关于HUD ECU Hacker
1、使用固件更新程序,可以一键将新固件上传到CANable设备。
2、附带一个高速 CAN 原始终端,它不仅支持所有新功能,还能与旧式适配器兼容。
3、可以获取CAN总线流量的日志文件。
4、可以解码摩托车、汽车、卡车和船舶中使用的ISO 15765、J1939和NMEA 2000 CAN 总线协议。
5、可以提供HUD ECU Hacker用于解码CAN总线流量的DBC文件。
6、可以编写与CAN总线设备通信的超高速宏脚本。
第2部分 说明手册
2.1 CANable硬件介绍
CANable是一款物美价廉的CAN总线适配器,支持CAN FD协议。如果您要使用2.5固件,请确保它是CANable 2.0版本,并且采用STM32G431处理器。Elmue使用的是MKS CANable 2.0 Pro S,这是一款带外壳与电气隔离的CANable 2.0适配器,采用了ADM3050E隔离式CAN收发器和B05050S-1WR3隔离式DC-DC转换器。它还带有一个手动开关,可以将一个 120 Ω 的终端电阻连接到 CAN 总线上。Elmue对其进行了全面测试,在10兆波特率下也能完美运行。
2.2 原版硬件设计缺陷
CANable官方硬件设计存在一个缺陷,那就是使用了同一个处理器引脚作为CAN接收(CAN RX)和BOOT0引脚,这就导致了上电时如果BOOT0引脚为高电平,处理器将进入引导加载程序模式。在合理的硬件设计中,这种情况应该只在设置引导模式跳线时发生。但在这个设计中,为确保处理器复位时CAN RX引脚为低电平,官方使用了晶体管Q1和Q2来延迟CAN收发器的供电,如果没有这些晶体管,处理器将始终以DFU模式启动。

在DFU模式下,处理器运行其内部的引导加载程序,并准备接收固件更新,此时CANable只有红色LED指示灯亮起,并且在设备管理器中显示为DFU设备,也无法连接到CAN总线。这种设计缺陷导致的后果是,短暂中断5V USB电源会让CANable进入DFU模式。也就是说,如果USB接口发生了松动或接触不良,亦或是重启计算机,都会导致CANable错误地进入DFU模式。此外,快速拔插USB接口也同样会进入DFU模式。这种情况下想要退出DFU模式,需要断开USB接口5秒钟以上,等待C3电容释放完电电量才能办到。这种设计缺陷让人哭笑不得,因此CANable 2.5固件提供了一个解决方案,即可以选择禁用掉BOOT0引脚。
2.3 CANable官方固件
原版CANable适配器使用由Geschwister Schneider最初开发的,基于STM32G431处理器的开源固件。后来,该固件在GitHub上进行了适配,以支持多种处理器,并添加了CAN FD支持。目前有两个版本:用于比较旧的处理器的CANable 1.0版本和支持CAN FD的CANable 2.0版本,您可以在canable.io上找到网页更新程序,该程序提供两种不同的固件类型。

关于如何烧录官方原版固件,我们这里不再作描述,请参考我们的往期教程。
2.4 Slcan协议
当连接Slcan固件的CANable时,Windows系统会显示一个COM端口。此时与CAN总线的所有通信都以ASCII字符的形式传输,这是一种通过USB接口传输二进制数据的低效方式,发送到CAN总线的每个字节都需要通过USB传输两个字节。USB的速度限制为 12 Mbit/s,而CAN总线的速度最高可达10 Mbaud。Slcan协议的唯一优点是简单易用适合新手。介于其速度较慢,因此不建议用于高速的专业用途。
2.5 Candlelight 协议
Candlelight协议通过USB传输二进制数据,理论上可以充分利用 USB 的速度。但是canable.io提供的官方固件仍未实现CAN FD。此前,市面上还没有完全适用于STM32G431处理器的Candlelight固件,Candlelight 2.5是第一个。该固件实现了一种新的协议,可以最大限度地优化 USB 数据传输。此外,Candlelight 2.5固件仍然100%向下兼容旧版协议。
2.6 USB数据传输效率
下表比较了不同固件版本接收 CAN FD 数据包的效率,本例中的有效载荷由 29 位 CAN ID + 16 字节数据 + 标志位 = 21 字节组成。
19F50C02: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F (FDF, BRS)
| 固件 | 有效载荷 | USB传输 | 效率 |
|---|---|---|---|
| 官方 Slcan | 21 byte | 有效载荷×2 + 2 = 44 byte | 48 % |
| ElmüSoft Slcan 2.5 | 21 byte | 有效载荷×2 + 2 = 44 byte | 48 % |
| 官方 Candlelight | 21 byte | 未实现CANFD | 0 % |
| ElmüSoft Candlelight 2.5 | 21 byte | 有效载荷+ 2 = 23 byte | 91 % |
2.7 Candlelight固件与Windows兼容性问题
旧版Candlelight固件的CANable想要被Windows系统正确识别,需要手动安装驱动,但还是会有部分计算机仍然无法正确识别,这个问题一直没有解决方案,我们也只能建议客户改用Slcan固件。但是新固件的出现解决了这个问题,在烧录ElmüSoft Candlelight 2.5固件时,Windows会立即安装两个驱动程序,这个过程非常快,甚至难以被察觉。安装过程不会有任何窗口提示,Windows会在后台悄无声息地完成安装,只需一秒钟。
全新的Candlelight 2.5固件是首个在Windows系统上100%正常运行的Candlelight固件。使用HUD ECU Hacker打开您的适配器,即可在"Trace"窗格中查看所有详细信息。HUD ECU Hacker会向CANable发送Microsoft操作系统描述符请求,并显示适配器的响应。适配器必须正确响应2个接口的3个请求。
(1)这里显示的是 CANable 2.5 固件的正确响应:
String ID: 0xEE, Signature: "MSFT100", VendorCode: 0x20
Interface: 0, Version: 1.00, MS Compatible ID: "USB\MS_COMP_WINUSB"
Interface: 1, Version: 1.00, MS Compatible ID: "USB\MS_COMP_WINUSB"
Interface: 0, Property: "DeviceInterfaceGUIDs", Type: MultiString, Data: "{c15b4308-04d3-11e6-b3ea-6057189e6443}\0\0"
Interface: 1, Property: "DeviceInterfaceGUIDs", Type: MultiString, Data: "{c25b4308-04d3-11e6-b3ea-6057189e6443}\0\0"
接口0是Candlelight接口,接口1是DFU固件更新接口。这两个接口都需要一个唯一的标识符(GUID),以便Windows可以为每个接口安装驱动程序。
(2)这是旧版Candlelight 1.0固件的响应,该固件没有版本号:
String ID: 0xEE, Signature: "MSFT100", VendorCode: 0x20
Interface: 0, Version: 1.00, MS Compatible ID: "USB\MS_COMP_WINUSB"
Interface: 1, Version: 1.00, MS Compatible ID: "USB\MS_COMP_WINUSB"
Interface: 0, Property: "DeviceInterfaceGUIDs", Type: MultiString, Data: "{c15b4308-04d3-11e6-b3ea-6057189e6443}\0\0"
Interface: 1, Error requesting MS OS Extended Properties descriptor.
The device has a buggy firmware. The driver for the firmware update (DFU) interface cannot be installed automatically.
(3)官方Candlelight固件ba6b1dd无法响应请求,因此无法安装任何驱动程序。
2.8 全新固件烧录程序
HUD ECU Hacker内置固件更新程序,适用所有类型的STM32处理器。如何烧录固件请参考我们的使用教程。HUD ECU Hacker总共有四个CANable固件可供选择:
| 文件名 | 目标适配器 |
|---|---|
| STM32G431 - Slcan2.5 - MksMakerbase.dfu | MKS Makerbase, DSD Tech, Walfront |
| STM32G431 - Slcan2.5 - OpenlightLabs.dfu | Openlight Labs |
| STM32G431 - Candlelight2.5 - MksMakerbase.dfu | MKS Makerbase, DSD Tech, Walfront |
| STM32G431 - Candlelight2.5 - OpenlightLabs.dfu | Openlight Labs |
这些适配器之间的唯一区别在于绿色LED使用的引脚,Openlight Labs使用处理器引脚B11,而其他公司使用引脚A0。如果安装了错误的固件,绿色LED将始终熄灭。
该固件已在STM32G431处理器上测试过,但应该也适用于该系列的所有处理器:STM32G441、STM32G471、STM32G473、STM32G474、STM32G483、STM32G484、STM32G491、STM32G4A1。HUD ECU Hacker固件更新程序可以刷新任何STM32处理器,包括比较旧的CANable 1.0。
刷新固件几乎没有风险,因为该处理器具有硬编码的引导加载程序,不会被轻易擦除。固件烧录完成后,重新上电或退出DFU模式,蓝绿色LED灯会进行交替闪烁,如果没有,那就表明固件未能正常工作,可能是因为固件上传出现了错误,需要重新烧录。在烧录固件之前,建议使用"Download"按钮,就可以将当前固件保存到DFU文件中,以作备份。
固件更新程序使用的是意法半导体(STMicroelectronics)开发的DFU文件格式,其中还包含了名称、目标、版本、内存地址等附加信息。如果想要烧录其他固件格式,例如 BIN、HEX或S19,可以将其复制到"Firmware"子文件夹中,固件更新程序会自动将这些文件转换为与当前所选设备匹配的DFU文件。
在烧录固件之前,还必须选择目标内部闪存。固件更新程序还可以写入选项字节(Option Bytes)和一次性可编程存储器(OTP),但不建议新手这么做。
单击"Identify"按钮后,CANable上的LED指示灯会闪烁,再次单击时停止闪烁。如果同时连接了多个适配器,此功能可以帮助区分正在通信的是哪个适配器。
点击"Disable Pin Boot0"会禁用掉Boot0引脚,这意味着即使设置了DFU模式跳线,处理器也不会进入DFU模式。不过您仍然可以通过单击"Enter DFU mode"按钮恢复此设置。新的CANable 2.5固件里包含了一个进入引导加载程序的命令,也就是说烧录了新固件之后,无需在主板上设置跳线就可以进入DFU模式。
2.9 LED指示灯含义
红色指示灯连接USB接口的5V电源,用于表示CANable的供电状态,不受处理器控制。
| LED状态 | 含义 | LED状态 | 含义 |
|---|---|---|---|
![]() |
适配器已准备就绪并关闭 | ![]() |
①适配器处于打开状态:无 CAN 总线流量②适配器处于固件更新模式③USB总线处于睡眠模式下。 |
![]() |
①适配器已打开:RX CAN 总线流量②适配器已关闭:已收到 USB 命令 | ![]() |
适配器在发生严重错误后被阻塞:缓冲区溢出或总线关闭 |
![]() |
适配器已打开:TX CAN 总线流量 | ![]() |
①通电后,两个LED灯交替闪烁②点击"识别"按钮时 |
![]() |
适配器已打开:RX+TX CAN 总线流量 |
ElmüSoft修复了LED指示灯的行为问题,旧版Slcan固件完全不显示CAN总线发送(TX)流量,即使出现错误且数据包未发送,也会使TX LED指示灯闪烁。新的CANable 2.5固件,两个LED指示灯都能准确显示 CAN 总线上发生的情况:
(1)绿色 TX LED 指示灯仅在 CAN 数据包成功发送并被接收方确认后才会闪烁;
(2)蓝色 RX LED 指示灯在接收到 CAN 数据包时始终闪烁,即使数据包被过滤器拦截。
2.10 上位机软件
官方建议CANable用户使用上位机Cangaroo,但是它无法计算任何给定波特率/采样点组合的设置。它只为16 MHz、48 MHz和170 MHz时钟频率的处理器实现了硬编码的表格。Cangaroo提供的CAN总线波特率选项非常有限,采样点选项则更少,当连接其他时钟频率(例如160 MHz)的适配器时,将无法选择任何波特率。Cangaroo无法显示任何错误信息。Cangaroo对WinUSB的使用方式不正确,这可能会导致在高总线负载下数据包顺序错误。Cangaroo甚至还可能突然无限期地卡住甚至崩溃。
现在CANable可以在HUD ECU Hacker使用了,这是一款高质量的软件。Elmue表示这是一款慈善软件,如果您喜欢这款软件,可以向你选择的慈善机构捐款。HUD ECU Hacker是一款功能强大的工具,拥有众多特性,堪称CAN总线和ECU的瑞士军刀。
CAN原始终端允许您查看CAN总线流量并手动发送数据包,并支持同时打开多个终端窗口,每个适配器对应一个窗口。您还可以编写宏脚本来接收数据包并发送响应,模拟任何CAN控制器。您可以从CAN总线流量中获取日志文件,还可以将整个日志文件的内容发送到CAN总线。
此外,HUD ECU Hacker还有一个嗅探终端,它可以在不产生干扰的情况下静默嗅探CAN总线流量。在嗅探终端中,数据包通常不会被确认,适配器以静默模式工作。
如果HUD ECU Hacker仅仅只能显示通过CAN总线传输的原始数据包,那它还称不上全能,HUD ECU Hacker还可以解码ISO 15765、J1939和NMEA 2000协议。J1939 协议用于公路车辆、工程车辆、农业车辆和林业车辆,NMEA 2000协议则用于游艇、帆船、渔船和船舶。提供DBC文件给HUD ECU Hacker,它甚至可以解码任何车辆的CAN数据包。(上述的这些上位机功能您都可以在HUD ECU Hacker的官方网址了解详情:https://netcult.ch/elmue/HUD ECU Hacker/#J1939)
2.11 CANbus设置
关于CANbus的设置,我们把它分到了使用教程那个章节,这里不多做说明。
2.12 CAN总线过滤器
CAN总线过滤器是旧版本没有的新功能,它可以大幅降低USB接口的流量,这有时非常重要,USB的速度限制为 12 Mbit/s,而CAN数据的传输速率最高可达10 Mbaud,所有您不感兴趣的流量都不会通过USB发送。下图显示了一个过滤器,它只允许CAN ID范围为18EE0000到18EEFFFF的数据包通过。
想要了解CAN总线过滤器的细节描述,需要您在HUB ECU Hacker的手册中查看(手册网址:https://netcult.ch/elmue/HUD ECU Hacker/#CAN_Filter)
注意:
①当接收到CAN数据包时,蓝色LED会闪烁。当数据包被过滤器拦截时,蓝色LED也会闪烁。这意味着,即使您的过滤器拦截了所有数据包,绿色和蓝色LED也始终会显示完整的CAN总线流量。
②STM32处理器不允许在适配器打开后修改过滤器,唯一的例外是,单个过滤器可以被另一个相同类型的过滤器(11/29位)替换。
2.13 采样点和波特率
对于传统的CAN总线,采样点并不重要。但如果想要使用CAN FD总线,就必须输入正确的采样点,否则会出现总线错误。因为在CAN总线上,许多控制器必须使用完全相同的设置才能相互同步,正确的采样点对于连接到CAN FD总线至关重要。

CAN数据包中的一位被细分为多个时间片,在本例中为十六个。采样点是处理器测量 CAN总线状态(高电平或低电平)的精确时刻。采样点必须是两个整数的分数:1/2 = 50%,3/4 = 75%,5/8 = 62.5%,4/5 = 80%,7/8 = 87.5%。较晚的采样点具有允许使用更长电缆的优势,可以补偿远距离控制器的延迟。较早的采样点的优势在于它对廉价的、不精确的振荡器和抖动的抵抗能力更强。
但主要问题在于CAN FD会在BRS位采样点精确切换波特率,如果您没有正确输入这两个采样点,则无法与CAN总线通信,您可以在Elmue的Oszi波形分析仪手册中找到更详细的说明以及示波器屏幕截图(https://netcult.ch/elmue/Oszi-Waveform-Analyzer/#DecodeCAN)。
处理器需要3个设置来配置波特率和采样点:
①比特率预分频器:CAN时钟经预分频器分频后得到一个时间片的时钟信号;
②段1:定义采样点之前的时间片数量(上例中为 11);
③段2:定义采样点之后的时间片数量(上例中为 4)。
STM32 处理器会单独处理同步段,因此必须将段1的值加1,例如:CAN时钟=160MHz,波特率=500kBaud,采样点=75%,每比特时间片(TQ)=16。这可以通过向处理器传递以下设置来实现:预分频器=20,段1=11,段2=4。
Baudrate=160 MHz / 20 / (1 + 11 + 4)=500kbaud
Samplepoint= (1 + 11) / (1 + 11 + 4)=0.75=75%
旧版Slcan固件对CAN FD波特率的选择非常有限:仅支持2兆波特和5兆波特。,旧版Candlelight固件理论上可以设置任何可能的波特率。
为了进行计算,主机应用程序必须知道预分频器、Segment1和egment2设置的范围,而每个处理器对这些值的取值范围都不同,旧版Candlelight固件报告的范围是错误的,因此无法进行正确的计算。
摘要:旧版固件均无法根据需要设置精确的波特率/采样点。此外,旧版固件使用的CAN时钟频率为 170 MHz,这并非明智之选,应用程序无法从170 MHz的频率下导出2、4、5或8 Mbps的波特率,以及50%、62.5%、75% 或 87.5%的采样点。因此新的CANable 2.5固件将CAN时钟频率更改为160 MHz。
意法半导体建议标称波特率和数据波特率使用相同的预分频器,波特率就会在 BRS 位采样点处精确切换。而如果波特率未使用相同的预分频器,则会导致相位偏移,从而可能破坏时序。另一个建议是预分频器的值应该尽可能低。
同步跳变宽度应为:SJW=min(Segment1, Segment2),SJW 定义了处理器允许接受相位抖动进行重新同步的最大时间间隔。
更多详情请参阅Documentary子文件夹中的PDF文档(https://github.com/Elmue/CANable-2.5-firmware-Slcan-and-Candlelight/tree/main/Documentation)。
所有这些波特率/采样点相关的设置都非常复杂,而且旧代码中存在很多bug,所以新固件添加了一个检查机制。主机应用程序会将标称波特率和数据波特率对应的预分频器、第1段和第2段的值发送给固件。固件会计算出精确值,并通过调试信息将其返回给主机应用程序。
打开适配器后,您会看到来自固件的以下调试信息:
Nominal: 500k baud, 87.5%; Data: 2M baud, 75.0%; Perfect match: Yes
当您看到"完美匹配:是"时,这意味着"标称"和"数据"使用推荐的相同预分频器。注意,要实现上述设置,可以使用多种计算方法,例如:
①标称=[预分频器:2,段1:139,段2:20, SJW:20]和数据=[预分频器:2,段1:29,段2:10,SJW:10]
②标称=[预分频器:10,段1:27,段2:4,SJW:4]和数据=[预分频器:10,段1:5, 段2:2,SJW:2]
这两个示例都能得到相同的波特率和采样点。但是,第一个示例可以正常工作,而第二个示例在使用BRS发送数据包时会产生总线关闭错误!
始终选择尽可能小的预分频器,这样可以获得更精细的重新同步粒度。如果您让HUD ECU Hacker为您找到最佳值,则无需关心这些数学计算。HUD ECU Hacker实现了一套复杂的算法,可以自动完成所有这些计算。您只需输入波特率和采样点,HUD ECU Hacker就会为您计算出最佳设置。如果某个采样点无法精确匹配,它会显示警告并使用最接近的值。如果某个波特率无法匹配,它会显示错误信息。

2.14 CANbus错误
旧版Slcan固件完全没有错误报告机制,当向CAN总线发送数据包时,根本无法确定数据包是否已成功发送。如果在设置波特率时发送无效参数,您将永远无法得知没能连接到CAN总线的原因。旧版Candlelight固件虽然有错误报告机制,但仅限于CAN总线错误,而且存在诸多问题。
新版本固件实现了针对CAN总线错误和命令错误的完善错误报告机制,您将永远不会再遇到无法正常工作却又不知原因的情况。CAN总线上的第一个错误会立即报告。第二个错误会在100毫秒后报告,并且仅当第二个错误与之前报告的错误不同时才会报告,这样可以避免像旧版固件那样,向主机发送成千上万个错误信息。如果同一错误持续存在很长时间,则会每隔3秒报告一次。
21:20:14.788Send Packet
21:20:14.78818EEFF01: 01 02 03 04 05 06 07 08 <------ 此数据包已成功发送
21:20:14.79018EEFF01: 01 02 03 04 05 06 07 08 <------ 这是发射回波
21:20:18.119Send Packet <------ 开启自动重传功能
21:20:18.11914A90022: 01 02 03 04 05 06 07 08 <------ 该数据包未被确认
21:20:18.120Bus Active, Tx Errors: 8 <------ 第一个错误立即发生
21:20:18.220Bus Passive, No ACK received, Tx Errors: 128 <------ 100毫秒后出现第二个错误
21:20:18.738Send Packet
21:20:18.73814A90022: 01 02 03 04 05 06 07 08 <------ 该数据包未被确认
21:20:21.216Bus Passive, No ACK received, Tx Errors: 128
21:20:24.212Bus Passive, No ACK received, Tx Errors: 128 <------每隔3秒重复出现同样的错误
21:20:27.208Bus Passive, No ACK received, Tx Errors: 128
CAN总线上的所有控制器共享相同的两条数据线,如果只有一个控制器出现故障并违反了CAN总线规则,就会扰乱所有其他控制器的通信。因此控制器在检测到问题时关闭其发送器至关重要。这种错误检测必须通过硬件实现,并且必须快速可靠。所有带有CAN总线控制器的处理器都会区分以下四种状态:
①总线活动(无错误或错误数少于 96 个)
②警告级别(错误数在 96 到 128 个之间)
③总线被动(错误数在 128 到 248 个之间)
④总线关闭(错误数超过 248 个)
在仲裁阶段,允许多个控制器同时发送数据。其中一个控制器将赢得仲裁。但在数据阶段,只能有一个控制器发送数据。如果处理器检测到严重的数据损坏,它会立即停止发送并进入总线关闭状态。总线关闭是一个严重的错误,可以通过在配置了不同波特率的两个适配器之间发送数据包来创建。
22:21:24.187Send Packet
22:21:24.187170AA3CB: 01 02 03 04 05 06 07 08
22:21:24.623Bus Passive, Bit stuffing error, Tx Errors: 128, Rx Errors: 8 <------发送发生损坏
22:21:27.618Bus Passive, Recessive bit error, Tx Errors: 128, Rx Errors: 8
22:21:30.367Bus Off, Frame format error, Tx Errors: 248, Rx Errors: 127 <------接收发生损坏
只要稍有经验,你就可以通过了解这些错误的含义来推断 CAN 总线上的问题所在。如果出现严重错误,例如总线关闭或缓冲区溢出,绿色和蓝色 LED 指示灯将常亮。
2.15 发送超时
如果启用了自动重传功能,且处理器未收到确认(ACK),则会进入发送总线被动状态。在此状态下,处理器会无限重传发送FIFO中的第一个数据包,导致总线负载高达 95%。"总线被动"这个名称完全具有误导性。总线并非处于被动状态,而是被大量数据淹没。在示波器上,您可以看到同一个数据包被反复重传,几乎没有停顿(https://netcult.ch/elmue/Oszi-Waveform-Analyzer/)。

因此,Elmue实现了一个交易超时机制。待处理的交易请求会在500毫秒后被取消。您会看到一条错误报告:
Bus Passive, Tx Timeout, No ACK received, Tx Errors: 128
错误计数器在达到 128 时停止计数,但如果没有超时,可能会出现数千次传输失败的尝试。
2.16 发射回波标记
旧版Slcan固件从未提供过数据包是否已发送的反馈。
旧版Candlelight固件的Tx数据包反馈机制设计存在缺陷:当固件接收到Tx数据包时,它会将整个Tx数据包以虚假事件的形式发送回主机,无论数据包是否真的发送到了CAN总线,这种反馈都是即时的。对于一个包含8个数据字节的CAN FD数据包,固件会通过USB向主机发送一个80字节的虚假事件。这些虚假事件会产生大量无用的USB流量,无法关闭,而且时间戳也是错误的。

新固件可以从主机应用程序接收每个发送数据包的8位标记。当数据包成功发送到CAN总线后,处理器会触发一个包含该标记的Tx事件。主机应用程序必须将最后发送的数据包存储在内部数组中(请参考演示应用程序的代码,见4.1章节)。适配器最多可存储64 + 3 = 67个数据包。8位标记的值范围为0到255,足以为每个Tx数据包提供一个唯一的标记,其优势在于用户可以可靠地反馈哪些数据包已实际发送。在单次传输模式(无重传)下,这是判断数据包是否已被确认的唯一方法。用户还可以查看数据包发送到CAN总线的确切时间。通过使用标记,只需将一个字节而非整个数据包传输回主机(参见3.4章节的示例)。
2.17 时间戳
一些Slcan固件会通过USB向主机应用程序发送时间戳,每个接收到的数据包都会附带一个8个ASCII字符组成的32位的时间戳。使用ASCII协议本身效率就不高(见2.6章节),但通过在每个数据包中添加额外的8个字节来进一步降低USB传输速度并不是一个好办法。
CANable 2.5固件已经尽可能地优化了速度,因此Slcan特意没有实现时间戳功能,但为了向后兼容,保留了1微秒的时间戳,这些时间戳仅占用4个字节,并且可以关闭。
不过更建议使用计算机CPU中性能计数器生成的时间戳(https://learn.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter),64位计数器的精度是纳秒级的。当数据包通过USB接口送达时,您可以为其添加时间戳。C++演示应用程序(见4.1章节)展示了如何使用固件和性能计数器生成的时间戳。
2.18 DFU模式
新的Slcan和Candlelight固件新增了一个进入DFU模式的命令,不再需要启动模式跳线,固件在进入启动模式前会启用BOOT0引脚(如果之前被禁用的话)。如果 BOOT0 引脚被禁用,处理器在收到硬件复位指令之前不会进入启动模式。这意味着只有在BOOT0引脚之前被禁用的情况下,用户才必须重新连接USB接口。
与旧版固件不同,新版固件在进入启动模式前会有300毫秒的延迟。这确保始终会向主机发送反馈,告知命令是否成功。
2.19 Bug修复
新固件修复了旧固件中的几个漏洞,其中最严重的漏洞包括:
①Candlelight固件在缓冲区溢出后可能会完全崩溃;
②Candlelight的设计存在缺陷:它只使用一个缓冲区来处理 CAN 接收和发送,这导致在发生CAN缓冲区溢出后,它甚至无法向主机发送错误状态;
③Candlelight无法正确发送USB数据,大小正好为64字节的USB数据包送达时格式会发生错误。
2.20 总线负载
新固件可以计算总线负载,并以百分比形式显示,显示间隔可由用户定义。HUD ECU Hacker会在"跟踪"窗格中每5秒显示一次总线负载(如果负载不为零)。总线负载的计算相当复杂,可能存在+/- 10%的偏差。
2.21 收发器延迟
CAN总线收发器芯片的延迟对于高于1兆波特的波特率非常重要,处理器会自动测量延迟,固件会将其报告。在发送第一个设置了BRS标志的CAN FD数据包后,会看到一条调试信息:
23:32:21.06919858A01: 0C 00 00 00 F0 18 51 0E (FDF, BRS)
23:32:21.073Measured transceiver chip delay: 131 ns
23:32:21.07319858A01: 0C 00 00 00 F0 18 51 0E (FDF, BRS)
通常,收发器芯片的延迟约为50纳秒,但在这里看到的MKS Makerbase中的独立芯片延迟更低。
第3部分 Slcan应用程序开发手册
本手册适用于希望通过计算机与CANable 2.5通信的软件开发人员。Slcan使用USB CDC 接口,所有命令和响应均以ASCII字符串形式发送,速度较慢(参考2.6章节)。因此对于专业应用,建议使用Candlelight而非Slcan。
第一个字符是要执行的指令,最后一个字符始终是回车符。
3.1 Slcan 指令
| 指令 | 状态 | 版本 | 含义 | 补充说明 |
|---|---|---|---|---|
| "A1\r" | 关闭 | 原版 | 启用自动重传 | 重传数据包直至收到确认 |
| "A0\r" | 关闭 | 原版 | 禁用自动重传 | 启用单次发送模式 |
| "C\r" | 开启/关闭 | 原版 | 关闭适配器 | 关闭 CAN 连接,重置为默认设置 |
| "L7\r" | 开启/关闭 | 100 | 启用每 700 毫秒一次的总线负载报告 | L1:报告间隔= 100 毫秒,L50:间隔= 5 秒,有效间隔范围:0至100(最长10秒) |
| "L0\r" | 开启/关闭 | 100 | 禁用总线负载报告 | 参考上一行 |
| "O\r" | 关闭 | 原版 | 开启适配器 | 以 M0 / M1 设置的模式连接到 CAN 总线 |
| "ON\r" | 关闭 | 100 | 以正常模式打开 | 忽略带有 M0 / M1 的设置 |
| "OS\r" | 关闭 | 100 | 以静默模式打开 | 忽略带有 M0 / M1 的设置 |
| "OI\r" | 关闭 | 100 | 以内部环回模式打开 | 忽略带有 M0 / M1 的设置 |
| "OE\r" | 关闭 | 100 | 以外部环回模式打开 | 忽略带有 M0 / M1 的设置 |
| "V\r" | 开启/关闭 | 原版 | 返回详细信息:版本/开发板/MCU/限制 | 返回七个键值对,请参阅版本信息(3.3章节)。 |
| 设置模式 | 状态 | 版本 | 含义 | 补充说明 |
|---|---|---|---|---|
| "M1\r" | 关闭 | 原版 | 启用静默模式 | 下一个命令"O\r"将以总线监视模式打开。 |
| "M0\r" | 关闭 | 原版 | 禁用静默模式 | 下一个命令"O\r"将以正常模式打开 |
| "MA\r" | 关闭 | 100 | 启用自动重传模式(与A1相同) | 重传数据包直至收到确认 |
| "Ma\r" | 关闭 | 100 | 禁用自动重传模式(与 A0 相同) | 启用单次发送模式 |
| "MD\r" | 开启/关闭 | 100 | 启用调试消息 | 固件向主机发送字符串消息 |
| "Md\r" | 开启/关闭 | 100 | 禁用调试消息 | 不发送调试消息 |
| "ME\r" | 开启/关闭 | 100 | 启用CAN错误报告 | CAN错误信息会发送给主机 |
| "Me\r" | 开启/关闭 | 100 | 禁用CAN错误报告 | 弃用CAN错误报告功能 |
| "MF\r" | 开启/关闭 | 100 | 启用反馈模式 | 每个命令都发送成功/错误反馈 |
| "Mf\r" | 开启/关闭 | 100 | 关闭反馈模式 | 弃用命令反馈模式 |
| "MI\r" | 开启/关闭 | 100 | 启用识别模式 | 绿/蓝LED灯开始闪烁 |
| "Mi\r" | 开启/关闭 | 100 | 禁用识别模式 | LED灯停止闪烁 |
| "MM\r" | 开启/关闭 | 100 | 启用Tx回声报告标记 | 报告所有成功发送的数据包,并添加标记 |
| "Mm\r" | 开启/关闭 | 100 | 禁用Tx回声报告标记 | 无Tx Echo报告 |
| "MR\r" | 开启/关闭 | 100 | 启用120Ω终端电阻 | 仅少数主板支持 |
| "Mr\r" | 开启/关闭 | 100 | 禁用120Ω终端电阻 | 仅少数主板支持 |
| "MS\r" | 开启/关闭 | 100 | 启用ESI报告 | 报告接收到的CAN FD消息的ESI标志 |
| "Ms\r" | 开启/关闭 | 100 | 禁用ESI报告 | 无ESI报告 |
| "MDEFMS\r" | 开启/关闭 | 100 | 启用调试、错误、反馈、回显、ESI报告 | 您可以使用一条命令一次性设置所有模式 |
| 设置波特率 | 状态 | 版本 | 含义 | 补充说明 |
|---|---|---|---|---|
| "S0\r" | 关闭 | 原版 | 设置标称波特率为10kbaud | 采样点 87.5% |
| "S1\r" | 关闭 | 原版 | 设置标称波特率为20kbaud | 采样点 87.5% |
| "S2\r" | 关闭 | 原版 | 设置标称波特率为50kbaud | 采样点 87.5% |
| "S3\r" | 关闭 | 原版 | 设置标称波特率为100kbaud | 采样点 87.5% |
| "S4\r" | 关闭 | 原版 | 设置标称波特率为125kbaud | 采样点 87.5% |
| "S5\r" | 关闭 | 原版 | 设置标称波特率为250kbaud | 采样点 87.5% |
| "S6\r" | 关闭 | 原版 | 设置标称波特率为500kbaud | 采样点 87.5% |
| "S7\r" | 关闭 | 原版 | 设置标称波特率为800kbaud | 采样点 87.5% |
| "S8\r" | 关闭 | 原版 | 设置标称波特率为10Mbaud | 采样点 87.5% |
| "S9\r" | 关闭 | 原版 | 设置标称波特率为83.333kbaud | 采样点 87.5% |
| "Y0\r" | 关闭 | 100 | 设置CAN FD数据波特率为500kbaud | 采样点 75% 已弃用 |
| "Y1\r" | 关闭 | 100 | 设置CAN FD数据波特率为1Mbaud | 采样点 75% 已弃用 |
| "Y2\r" | 关闭 | 原版 | 设置CAN FD数据波特率为2Mbaud | 采样点 75% 已弃用 |
| "Y4\r" | 关闭 | 100 | 设置CAN FD数据波特率为4Mbaud | 采样点 75% 已弃用 |
| "Y5\r" | 关闭 | 原版 | 设置CAN FD数据波特率为5Mbaud | 采样点 75% 已弃用 |
| "Y8\r" | 关闭 | 100 | 设置CAN FD数据波特率为8Mbaud | 采样点 50% (75%不工作) 已弃用 |
| "s4,69,10,7\r" | 关闭 | 100 | 设置标称比特率:预分频器=4,Seg1=69,Seg2=10,同步跳转宽度=7 | 设置500 kbaud, 采样点 87.5%见2.13章节 |
| "y4,9,10,7\r" | 关闭 | 100 | 设置数据比特率:预分频器=4,Seg1=9,Seg2=10,同步跳转宽度=7 | 设置 2 Mbaud, 采样点 50%见2.13章节 |
| 设置过滤器 | 状态 | 版本 | 含义 | 补充说明 |
|---|---|---|---|---|
| "F7E8,7FF\r" | 关闭 | 100 | 设置一个仅用于单个ID的掩码过滤器:7E8(11位) | 您最多可以设置8个掩码过滤器,以分号分隔,11位和29位过滤器可以混合使用,请参阅2.12章节 |
| "F18DA00F1,1FFF00FF\r" | 关闭 | 100 | 为256个ID设置掩码过滤器:18DAXXF1(29位) | 同上 |
| "F7E0,7F0;720,7F0;730,7F0\r" | 关闭 | 100 | 设置3个过滤器,每个过滤器可处理16个 ID:7EX、72X和73X | 同上 |
| "f\r" | 关闭 | 100 | 清除所有筛选条件 | 移除所有筛选条件 |
| Boot模式 | 状态 | 版本 | 含义 | 补充说明 |
|---|---|---|---|---|
| "*Boot0:Off\r" | 关闭 | 100 | 禁用引脚BOOT0 | 见2.2章节 |
| "*Boot0:?\r" | 开启/关闭 | 100 | 请求引脚BOOT0的状态 | 如果启用,则返回"+1\r";如果禁用,则返回"+0\r"。 |
| "*DFU\r" | 开启/关闭 | 100 | 启用引脚BOOT0并进入DFU模式 | 如果反馈 = FBK_ResetRequired:重新连接USB电缆 |
| 发送数据包 | 状态 | 版本 | 含义 | 补充说明 |
|---|---|---|---|---|
| "Txxxxxxxxx\r" | 开启 | 原版 | 发送带有29位ID的经典数据包 | Bits: IDE 见3.4章节 |
| "txxxxxxxxx\r" | 开启 | 原版 | 发送带有11位ID的经典数据包 | Bits: None |
| "Rxxxxxxxxx\r" | 开启 | 原版 | 发送带有29位ID的远程传输请求 | Bits: RTR + IDE |
| "rxxxxxxxxx\r" | 开启 | 原版 | 发送带有11位ID的远程传输请求 | Bits: RTR |
| "Dxxxxxxxxx\r" | 开启 | 原版 | 发送CAN FD数据包,29位,无波特率切换 | Bits: FDF + IDE |
| "dxxxxxxxxx\r" | 开启 | 原版 | 发送CAN FD数据包,11位,无波特率切换 | Bits: FDF |
| "Bxxxxxxxxx\r" | 开启 | 原版 | 发送CAN FD数据包,29位,带波特率开关 | Bits: FDF + BRS + IDE |
| "bxxxxxxxxx\r" | 开启 | 原版 | 发送CAN FD数据包,11位,带波特率开关 | Bits: FDF + BRS |
注意:请勿将S和Y命令用于CAN FD总线,它们无法选择正确的采样点。您可以使用它们在桌面上的两个适配器之间进行测试,但如果要连接到实际的CAN FD总线,则不能使用它们。例如,如果您要连接到使用CAN FD总线的汽车,则必须知道CAN总线使用的两个采样点。然后必须根据所需的波特率和采样点计算预分频器、段1和段2的值,并使用S和Y命令。如果使用错误的设置连接到CAN FD总线,您将收到"总线被动"甚至"总线关闭"错误(参阅2.13章节)。
3.2 Slcan响应和事件
| 反馈 | 版本 | 含义 | 补充说明 |
|---|---|---|---|
| "#\r" | 100 | 命令已成功执行 | 需要启用反馈模式 |
| "#1\r" | 100 | 命令无效 | 需要启用反馈模式 |
| "#2\r" | 100 | 命令的某个参数无效 | 需要启用反馈模式 |
| "#3\r" | 100 | 该命令要求适配器处于开启状态 | 需要启用反馈模式 |
| "#4\r" | 100 | 该命令要求适配器处于关闭状态 | 需要启用反馈模式 |
| "#5\r" | 100 | 意法半导体的HAL报告了一个错误 | 需要启用反馈模式 |
| "#6\r" | 100 | 该功能主板不支持/尚未实现 | 需要启用反馈模式 |
| "#7\r" | 100 | CAN 发送缓冲区已满(未收到ACK,有67个数据包等待) | 需要启用反馈模式 |
| "#8\r" | 100 | CAN总线已关闭(发生严重的CAN错误) | 需要启用反馈模式 |
| "#9\r" | 100 | 在静默模式下无法发送数据包 | 需要启用反馈模式 |
| "#:\r" | 100 | 尚未设置所需的波特率 | 需要启用反馈模式 |
| "#;\r" | 100 | 对闪存中的选项字节进行编程失败 | 需要启用反馈模式 |
| "#<\r" | 100 | 请重新连接USB连接线,需要进行硬件重置 | 需要启用反馈模式 |
| 响应 | 版本 | 含义 | 补充说明 |
|---|---|---|---|
| "+Text\r" | 100 | 固件会向命令发送文本响应 | 用于命令"*Boot0:?\r"和"V\r" |
| 事件 | 版本 | 含义 | 补充说明 |
|---|---|---|---|
| ">Message\r" | 100 | 固件发送调试信息(纯文本) | 需要启用调试消息 |
| "Exxxxxxxx\r" | 100 | 固件会报告CAN错误状态(见3.5章节) | 需要启用CAN错误报告 |
| "L27\r" | 100 | 固件计算出的总线负载为27%,如果总线负载为零,则不发送报告 | 需要启用canbus负载报告。 |
| "M3C\r" | 100 | 固件报告Tx回显标记0x3C(见3.4章节) | 需要启用Tx Echo Report标记 |
| 接收数据包 | 版本 | 含义 | 补充说明 |
|---|---|---|---|
| "Txxxxxxxxx\r" | 原版 | 收到带有29位ID的经典数据包 | Bits: IDE (见3.4章节) |
| "txxxxxxxxx\r" | 原版 | 收到带有11位ID的经典数据包 | Bits: None |
| "Rxxxxxxxxx\r" | 原版 | 收到带有29位ID的远程传输请求 | Bits: RTR + IDE |
| "rxxxxxxxxx\r" | 原版 | 收到带有11位ID的远程传输请求 | Bits: RTR |
| "Dxxxxxxxxx\r" | 原版 | 已收到CAN FD数据包,29位,无波特率切换 | Bits: FDF + IDE |
| "dxxxxxxxxx\r" | 原版 | 已收到CAN FD数据包,11位,无波特率切换 | Bits: FDF |
| "Bxxxxxxxxx\r" | 原版 | 已收到CAN FD数据包,29位,带波特率开关 | Bits: FDF + BRS + IDE |
| "bxxxxxxxxx\r" | 原版 | 已收到CAN FD数据包,11位,带波特率开关 | Bits: FDF + BRS |
3.3 Slcan 版本信息
在新固件中,命令"V\r"返回一个包含七个键值对的字符串,键值对之间以制表符分隔。它以加号 (+) 开头,表示命令响应包含文本内容,而不是反馈响应 (#)。
+Board: MksMakerbase\t
MCU: STM32G431\t
DevID: 1128\t
Firmware: 2427156\t
Slcan: 100\t
Clock: 160\t
Limits: 512,256,128,128,32,32,16,16\r
将此字符串在每个制表符('\t')处分割,然后再在每个部分以冒号处分割,将得到7个键值对:
| 关键字 | 值 | 补充说明 |
|---|---|---|
| Board | MksMakerbase | 这定义了固件是为哪个开发板编译的,如果用户上传了错误的固件,则可能与实际硬件不匹配,见2.8固件版本表格 |
| MCU | STM32G431 | 这定义了固件编译时所针对的处理器,如果用户上传了错误的固件,则可能与实际处理器不匹配,见2.8固件版本表格 |
| DevID | 1128 | 这是实际处理器的"Device ID"。将1128转换为十六进制,得到0x468,每个处理器系列都由一个唯一的"Device ID"标识,在意法半导体(STMicroelectronics)的参考手册中,您可以找到以下标识符:①0x468 = 2 类设备(STM32G431、STM32G441)②0x469 = 3 类设备(STM32G471、STM32G473、STM32G474、STM32G483、STM32G484)③0x479 = 4 类设备(STM32G491、STM32G4A1) |
| Firmware | 2427156 | 旧版固件返回的版本号完全没有意义,例如"ba6b1dd"。这里显示的版本号表示固件的创建日期,将其转换为十六进制后,得到BCD版本号0x250914,表示2025年9月14日 |
| Slcan | 100 | 这是您在上方表格"版本"列中看到的Slcan模块版本。ElmüSoft创建的第一个版本是版本100,其中包含此处描述的所有功能。未来的版本将是 101、102 等,并包含新的命令,这些命令将在此处记录。使用此版本号来确定固件支持哪些功能。 |
| Clock | 160 | CAN时钟频率为160MHz |
| Limits | 512,256,128,128,32,32,16,16 | 这8个值是比特率命令"s"和"y"的上限。每个处理器对预分频器、Segment1、Segment2和同步跳转宽度(SJW)的限制各不相同。标称波特率:最大预分频器 = 512,最大 Segment1 = 256,最大 Segment2 = 128,最大 SJW = 128FD, 数据波特率:最大预分频器 = 32,最大 Segment1 = 32,最大 Segment2 = 16,最大 SJW = 16,见2.13章节 |
3.4 Slcan数据包
所有数据包均按以下模式传输:
①数据包类型:T、t、R、r、D、d、B或b(参见上表);
②CAN ID:11位CAN ID为3位数字,29位CAN ID为8位数字;
③DLC:1位数字(数据字节数)
经典数据包:DLC = '0'至'8';
CAN FD:'8' = 8字节,'9' = 12字节,'A' = 16字节,'B' = 20字节,'C' = 24字节,'D' = 32字节,'E' = 48字节,'F' = 64字节;
④数据字节数:经典数据包:0 至 8,CAN FD:8 至 64 字节;
⑤仅适用于发送数据包,且仅当启用发送回显标记时:一个2位数字标记;
⑥仅适用于接收数据包,且仅当启用ESI报告时:如果发送节点是错误被动的,则显示字符"S"。
| 方向 | 数据包 | Slcan | 补充说明 |
|---|---|---|---|
| 双向 | 18AABBCC: 11 22 33 44 55 | "T18AABBCC51122334455\r" | CAN, 29 bit ID |
| 双向 | 7E0: 11 22 33 44 55 66 77 88 99 AA BB CC | "d7E09112233445566778899AABBCC\r" | CAN FD, 11 bit, FDF |
| 接收 | 7E0: 11 22 33 44 55 66 77 88 | "b7E081122334455667788S\r" | FDF, BRS, ESI |
| 发送 | 7E0: 11 22 33 44 55 66 | "t7E061122334455663F\r" | Marker = 3F |
注意:如果数据包后面有任何额外的字符,则表示语法错误,示例:
Tx: "t7E061122334455663F\r" <------发送带有标记3F的数据包
Rx: "#\r" <------收到命令反馈(成功)
Rx: "M3F\r" <------接收回声标记3F
3.5 Slcan错误报告
启用CAN总线错误报告后,至少出现一个错误时才会收到错误报告。错误报告会立即发送、在100毫秒或3秒后发送,错误报告的格式始终为"Exxxxxxxx\r",包含 5 个部分:
| 数字 | 含义 | 值 |
|---|---|---|
| 1 | CANbus 状态 | '0' = Bus Active,'1' = Warning Level,'2' = Bus Passive,'3' = Bus Off |
| 2 | 最新协议错误 | '0' = None,'1' = Bit填充错误,'2' =帧格式错误,'3' =未收到确认信息,'4' =隐性比特错误,'5' =主导比特错误,'6' = CRC错误 |
| 3 + 4 | 固件错误标志 | 0x00 = None,0x01 = Rx失败,0x02 = Tx失败,0x04 = CAN发送缓冲区溢出,0x08 = USB输入缓冲区溢出,0x10 = Tx超时,可以组合使用多个标志 |
| 5 + 6 | Tx 错误数 | 0 ... 255 errors |
| 7 + 8 | Rx 错误数 | 0 ... 255 errors |
例如:"E2310800C\r"表示:总线处于被动状态,未收到ACK,发送超时,发送错误128次,接收错误12次。
3.6 Slcan初始化
连接到CANable 2.5适配器时,应按以下步骤操作:
1、如果设备仍处于打开状态,请发送命令"C\r"以关闭设备。但此命令还有另一个用途:它会将固件中的所有内部变量重置为默认值,波特率和所有模式都会重置(恢复到传统模式),报告功能将被关闭,滤波器将被移除,接收/发送缓冲区也会被清空。注意:尽管反馈功能已启用,"Close"命令是唯一不发送反馈的命令。这样做的目的是让您始终可以将其作为第一个命令发送,而无需等待反馈。连接到CANable时,您无法确定用户连接的是传统设备还是CANable 2.5。此外,固件此时也无法确定您是否稍后会启用反馈模式。因此,"Close"命令的行为与传统命令完全相同:它永远不会发送反馈。
2、发送命令"V\r"以获取版本字符串,在制表符处分割响应字符串。如果收到7个或更多部分,则表示您正在与CANable 2.5通信,否则使用的是旧版固件。如果您不支持旧版设备,则显示错误消息,需要切换到旧版模式。如果是CANable 2.5,请使用Slcan版本号(100或更高)来检查哪些功能可用。
3、发送命令"MF\r"以启用反馈模式(或发送"MADEFMS\r"以启用您需要的所有其他模式)。这将是第一个发送反馈的命令,在此之后,您必须等待反馈"#\r"并检查错误,然后再发送下一个命令。
4、发送命令"S"或"s"以设置标称波特率。
5、如果您还发送命令"Y"或"y"来设置数据波特率,则固件将自动切换到CAN FD模式。
6、然后您可以选择设置过滤器。
7、最后执行命令"ON\r"以正常模式打开设备。下图显示的是手动发送到适配器的初始化序列,需使用HUD ECU Hacker中的RS232终端。您输入的用于打开COM端口的波特率无关紧要。该端口始终以最大USB速度(12 Mbps)运行。

第4部分 Candlelight应用程序开发手册
Candlelight 2.5固件可用于构建专业的高速CAN FD应用,Candlelight固件的控制比Slcan固件更为复杂。其中包含大量的结构体和枚举,如果在此一一解释,本手册篇幅将非常庞大。
4.1 C++ 演示应用程序
Elmue编写了一个可直接使用的C++ Candlelight类,您可以将其复制粘贴到您的项目中,这个功能强大且经过充分测试的类演示了新固件提供的所有功能:
• 检测并枚举所有已连接的Candlelight设备;
• 获取已连接设备的详细信息:USB描述符、板卡、处理器、版本号等;
• 设置波特率和采样点;
• 设置掩码过滤器;
• 打开/关闭/启动/重置;
• 发送数据包/接收数据包/处理Tx回显标记;
• 解码并显示CAN总线错误;
• 禁用启动引脚/进入DFU模式;
源代码包含详细的注释,方便您轻松理解其工作原理,该C++示例还展示了如何正确使用WinUSB.dll,这比乍看之下要复杂得多。例如,Cangaroo和Candle.NET对WinUSB的使用方式不正确,导致数据包丢失或数据包顺序错误,WinUSB需要一种微软文档中未提及的特殊编程方式。

4.2 新的ElmüSoft协议
传统的Candlelight协议存在一些设计缺陷,例如,当向主机发送CAN FD数据包时,时间戳被放置在一个固定长度为64字节的数据数组之后。这种不必要的举动导致即使数据包只有8个字节,也始终需要通过USB发送80个字节的数据。此外,传统的Candlelight协议最初设计的目的就是传输CAN数据包以外的任何数据,但它无法向主机传输其他数据,例如ASCII调试字符串。
因此,我不得不设计一种新的高效协议:ElmüSoft协议。它在通过USB传输时,仅在CAN数据包有效载荷中添加2个额外的字节。它采用极简的数据传输方式,并且非常易于扩展以满足未来的任何需求。
新的固件仍然保留了传统的Geschwister Schneider协议,但可以切换到新协议。新协议会发送针对Tx和Rx数据包、回显标记、调试消息、错误报告和总线负载事件的优化结构体。
您可以在演示应用程序中测试所有这些功能,上面的屏幕截图使用了来自计算机CPU的时间戳。它们被转换为精度为 1 微秒的本地时间。当您设置标志GS_DevFlagTimestamp时,演示程序会切换到适配器中生成的固件时间戳。它们没有任何优势,只会产生更多的 USB 流量,并且您会看到几行"无时间戳"的行。原因是固件时间戳仅适用于从固件接收的事件。但是当您向固件发送数据包时,不会收到时间戳。
4.3 进入DFU模式
向接口1 (DFU)发送带有DFU_Detach参数的SETUP请求以启用启动模式,然后立即发送带有DFU_GetStatus参数的SETUP请求以检查执行是否成功。如果状态为DfuState_AppIdle,适配器将在300毫秒后进入启动模式,如果状态为DfuState_AppDetach,则必须向用户显示一条消息,提示其重新连接USB接口。仅当引脚BOOT0之前被禁用时才需要重新连接USB接口,演示应用程序展示了整个过程。
请参阅"Documentation"子文件夹中的DFU功能描述符1.1.pdf的第17页和第22页。(https://github.com/Elmue/CANable-2.5-firmware-Slcan-and-Candlelight/tree/main/Documentation)
第5部分 固件开发人员手册
这是第一个由两个不同的人编写的固件整合成一个项目的项目,新的CANable 2.5固件使用相同的代码库来编译Slcan和Candlelight。CAN接口、错误处理、LED控制、进入DFU模式等功能都使用相同的代码,只有USB接口和命令执行器是单独实现的。每个项目都有一个独立的Makefile文件,其中包含相应的子文件夹:Slcan或Candlelight。
5.1 注意事项
本项目代码不适合初学者,您需要数年的嵌入式C编程经验和硬件知识。
5.2 添加新开发板
在settings.h文件中,您可以找到开发板的定义,目前包含MKS Makerbase和Openlight Labs开发板的引脚定义。新开发板必须在新的Makefile文件中定义为TARGET_BOARD。
5.3 添加新处理器
settings.h文件中还包含了ST Microelectronics的HAL(硬件抽象层)文件,对于其他系列的处理器,必须将所需的HAL文件添加到新的子文件夹中。新处理器必须在新的Makefile文件中定义为TARGET_MCU。
5.4 USB接口
USB接口是固件中最复杂的代码。意法半导体(ST Microelectronics)提供了一个HAL(硬件抽象层),它分散在11个文件中,文件之间相互调用。所有USB相关的代码都由多个中断处理程序调用。如果您不了解什么是SETUP请求、什么是OUT端点,或者阻塞端点意味着什么,我建议您阅读Documentation子文件夹中优秀的USB教程。
5.5 在Windows上编译STM32代码
您可以在网上找到很多关于如何在Linux上编译固件的教程,但是尽管编译过程相当简单,却没有针对Windows开发者的教程。
1、Cube Programmer
(原文这里是一大段对STM32 Cube Programmer的吐槽,这里就不放上来了)
2、安装步骤
①安装STM32 Cube CLT(STM32 命令行编译器),您可以从ST网站的下拉列表中选择最旧的版本(300 MB)。版本越新,体积越大,最新版本为1 GB,不过您大概率不需要这么大的版本;
②安装MinGW(适用于 Windows 的极简 GNU 框架),此安装仅需make.exe和mkdir.exe及其6个DLL文件:libgcc_s_dw2-1.dll、libiconv-2.dll、libintl-8.dll、msys-1.0.dll、msys-iconv-2.dll、msys-intl-8.dll
③将mkdir.exe重命名为mmkdir.exe,以避免与Windows控制台中的MKDIR命令冲突。
④在高级系统设置中搜索PATH变量,并添加两个用分号分隔的文件夹:CubeCLT安装 arm-none-eabi-gcc.exe文件的文件夹,MinGW安装make.exe文件的文件夹,您也可以将make.exe和mmkdir.exe及其DLL文件复制到CubCLT目录,这样只需要一个文件夹即可。
⑤现在双击项目中的Build_Slcan.cmd文件,编译应该会开始。
此脚本会自动将编译后的BIN文件复制到HUD ECU Hacker的固件文件夹中。
⑥固件更新程序会自动将BIN文件转换为您可以上传的DFU文件。
第6部分 版本说明
6.1 源代码版本
25.09.14:初始版本
25.10.23:允许在适配器打开后修改一个过滤器。
25.11.16:支持远程帧,修复Slcan波特率Y0的错误,以及在经典模式下发送FD数据包时报告错误的问题。
25.11.18:修复了S和Y命令所有Slcan波特率的计算问题,修复了旧版Candlelight 数据包大小的问题。
25.11.21:C++演示程序进行了多项改进,新增了C#演示程序。
可以看到Elmue仍在对2.5固件进行更新维护,您可以在GitHub上获取最新资料。
(https://github.com/Elmue/CANable-2.5-firmware-Slcan-and-Candlelight)。
6.2 更新提示
1、在固件中添加新功能时,请务必在settings.h文件中修改FIRMWARE_VERSION_BCD的值。
2、添加新的Slcan命令后,必须增加SLCAN_VERSION的值,并将新命令添加到文档中。
版本变更记录
| 日期 | 更新人 | 版本 | 说明 |
|---|---|---|---|
| 2025-11-22 | 创客基地 | V1.0 | 文档建立。 |






