CANable V2.5 Candlelight&Slcan 更新说明

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 文档建立。
相关推荐
斯内科4 天前
C#进行CAN【控制器局域网】通讯
c#·can·pcanbasic.net
Lenz's law1 个月前
智元灵犀X1-本体通讯架构分析2:CAN/FD总线性能优化分析
架构·机器人·can·1024程序员节
IAMeee1 个月前
从项目中学习CAN和CANFD报文结构(新手入门)
自动化测试·can·uds·canfd·1024程序员节
木木不迷茫(˵¯͒¯͒˵)2 个月前
CAN-发送处理(Tx Handling)
嵌入式·can
驱动起爆大师x_x2 个月前
CAN总线的数据采样和同步问题
stm32·嵌入式硬件·学习·can
SYWG03 个月前
【DBCExcelConvent】CAN报文解析辅助工具之DBC与Excel互转
c语言·qt·excel·can·dbc
一阵没来由的风3 个月前
拒绝造轮子(C#篇)ZLG CAN卡驱动封装应用
c#·can·封装·zlg·基础封装·轮子
骑着毛驴数星星3 个月前
CANDB++中的CAN_DBC快速编辑方法,使用文本编辑器(如notepad++和VScode)
vscode·can
吃货界的硬件攻城狮4 个月前
【江科大CAN】2.1 STM32 CAN外设(上)
stm32·can·通讯协议