Add AMI CAN DBC and verified SDC/BMS firmware handoff

This commit is contained in:
shenlefengnai-rgb
2026-10-03 15:57:54 +08:00
parent 39268e07d2
commit f1d1f6da5c
345 changed files with 360479 additions and 18 deletions
+189
View File
@@ -0,0 +1,189 @@
# AMI CAN DBC 说明
版本:`AMI-2.0-2026-10-03`。由 [AMI.dbc](../AMI.dbc) 自动生成,10 条报文、33 个信号。
## 使用范围
CAN1 / CAN2 功能相同,均为 500 kbit/s、Classic CAN、87.5% 采样点。节点 AMI 为仪表 MCU,VCU 为任务请求的逻辑接收者,SDC_ACQ_DAC 和 BMS 为数据源。
本 DBC 包含 AMI 唯一发送的 `0x300` 任务请求,以及 AMI 当前识别的 SDC / BMS 输入。SDC `0x6A3` DAC 控制、`0x6A5` ASSI 控制、BMS 其他电芯/故障字段不属于此接口子集。没有定义电机温度、逆变器温度、扭矩、标定后的车速、AMI 周期心跳或 VCU 执行反馈。旧 `0x180 / 0x181 / 0x280` 输入已停用。
SDC 字段依据 `SDC_ACQ_DAC.dbc` VERSION 1.1,保持其信号名、位布局、缩放和单位;仅将输入接收节点设为 AMI。BMS 字段依据 [BmsMonitor-CANTest](https://git.acetaffy.ltd/acetaffy/BmsMonitor-CANTest) 提交 `e65c95203d1689df05343775982d7e85bd782646` 的 `BmsProtocolParser.cs`。
DBC 为 ASCII 编码,注释和枚举使用英文,便于导入 CAN 工具;本文为 UTF-8 中文。物理值 = 原始无符号值 × Factor + Offset;下表范围为编码范围,不表示车辆正常工作范围。
## 报文总览
| CAN ID | 类型 | DLC | 报文名 | 方向和作用 | 周期 / 触发 |
| --- | --- | --- | --- | --- | --- |
| `0x300` | 标准 | 8 | `AMI_TaskRequest` | AMI -> VCU:用户确认后的任务选择请求 | 确认任务触发 |
| `0x6A0` | 标准 | 8 | `SDC_Heartbeat` | SDC -> AMI:板标识、版本、序号、上电时间 | 100 ms |
| `0x6A1` | 标准 | 2 | `SDC_ADC_InputVoltage` | SDC -> AMI:低压电池电压,精确 DLC=2 | 500 ms |
| `0x6A2` | 标准 | 8 | `SDC_InputFrequencies` | SDC -> AMI:PA0 / PA2 / PA6 / PB14 原始频率 | 20 ms |
| `0x6A4` | 标准 | 4 | `SDC_DAC_Ack` | SDC -> AMI:DAC 设置应答,识别但不显示 | DAC 设置后应答 |
| `0x6A6` | 标准 | 8 | `SDC_GPIO_Status` | SDC -> AMI:PD0..PD14 原始电平和变化掩码 | 启动 / 电平变化 |
| `0x140` | 标准 | 8 | `BMS_Status` | BMS -> AMI:高压总电压、带偏置的总电流 | 源协议未指定 |
| `0x156` | 标准 | 8 | `BMS_Temperatures` | BMS -> AMI:八路实际温度,AMI 派生最高有效温度 | 源协议未指定 |
| `0x186040F3` | 扩展 | 8 | `BMS_Status_Extended` | BMS -> AMI:高压总电压、总电流扩展帧别名 | 源协议未指定 |
| `0x186140F3` | 扩展 | 8 | `BMS_Extremes_Extended` | BMS -> AMI:最高单体温度;不使用 BMS 低压字段 | 源协议未指定 |
扩展帧在 DBC 的 `BO_` 十进制 ID 中设置 bit31:`0x186040F3 -> 2556444915`,`0x186140F3 -> 2556510451`。CAN 工具中使用实际 29 位仲裁 ID 并选择扩展帧;bit31 不是总线上发送的仲裁 ID。
`GenMsgCycleTime` 仅填写已确认的 SDC 周期 100 / 500 / 20 ms。其余帧未填写周期,默认 0 表示未指定,不据此推断 BMS 周期。
## 信号布局
Start 为 DBC 起始位,位号从 0 开始。Intel `@1` 从最低有效位起算;Motorola `@0` 从最高有效位起算。例如 BMS 的 `7|16@0+` 对应字节 0..1 大端无符号数,`23|16@0+` 对应字节 2..3。单字节温度的字节序不改变实际解码。
### 0x300 - AMI_TaskRequest
| 信号 | Start | 位数 | 字节序 | Factor | Offset | 单位 | 编码范围 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `Protocol_Version` | 0 | 8 | Intel | 1 | 0 | - | 1..1 |
| `Task_ID` | 8 | 8 | Intel | 1 | 0 | - | 1..6 |
| `Request_Sequence` | 16 | 8 | Intel | 1 | 0 | - | 0..255 |
| `Request_Source` | 24 | 8 | Intel | 1 | 0 | - | 1..1 |
| `MCU_Uptime` | 32 | 32 | Intel | 1 | 0 | ms | 0..4.29497e+09 |
`Protocol_Version`:1 = Version_1;`Task_ID`:1 = Skidpad,2 = Acceleration,3 = Autocross,4 = Inspection_Test,5 = EBS_Test,6 = Manual_Driving;`Request_Source`:1 = AMI_HMI。
### 0x6A0 - SDC_Heartbeat
| 信号 | Start | 位数 | 字节序 | Factor | Offset | 单位 | 编码范围 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `Board_Identifier` | 0 | 8 | Intel | 1 | 0 | - | 0..255 |
| `Protocol_Version` | 8 | 8 | Intel | 1 | 0 | - | 0..255 |
| `Heartbeat_Sequence` | 16 | 16 | Intel | 1 | 0 | - | 0..65535 |
| `Uptime` | 32 | 32 | Intel | 0.001 | 0 | s | 0..4.29497e+06 |
`Board_Identifier`:161 = A11_F407;`Protocol_Version`:1 = Version_1。
### 0x6A1 - SDC_ADC_InputVoltage
| 信号 | Start | 位数 | 字节序 | Factor | Offset | 单位 | 编码范围 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `Input_Voltage` | 0 | 16 | Intel | 0.001 | 0 | V | 0..65.535 |
### 0x6A2 - SDC_InputFrequencies
| 信号 | Start | 位数 | 字节序 | Factor | Offset | 单位 | 编码范围 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `Frequency_LeftFront_PA0` | 0 | 16 | Intel | 1 | 0 | Hz | 0..65535 |
| `Frequency_PA2` | 16 | 16 | Intel | 1 | 0 | Hz | 0..65535 |
| `Frequency_RightFront_PA6` | 32 | 16 | Intel | 1 | 0 | Hz | 0..65535 |
| `Frequency_PB14` | 48 | 16 | Intel | 1 | 0 | Hz | 0..65535 |
### 0x6A4 - SDC_DAC_Ack
| 信号 | Start | 位数 | 字节序 | Factor | Offset | 单位 | 编码范围 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `DAC_Set_Result` | 0 | 8 | Intel | 1 | 0 | - | 0..1 |
| `DAC_Select` | 8 | 8 | Intel | 1 | 0 | - | 1..2 |
| `DAC_Output_Voltage` | 16 | 16 | Intel | 0.001 | 0 | V | 0..5 |
`DAC_Set_Result`:0 = Failed,1 = OK;`DAC_Select`:1 = DAC1,2 = DAC2。
### 0x6A6 - SDC_GPIO_Status
| 信号 | Start | 位数 | 字节序 | Factor | Offset | 单位 | 编码范围 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `SDC_Input_State` | 0 | 15 | Intel | 1 | 0 | - | 0..32767 |
| `SDC_Changed_Mask` | 16 | 15 | Intel | 1 | 0 | - | 0..32767 |
| `Timestamp` | 32 | 32 | Intel | 0.001 | 0 | s | 0..4.29497e+06 |
### 0x140 - BMS_Status
| 信号 | Start | 位数 | 字节序 | Factor | Offset | 单位 | 编码范围 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `Pack_Voltage` | 7 | 16 | Motorola | 0.1 | 0 | V | 0..6553.5 |
| `Pack_Current` | 23 | 16 | Motorola | 0.1 | -500 | A | -500..6053.5 |
### 0x156 - BMS_Temperatures
| 信号 | Start | 位数 | 字节序 | Factor | Offset | 单位 | 编码范围 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `Temperature_1` | 7 | 8 | Motorola | 1 | -40 | degC | -40..215 |
| `Temperature_2` | 15 | 8 | Motorola | 1 | -40 | degC | -40..215 |
| `Temperature_3` | 23 | 8 | Motorola | 1 | -40 | degC | -40..215 |
| `Temperature_4` | 31 | 8 | Motorola | 1 | -40 | degC | -40..215 |
| `Temperature_5` | 39 | 8 | Motorola | 1 | -40 | degC | -40..215 |
| `Temperature_6` | 47 | 8 | Motorola | 1 | -40 | degC | -40..215 |
| `Temperature_7` | 55 | 8 | Motorola | 1 | -40 | degC | -40..215 |
| `Temperature_8` | 63 | 8 | Motorola | 1 | -40 | degC | -40..215 |
`Temperature_1`:255 = Invalid;`Temperature_2`:255 = Invalid;`Temperature_3`:255 = Invalid;`Temperature_4`:255 = Invalid;`Temperature_5`:255 = Invalid;`Temperature_6`:255 = Invalid;`Temperature_7`:255 = Invalid;`Temperature_8`:255 = Invalid。
### 0x186040F3 - BMS_Status_Extended
| 信号 | Start | 位数 | 字节序 | Factor | Offset | 单位 | 编码范围 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `Pack_Voltage` | 7 | 16 | Motorola | 0.1 | 0 | V | 0..6553.5 |
| `Pack_Current` | 23 | 16 | Motorola | 0.1 | -500 | A | -500..6053.5 |
### 0x186140F3 - BMS_Extremes_Extended
| 信号 | Start | 位数 | 字节序 | Factor | Offset | 单位 | 编码范围 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `Maximum_Cell_Temperature` | 39 | 8 | Motorola | 1 | -40 | degC | -40..215 |
`Maximum_Cell_Temperature`:255 = Invalid。
## AMI 任务请求语义
| Task_ID | 任务 |
| --- | --- |
| 1 | 八字绕环 |
| 2 | 直线加速 |
| 3 | 高速循迹 |
| 4 | 车检测试 |
| 5 | EBS 测试 |
| 6 | 手动驾驶 |
用户确认时,屏幕通过串口发送 `AA 55 01 NN 0D 0A`,MCU 才产生 CAN `0x300` 请求;取消不产生请求。Protocol_Version 和 Request_Source 固定为 1;Request_Sequence 从 MCU 启动后的 0 开始,在各目标口完成入队后加一,255 后回到 0。MCU_Uptime 为请求入队时的 `HAL_GetTick()` 毫秒值,小端 uint32,自然回绕。
优先发送到最近 500 ms 内收到过有效协议报文的 CAN 口;两路活跃则发送两路;没有活跃口时尝试两路。若未连接端口自动重发导致 TX FIFO 填满,现有队列可能等待。该策略沿用当前固件。任务表示操作员请求,VCU 负责裁决和安全互锁;未定义应用层执行确认、运行完成、故障回传,也不把任务号换成 ASSI 灯状态。
## 显示缩放与失效规则
| 显示项 | 输入和显示规则 | 失效条件 |
| --- | --- | --- |
| 低压电池 | `0x6A1` uint16 mV;`lvbat.val=(mV+5)/10`,显示两位小数 V | 1500 ms 无有效 ADC |
| 高压电压 | BMS 大端 uint16 × 0.1 V;现有控件四舍五入到整数 V | 2000 ms 无有效 BMS 状态 |
| 高压电流 | BMS 大端 uint16 × 0.1 - 500 A;四舍五入到整数 A | 2000 ms 无有效 BMS 状态 |
| 最高单体温度 | `0x156` 有效通道最大值,或扩展帧字节 4 - 40 | 全无效或 2000 ms 无有效温度源 |
电流字段是带偏置的 uint16,不能按 int16 解码。温度原始 `0xFF` 为无效;DBC 枚举将其标为 Invalid。关闭枚举解码的工具可能显示 215,聚合时必须先排除 原始 255,不能把它当作 215 ℃。有效实际温度范围为 -40..214 ℃。第 9/10 路虚拟温度没有总线字段,最高温度也属于 MCU 派生结果,不新增虚构信号。
BMS 扩展帧的其他字段没有纳入本 DBC,尤其字节 6..7 的低压电压不覆盖 SDC ADC。两类温度帧共用最高温度显示,后收到的温度帧更新该显示及有效性。SDC GPIO 原始电平尚无具名安全信号映射和正常极性,因此 debug 保持未知;轮频 Hz 尚无周长和每圈脉冲数,不能直接当 km/h。
有效值显示白色;未知、无效、超时显示深灰色,历史数值保留但不作为有效测量。各源独立超时,其他流量不续期。每 5 秒重新同步界面,刚连接需等待首轮同步。
## 报文样例
| ID / DLC | 数据(十六进制) | 解码及仪表显示 |
| --- | --- | --- |
| `0x300 / 8` | `01 02 00 01 E8 03 00 00` | 直线加速请求、序号 0、来源 AMI、上电 1000 ms |
| `0x6A1 / 2` | `0C 30` | ADC 12300 mV;低压 12.30 V |
| `0x6A2 / 8` | `32 00 64 00 96 00 C8 00` | PA0 / PA2 / PA6 / PB14:50 / 100 / 150 / 200 Hz |
| `0x140 / 8` | `0F A0 14 03 00 00 00 05` | 400.0 V / +12.3 A;显示 400 / 12 |
| `0x186040F3 / 8` 扩展 | `10 73 10 D1 00 00 00 05` | 421.1 V / -69.5 A;显示 421 / -70 |
| `0x156 / 8` | `42 FF 43 47 37 0A 50 41` | 第二路无效,有效最高温度 40 ℃ |
| `0x186140F3 / 8` 扩展 | `10 04 0C E4 3F 17 00 7B` | 最高温度 23 ℃;BMS 低压字段不使用 |
## 验证和复现
在仓库根目录运行:
```powershell
python -m pip install -r scripts/requirements.txt
python scripts/verify_dbc.py
python scripts/export_dbc_docs.py --check
# 若同时检出 SDC 仓库,可额外比较五条输入帧的原始布局:
python scripts/verify_dbc.py --sdc-dbc ../SDC_ACQ_DAC/SDC_ACQ_DAC.dbc
```
校验覆盖严格 DBC 解析(长度、信号越界与重叠)、10 个 ID 与固件宏对应、标准/扩展格式、33 个信号、发送/接收节点、SDC 周期、24 个已知报文解码、六个任务号与计数边界编码、大端偏置电流、无效温度枚举、全负温度和截短 DLC。已安装并验证 cantools 44.1.0,接口参考 [cantools 官方文档](https://cantools.readthedocs.io/en/latest/)。
上述是静态及软件编解码验证。之前 CAN 盒 -> 实物 AMI CAN1 / MCU -> USART2 -> COM4 -> 官方 HMI 调试器的实际更新和六个任务回传见 [联调报告](SDC_BMS联调报告.md)。物理串口屏、CAN2 接线、真实 SDC/BMS 节点和车辆执行动作尚未实测;文档生成和 DBC 解析不替代这些测试。
修改 AMI.dbc 后运行 `python scripts/export_dbc_docs.py` 更新本文;固件字节布局、DBC 与此文档需同时保持一致。
+93
View File
@@ -0,0 +1,93 @@
# AMI 主控 CAN / UART 协议
**2026-10-03:本文 v1.0 CAN 输入已停用,当前固件协议见 [SDC_BMS协议.md](SDC_BMS协议.md)。** 原 `0x180 / 0x181 / 0x280` 仅留作历史记录;UART 和 `0x300` 任务接口仍保留,当前有效性规则以新文档为准。
版本:1.0(2026-09-30)
两路 CAN 功能完全相同,均接收全部仪表/安全状态并可发送任务请求。所有报文均为 11 位标准 ID、Classic CAN 数据帧、Intel/Little-Endian;FDCAN1、FDCAN2 均为 500 kbit/s、87.5% 采样点。
## 1. CAN1 / CAN2:车辆数据与任务请求
### 0x180 仪表快速量(CAN → 主控,8 字节)
| 字节 | 类型 | 信号 | 比例 | 屏幕目标 |
| --- | --- | --- | --- | --- |
| 0..1 | uint16 | 车速 | 0.1 km/h/bit | `dash.speed.val`,四舍五入到 1 km/h |
| 2..3 | uint16 | 高压电压 | 0.1 V/bit | `dash.ts.val`,四舍五入到 1 V |
| 4..5 | int16 | 高压电流 | 0.1 A/bit | `dash.dl.val`,四舍五入到 1 A |
| 6..7 | int16 | 扭矩千分比 | 1 ‰/bit | `dash.mct.val` |
建议发送周期 10~20 ms。主控只把发生变化后的最新值送到屏幕;屏幕串口慢于 CAN 时,中间旧值会被合并丢弃,保证画面跟随最新状态。
示例:`7B 00 B8 0B CE FF F4 01` 表示 12.3 km/h、300.0 V、-5.0 A、500 ‰。
### 0x181 温度量(CAN → 主控,8 字节)
| 字节 | 类型 | 信号 | 比例 | 屏幕目标 |
| --- | --- | --- | --- | --- |
| 0..1 | int16 | 电机温度 | 0.1 °C/bit | `dash.djwd.val`,四舍五入到 1 °C |
| 2..3 | int16 | MCU/逆变器温度 | 0.1 °C/bit | `dash.mcuwd.val`,四舍五入到 1 °C |
| 4..5 | int16 | 最高单体温度 | 0.1 °C/bit | `dash.dtwd.val`,四舍五入到 1 °C |
| 6..7 | - | 保留 | 必须发送 0 | - |
建议发送周期 50~100 ms。
### 0x300 任务请求(主控 → CAN,8 字节)
主控只在收到屏幕合法确认帧后发送。它表示驾驶员/操作员请求,不表示车辆已经执行,VCU 仍须完成状态机和安全互锁判断。
| 字节 | 含义 |
| --- | --- |
| 0 | 协议版本,固定 1 |
| 1 | 任务号:1 八字绕环、2 直线加速、3 高速循迹、4 车检测试、5 EBS 测试、6 手动驾驶 |
| 2 | 请求序号,每次合法请求加 1,0~255 循环 |
| 3 | 来源,固定 1=AMI 屏幕 |
| 4..7 | 主控 `HAL_GetTick()` 毫秒值,uint32,小端 |
任务请求发送到最近 500 ms 内收到过本协议报文的 CAN 口;两路都活跃时发送到两路。如果两路都尚未收到报文,则尝试发送到两路。若 TX FIFO 暂满,任务保留在软件队列中稍后发送。
## 2. CAN1 / CAN2:安全/debug 状态
### 0x280 安全状态(CAN → 主控,8 字节)
字节 0..3 是 16 个 2 bit 状态,`d0` 位于 bit 1:0,`d15` 位于 bit 31:30:
```text
state[n] = (payload_u32 >> (2*n)) & 0x03
```
状态定义:0=未知、1=正常、2=故障;收到 3 时按未知处理。字节 4 可放发送方滚动计数,字节 5..7 保留,当前主控不解析。`d0~d15` 的物理含义沿用 [通讯交接文档.md](通讯交接文档.md)。建议发送周期 20~100 ms。
任一路收到 0x280 都会刷新状态。超过 500 ms 两路均未收到 0x280,主控会将全部 `d0~d15` 刷为 0(未知)。超过 500 ms 两路均未收到仪表帧时保留最后显示值,但点亮故障状态灯。
## 3. 主控与 TJC 屏幕串口
USART2 为 9600、8 数据位、无校验、1 停止位。
主控到屏幕使用 ASCII 属性赋值,每条命令后紧跟三个真实 `0xFF` 字节。例如车速 30 km/h:
```text
64 61 73 68 2E 73 70 65 65 64 2E 76 61 6C 3D 33 30 FF FF FF
```
屏幕到主控沿用现有 6 字节任务帧:
```text
AA 55 01 NN 0D 0A
```
`NN=01~06`。接收器按连续字节流搜索帧头并校验类型、任务号和帧尾,不依赖一次 DMA 回调刚好收到一帧。屏幕上电数据和官方 `bkcmd` 返回不会被误认为任务请求。
## 4. LED 与延迟边界
- PA0/脚 11:运行心跳,每 500 ms 翻转。
- PA1/脚 12:两路均未及时提供仪表量或 debug 状态时点亮;不要求两个接口必须同时连接。
- 两灯默认高电平有效,可在 `ami_app.h` 中切换极性。
- CAN 接收与 UART 收发均为中断/DMA;应用主循环不做阻塞等待。
- 屏幕链路物理上限由 9600 bit/s 决定:一条约 15~22 字节的赋值命令通常占用约 16~23 ms 线速时间。突发多字段更新会依次发送,但每个字段只保留最新值。
## 5. 验证边界
已验证:CubeMX 6.15 生成成功;GNU Arm GCC 13.3.1 Debug/Release 可编译;引脚复用、CAN 位时序和 UART 9600 配置进入生成代码。
未验证:实物芯片具体容量、LED 极性、CAN 收发器、终端电阻、整车实际波特率、屏幕电平、UART 实收发、任务按钮到 CAN 的端到端时延及车辆安全动作。烧录成功也不能替代这些实物测试。
+68
View File
@@ -0,0 +1,68 @@
# AMI 接入 SDC / BMS 协议
版本 2.0,2026-10-03。CAN1 / CAN2 配置相同:500 kbit/s、Classic CAN、87.5% 采样点。当前固件不再接收旧 `0x180 / 0x181 / 0x280` 数据接口。
来源:`SDC_ACQ_DAC/SDC_ACQ_DAC.dbc` VERSION 1.1;[BmsMonitor-CANTest](https://git.acetaffy.ltd/acetaffy/BmsMonitor-CANTest) 的 `BmsMonitor.App/Protocol/BmsProtocolParser.cs`,核对提交 `e65c95203d1689df05343775982d7e85bd782646`,本机核对副本保存在 `tmp/BmsMonitor-CANTest`(不提交);远端来源使用上述仓库及提交号定位。
## SDC 输入
| 标准 ID / DLC | 字节布局 | AMI 行为 |
| --- | --- | --- |
| `0x6A0 / 8` | `A1 01` + 小端 uint16 序号 + 小端 uint32 上电 ms | 校验标识和版本,刷新 SDC 心跳 |
| `0x6A1 / 2` | 小端 uint16 mV | **低压电池电压**,`dash.lvbat.val=(mV+5)/10`,虚拟浮点显示两位小数 |
| `0x6A2 / 8` | 四个小端 uint16 Hz,PA0 / PA2 / PA6 / PB14 | 保存原始频率;没有周长和每圈脉冲数,不直接当 km/h |
| `0x6A4 / 4` | 结果、DAC 选择、小端 uint16 mV | 接收应答,不作为仪表电压 |
| `0x6A6 / 8` | 小端 uint16 PD0..PD14 电平 + uint16 变化掩码 + uint32 ms | 保存原始电平、变化和时间 |
`0x6A3` DAC 设置和 `0x6A5` ASSI 设置是发给 SDC 的控制,不属于本次显示输入。ADC 已由 SDC 校准为分压前物理输入电压,AMI 不再乘分压倍数。`08 20` = 8200 mV = 8.20 V;`0C 30` = 12300 mV = 12.30 V。DLC 必须为 2。
GPIO 帧仅在启动和电平变化时发送,持续心跳表示源仍在线。DBC 没有 PD0..PD14 对应 `d0..d15` 安全信号的名称及正常极性;当前具名 debug 保持未知,不把高/低电平直接判为正常/故障。
## BMS 输入
| ID / DLC | 字段及换算 | 屏幕目标 |
| --- | --- | --- |
| 标准 `0x140 / 8` 或扩展 `0x186040F3 / 8` | 大端 uint16 字节 0..1 × 0.1 V | `dash.ts.val`,现有整数控件四舍五入至 1 V |
| 同上 | 大端 **uint16** 字节 2..3 × 0.1 − 500 A | `dash.dl.val`,四舍五入至 1 A;不是 int16 直接解码 |
| 标准 `0x156 / 8` | 八个字节分别为温度 + 40,`FF` 无效 | `dash.dtwd.val` = 有效实际通道的最高温度,单位 ℃ |
| 扩展 `0x186140F3 / 8` | 字节 4 − 40 为最高温度,`FF` 无效 | 更新 `dash.dtwd.val`;BMS 低压字段不覆盖 SDC ADC |
MCU 内保存 0.1 V / 0.1 A 原始精度,仅显示层四舍五入。例 `0F A0 14 03 00 00 00 05` = 400.0 V / +12.3 A,显示 400 / 12;`10 73 10 D1 00 00 00 05` = 421.1 V / −69.5 A,显示 421 / −70。
最高温度只取前八个实际通道,不能把 BmsMonitor 补出的第 9/10 路纳入最大值。`42 FF 43 47 37 0A 50 41` 的最大温度为 40 ℃。全为 `FF` 时立即失效。
BmsMonitor 没有电机或逆变器温度协议;`dash.djwd` / `dash.mcuwd` 保持无效。扭矩和车速也缺少可直接使用的单位映射,保持无效。
## 有效性与刷新
白色数值表示收到有效数据;深灰色表示未知或失效,保留的历史值仅作参考。初始灰色 0 不能作为测量结果。
刚重新打开或连接屏幕时,需等待首轮同步(最长约 5.6 秒);屏幕自身的初始 0 不表示有效测量。
- SDC ADC 独立超时 1500 ms。
- BMS 电压/电流独立超时 2000 ms。
- BMS 最高温度独立超时 2000 ms;全通道无效时立即失效。
- 其他源的流量不会延长上述计时;有效报文恢复后自动转白。
- 只对数值或有效性变化排队,字段轮转和 UART DMA 发送最新值,避免高频字段阻塞其他字段。
- 每 5 秒额外重新同步整套数值、有效颜色和 debug 状态,支持屏幕晚于 MCU 启动或编辑器重新连接;一轮刷新还需约 0.6 秒串口发送时间。
- 校验标准/扩展格式、Classic CAN、数据帧及 DLC;未知或长度不匹配的报文不更新数据。
USART2 为 9600、8N1,PA2 TX / PA3 RX。命令为 ASCII,末尾三个真实 `FF FF FF` 字节。`dash.lvbat.val=1230` 显示 12.30 V,`lvbat` 全局作用域,`vvs1=2`;参见 [淘晶驰虚拟浮点数文档](http://wiki.tjc1688.com/widgets/Xfloat.html)。其余 UART 数字接口沿用 [通讯交接文档](通讯交接文档.md)。
## 任务回传
屏幕确认后发送 `AA 55 01 NN 0D 0A`,`NN=01..06`;取消不发送。MCU 用 Receive-to-Idle DMA 按字节流解析拆包/粘包。
MCU 发出标准 `0x300 / 8`:版本 1、任务号、uint8 序号、来源 1、uint32 小端 MCU ms。任务依次为八字绕环、直线加速、高速循迹、车检测试、EBS 测试、手动驾驶。此接口是原有 AMI 请求,**不是 SDC DBC 定义的 ASSI 控制**;没有 VCU 映射前不把任务号直接写成 `0x6A5` 灯状态。
请求优先进入最近 500 ms 收到有效协议报文的 CAN 口;两路活跃则发两路,无接收历史则尝试两路。现有未连接 CAN 口自动重发可能填满 TX FIFO,并阻塞后续软件任务;本次保留原任务队列策略。回归覆盖 CAN1 持续有有效输入的情况。
PA0 LED 每 500 ms 翻转,PA1 为仪表/SDC 状态活动超时提示,默认高电平有效;尚未观察验证灯的物理极性和行为,活动灯不能替代每个数值的有效性判断。
## 验证范围
已完成 Release 编译、SWD 烧录校验、HMI 编译(0 错误 / 0 警告),以及 **CAN 盒 → 实物 AMI CAN1 → MCU USART2 → COM4 → 官方 HMI 调试器** 数据更新测试。
同时发送 SDC 20 ms 频率、100 ms 心跳、500 ms ADC 和 BMS 报文,验证标准/扩展 BMS、负电流、无效温度、独立超时、恢复、错误 DLC 和旧 ID 拒绝。原始帧、截图和 SWD 快照见 [发布的发送记录](evidence/2026-10-03/sdc-bms/sdc_bms_visual_results.json)。
CAN2 配置及过滤寄存器与 CAN1 相同,但本次未接线实测 CAN2。未测试物理串口屏,未接真实 SDC/BMS 节点,未验证 VCU 实际执行或安全动作。现有画面的 EBS 文案不能作为安全状态证明。
+54
View File
@@ -0,0 +1,54 @@
# AMI SDC / BMS 联调报告
2026-10-03,测试链路:PCAN-USB(500 kbit/s)→ 实物 AMI CAN1 → STM32G0B1 MCU → USART2 PA2/PA3 → CH340 COM4(9600 8N1)→ USART HMI 官方调试器。使用 CAN 盒模拟 SDC / BMS 报文,未接真实 SDC / BMS 节点或物理串口屏。
## 实际发送与显示
| ID / 格式 / DLC | CAN 数据(十六进制) | 含义 | HMI 实测 |
| --- | --- | --- | --- |
| `0x6A1` 标准 / 2 | `08 20` | ADC 8200 mV | 低压电池 8.20 V |
| `0x6A1` 标准 / 2 | `0C 30` | ADC 12300 mV | 低压电池 12.30 V |
| `0x140` 标准 / 8 | `0F A0 14 03 00 00 00 05` | 400.0 V,+12.3 A | 高压 400,电流 12 |
| `0x156` 标准 / 8 | `42 FF 43 47 37 0A 50 41` | 八路实际温度,第二路无效,最高 40 ℃ | 最高单体 40 |
| `0x186040F3` 扩展 / 8 | `10 73 10 D1 00 00 00 05` | 421.1 V,−69.5 A | 高压 421,电流 −70 |
| `0x186140F3` 扩展 / 8 | `10 04 0C E4 3F 17 00 7B` | 最高温度 23 ℃ | 最高单体 23 |
| `0x156` 标准 / 8 | `FF FF FF FF FF FF FF FF` | 无有效温度 | 原温度保留但变灰,MCU 有效位清零 |
低压控件 `lvbat` 为两位小数虚拟浮点数;高压、电流沿用整数控件,四舍五入显示。MCU 内保留高压/电流的 0.1 单位精度。电机/逆变器温度没有来源协议,保持灰色无效值,没有将电池温度套用到电机。
同一测试同时发送:SDC 心跳 100 ms、ADC 500 ms、四路频率 20 ms、BMS 状态 100 ms、BMS 温度 200 ms。轮频 `32 00 64 00 96 00 C8 00` 为 50 / 100 / 150 / 200 Hz,未擅自当作 km/h。
## 通过的检查
- MCU 不重启,仅重新打开并连接 HMI,等待同步后无效值恢复灰色;每 5 秒重新同步整套显示状态。\n- 实际 HMI 数值更新,标准与扩展 BMS 均可用,负电流符号和偏置正确。
- `FF` 无效温度被排除;全部温度无效时立即失效;恢复后重新转白。
- 只保留 SDC 心跳时,ADC 1500 ms、BMS 电压/电流 2000 ms 独立超时,变灰;心跳没有为其他数值续期。
- 恢复阶段显示 12.68 V / 55 V / 0 A / 27 ℃(BMS 原始总压 54.5 V)。
- 错误 DLC、同 ID 错误标准/扩展类型,以及旧 `0x180` 数据没有覆盖有效读数。
- 在 debug 页面更新数据,返回 dash 后显示 14.50 V / 300 V / −5 A / 60 ℃;具名 debug 状态保持未知。
- 同时注入 BMS 扩展帧的低压字段 8.5 V,仪表低压仍为 SDC ADC 的 14.50 V,没有被 BMS 覆盖。
- 六个任务确认均收到正确标准 `0x300 / 8` 请求,六个取消均没有 CAN 请求。测试期间 CAN1 持续有有效 SDC / BMS 输入。
- SWD 五阶段快照中的显示值、原始 ADC / BMS 值、有效位与预期一致,UART / CAN 接收错误计数均为 0;PCAN 状态为 0。
任务 CAN 序号依次为 0..5,前三个固定字段与来源字段为 `01 NN SEQ 01`,后四字节为 MCU 小端毫秒时间。任务回传仍为原 AMI 请求,未发 SDC DAC 或 ASSI 控制。
## 文件与证据
- [当前协议](SDC_BMS协议.md)
- [HMI 工程](../AMI.HMI),SHA256 `8A37E4961F90671F04E55BA94C173AE8FBFC5E30C2A3E74A2C37148157C3D16D`
- [固件 BIN](../output/firmware/AMI_Controller.bin),SHA256 `F0DA6EC9C5C8A4F803E4CDD28BB73C6458E010B15F32D3EAEF5C3A1B60D8827B`
- [全部 CAN 发送记录](evidence/2026-10-03/sdc-bms/sdc_bms_visual_results.json)
- [MCU 快照自动核对](evidence/2026-10-03/sdc-bms/sdc_bms_verified.json)
- [任务回归](evidence/2026-10-03/sdc-bms/sdc_bms_function_task_results.json)
- [跨页面记录](evidence/2026-10-03/sdc-bms/sdc_bms_cross_page.json)
- [烧录日志](evidence/2026-10-03/sdc-bms/sdc_bms_flash.log)
Release:Flash 15612 B,RAM 2632 B,编译通过;SWD 烧录显示 `Download verified successfully`。HMI 编辑器编译显示 0 错误、0 警告,[编译截图](evidence/2026-10-03/sdc-bms/saved_editor.png)。原 HMI 保留在 `tmp/can1-test-20261002/AMI_before_sdc_bms.HMI`,新版本另留验证副本。
![标准帧显示](evidence/2026-10-03/sdc-bms/sdc_bms_standard.png)
![扩展帧显示](evidence/2026-10-03/sdc-bms/sdc_bms_extended.png)
## 尚缺资料或未测试部分
电机/逆变器温度的 CAN ID、字段和缩放,SDC GPIO 到具名安全信号的映射及正常极性,轮频到 km/h 的标定参数均缺失。CAN2 配置与 CAN1 相同,SWD 过滤寄存器均为 `0x0103002B`,但没有接线实测 CAN2。未测试物理串口屏、灯极性、VCU 执行反馈和车辆安全动作。现有未活跃端口的任务重发/队列限制未修改,详情见当前协议文档。
@@ -0,0 +1,10 @@
{
"result": "passed",
"messages": 10,
"signals": 33,
"known_payload_checks": 24,
"all_task_ids_and_counter_edges": true,
"firmware_ids_match": true,
"sdc_source_layout_match": true,
"cantools_version": "44.1.0"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

@@ -0,0 +1,32 @@
-------------------------------------------------------------------
STM32CubeProgrammer v2.20.0
-------------------------------------------------------------------
ST-LINK SN : 37FF71064E573436188C1543
ST-LINK FW : V2J47S7
Board : --
Voltage : 3.28V
SWD freq : 950 KHz
Connect mode: Hot Plug
Reset mode : Software reset
Device ID : 0x467
Revision ID : Rev Z
Device name : STM32G0B0xx/B1xx/C1xx
Flash size : 128 KBytes
Device type : MCU
Device CPU : Cortex-M0+
BL Version : 0x92
Reading 32-bit memory content
Size : 128 Bytes
Address: : 0x200002C8
0x200002C8 : 00000000 00000000 00000000 00002603
0x200002D8 : 00000000 FFFFFD49 00011073 00000064
0x200002E8 : 55AA7FFF 00640032 00C80096 0000300C
0x200002F8 : 0000254A 000025B7 00002418 000025B7
0x20000308 : 000025B7 00000000 00000000 000001A5
0x20000318 : 00000000 FFFFFFBA 00000000 00000000
0x20000328 : 00000017 000004CE 0000008A 00000000
0x20000338 : 00000000 00000000 00000000 2637AB02
@@ -0,0 +1,507 @@
{
"debug_screenshot": "D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_debug_cross_page.png",
"dash_screenshot": "D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_dash_cross_page.png",
"tx": [
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
},
{
"id": "0x6a0",
"extended": false,
"data": "A1 01 00 00 00 00 00 00"
},
{
"id": "0x6a1",
"extended": false,
"data": "A4 38"
},
{
"id": "0x140",
"extended": false,
"data": "0B B8 13 56 00 00 00 05"
},
{
"id": "0x156",
"extended": false,
"data": "28 FF 32 3C 46 50 5A 64"
},
{
"id": "0x186140f3",
"extended": true,
"data": "10 04 0C E4 64 17 00 55"
}
],
"pcan_status": "0x0"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

@@ -0,0 +1,32 @@
-------------------------------------------------------------------
STM32CubeProgrammer v2.20.0
-------------------------------------------------------------------
ST-LINK SN : 37FF71064E573436188C1543
ST-LINK FW : V2J47S7
Board : --
Voltage : 3.28V
SWD freq : 950 KHz
Connect mode: Hot Plug
Reset mode : Software reset
Device ID : 0x467
Revision ID : Rev Z
Device name : STM32G0B0xx/B1xx/C1xx
Flash size : 128 KBytes
Device type : MCU
Device CPU : Cortex-M0+
BL Version : 0x92
Reading 32-bit memory content
Size : 128 Bytes
Address: : 0x200002C8
0x200002C8 : 00000000 00000000 00000000 00001951
0x200002D8 : 00000000 FFFFFD49 00011073 00000064
0x200002E8 : 55AA7FFF 00640032 00C80096 0000300C
0x200002F8 : 00001897 00001901 00001765 00001900
0x20000308 : 00001901 00000000 00000000 000001A5
0x20000318 : 00000000 FFFFFFBA 00000000 00000000
0x20000328 : 00000017 000004CE 000000CA 00000000
0x20000338 : 00000000 00000000 00000000 2637AB02
@@ -0,0 +1,35 @@
-------------------------------------------------------------------
STM32CubeProgrammer v2.20.0
-------------------------------------------------------------------
ST-LINK SN : 37FF71064E573436188C1543
ST-LINK FW : V2J47S7
Board : --
Voltage : 3.28V
SWD freq : 950 KHz
Connect mode: Hot Plug
Reset mode : Software reset
Device ID : 0x467
Revision ID : Rev Z
Device name : STM32G0B0xx/B1xx/C1xx
Flash size : 128 KBytes
Device type : MCU
Device CPU : Cortex-M0+
BL Version : 0x92
Reading 32-bit memory content
Size : 4 Bytes
Address: : 0x40006480
0x40006480 : 0103002B
Reading 32-bit memory content
Size : 4 Bytes
Address: : 0x40006880
0x40006880 : 0103002B
@@ -0,0 +1,59 @@
-------------------------------------------------------------------
STM32CubeProgrammer v2.20.0
-------------------------------------------------------------------
ST-LINK SN : 37FF71064E573436188C1543
ST-LINK FW : V2J47S7
Board : --
Voltage : 3.28V
SWD freq : 950 KHz
Connect mode: Under Reset
Reset mode : Hardware reset
Device ID : 0x467
Revision ID : Rev Z
Device name : STM32G0B0xx/B1xx/C1xx
Flash size : 128 KBytes
Device type : MCU
Device CPU : Cortex-M0+
BL Version : 0x92
Opening and parsing file: AMI_Controller.bin
Memory Programming ...
File : AMI_Controller.bin
Size : 15.25 KB
Address : 0x08000000
Erasing memory corresponding to segment 0:
Erasing internal memory sectors [0 7]
Download in Progress:
�������������������������������������������������� 0%
�������������������������������������������������� 100%
File download complete
Time elapsed during download operation: 00:00:00.756
Verifying...
Read progress:
�������������������������������������������������� 50%
�������������������������������������������������� 100%
Time elapsed during verifying operation: 00:00:00.250
Download verified successfully
MCU Reset
Software reset is performed
Core run
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

@@ -0,0 +1,175 @@
{
"results": [
{
"task": 1,
"cancel_no_can_request": true,
"confirm_can_request_correct": true,
"cancel_frames": [],
"confirm_frames": [
{
"time_s": 4.266792699927464,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 01 00 01 54 0f 00 00"
}
],
"screenshots": [
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task1_cancel_page.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task1_cancel_return.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task1_confirm_page.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task1_confirm_return.png"
]
},
{
"task": 2,
"cancel_no_can_request": true,
"confirm_can_request_correct": true,
"cancel_frames": [],
"confirm_frames": [
{
"time_s": 8.49011349992361,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 02 01 01 d2 1f 00 00"
}
],
"screenshots": [
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task2_cancel_page.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task2_cancel_return.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task2_confirm_page.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task2_confirm_return.png"
]
},
{
"task": 3,
"cancel_no_can_request": true,
"confirm_can_request_correct": true,
"cancel_frames": [],
"confirm_frames": [
{
"time_s": 12.718478399910964,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 03 02 01 5f 30 00 00"
}
],
"screenshots": [
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task3_cancel_page.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task3_cancel_return.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task3_confirm_page.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task3_confirm_return.png"
]
},
{
"task": 4,
"cancel_no_can_request": true,
"confirm_can_request_correct": true,
"cancel_frames": [],
"confirm_frames": [
{
"time_s": 16.947464799974114,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 04 03 01 dd 40 00 00"
}
],
"screenshots": [
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task4_cancel_page.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task4_cancel_return.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task4_confirm_page.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task4_confirm_return.png"
]
},
{
"task": 5,
"cancel_no_can_request": true,
"confirm_can_request_correct": true,
"cancel_frames": [],
"confirm_frames": [
{
"time_s": 21.19982430001255,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 05 04 01 79 51 00 00"
}
],
"screenshots": [
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task5_cancel_page.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task5_cancel_return.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task5_confirm_page.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task5_confirm_return.png"
]
},
{
"task": 6,
"cancel_no_can_request": true,
"confirm_can_request_correct": true,
"cancel_frames": [],
"confirm_frames": [
{
"time_s": 25.43611010001041,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 06 05 01 02 62 00 00"
}
],
"screenshots": [
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task6_cancel_page.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task6_cancel_return.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task6_confirm_page.png",
"D:\\YMR\\AMI\\tmp\\can1-test-20261002\\sdc_bms_function_task6_confirm_return.png"
]
}
],
"rx": [
{
"time_s": 4.266792699927464,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 01 00 01 54 0f 00 00"
},
{
"time_s": 8.49011349992361,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 02 01 01 d2 1f 00 00"
},
{
"time_s": 12.718478399910964,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 03 02 01 5f 30 00 00"
},
{
"time_s": 16.947464799974114,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 04 03 01 dd 40 00 00"
},
{
"time_s": 21.19982430001255,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 05 04 01 79 51 00 00"
},
{
"time_s": 25.43611010001041,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 06 05 01 02 62 00 00"
}
],
"pcan_status": "0x0"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

@@ -0,0 +1,32 @@
-------------------------------------------------------------------
STM32CubeProgrammer v2.20.0
-------------------------------------------------------------------
ST-LINK SN : 37FF71064E573436188C1543
ST-LINK FW : V2J47S7
Board : --
Voltage : 3.28V
SWD freq : 950 KHz
Connect mode: Hot Plug
Reset mode : Software reset
Device ID : 0x467
Revision ID : Rev Z
Device name : STM32G0B0xx/B1xx/C1xx
Flash size : 128 KBytes
Device type : MCU
Device CPU : Cortex-M0+
BL Version : 0x92
Reading 32-bit memory content
Size : 128 Bytes
Address: : 0x200002C8
0x200002C8 : 00000000 00000000 00000000 00003F7E
0x200002D8 : 00000000 00000000 00010221 00000064
0x200002E8 : 55AA7FFF 00640032 00C80096 00003188
0x200002F8 : 00003EC5 00003F33 00003D92 00003F32
0x20000308 : 00003F33 00000000 00000000 00000037
0x20000318 : 00000000 00000000 00000000 00000000
0x20000328 : 0000001B 000004F4 000000CA 00000000
0x20000338 : 00000000 00000000 00000000 2637AB02
Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

@@ -0,0 +1,32 @@
-------------------------------------------------------------------
STM32CubeProgrammer v2.20.0
-------------------------------------------------------------------
ST-LINK SN : 37FF71064E573436188C1543
ST-LINK FW : V2J47S7
Board : --
Voltage : 3.28V
SWD freq : 950 KHz
Connect mode: Hot Plug
Reset mode : Software reset
Device ID : 0x467
Revision ID : Rev Z
Device name : STM32G0B0xx/B1xx/C1xx
Flash size : 128 KBytes
Device type : MCU
Device CPU : Cortex-M0+
BL Version : 0x92
Reading 32-bit memory content
Size : 128 Bytes
Address: : 0x200002C8
0x200002C8 : 00000000 00000000 00000000 0000326B
0x200002D8 : 00000000 FFFFFD49 00011073 00000064
0x200002E8 : 55AA7FFF 00640032 00C80096 0000300C
0x200002F8 : 0000254A 000025B7 00002418 0000326B
0x20000308 : 000025B7 00000000 00000000 000001A5
0x20000318 : 00000000 FFFFFFBA 00000000 00000000
0x20000328 : 00000017 000004CE 00000000 00000000
0x20000338 : 00000000 00000000 00000000 2637AB02
Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

@@ -0,0 +1,32 @@
-------------------------------------------------------------------
STM32CubeProgrammer v2.20.0
-------------------------------------------------------------------
ST-LINK SN : 37FF71064E573436188C1543
ST-LINK FW : V2J47S7
Board : --
Voltage : 3.28V
SWD freq : 950 KHz
Connect mode: Hot Plug
Reset mode : Software reset
Device ID : 0x467
Revision ID : Rev Z
Device name : STM32G0B0xx/B1xx/C1xx
Flash size : 128 KBytes
Device type : MCU
Device CPU : Cortex-M0+
BL Version : 0x92
Reading 32-bit memory content
Size : 128 Bytes
Address: : 0x200002C8
0x200002C8 : 00000000 00000000 00000000 00000BEC
0x200002D8 : 00000000 0000007B 00010FA0 00000064
0x200002E8 : 55AA7FFF 00640032 00C80096 00002008
0x200002F8 : 00000B3A 00000BA7 00000A01 00000BA7
0x20000308 : 00000BA7 00000000 00000000 00000190
0x20000318 : 00000000 0000000C 00000000 00000000
0x20000328 : 00000028 00000334 000000CA 00000000
0x20000338 : 00000000 00000000 00000000 2637AB02
@@ -0,0 +1,100 @@
{
"real_mcu_snapshot_checks": [
{
"stage": "standard",
"values": [
0,
400,
0,
12,
0,
0,
40,
820
],
"valid_mask": "0xca",
"adc_mv": 8200,
"hv_tenths": 4000,
"current_tenths": 123,
"pass": true
},
{
"stage": "extended",
"values": [
0,
421,
0,
-70,
0,
0,
23,
1230
],
"valid_mask": "0xca",
"adc_mv": 12300,
"hv_tenths": 4211,
"current_tenths": -695,
"pass": true
},
{
"stage": "all_temp_invalid",
"values": [
0,
421,
0,
-70,
0,
0,
23,
1230
],
"valid_mask": "0x8a",
"adc_mv": 12300,
"hv_tenths": 4211,
"current_tenths": -695,
"pass": true
},
{
"stage": "source_timeout",
"values": [
0,
421,
0,
-70,
0,
0,
23,
1230
],
"valid_mask": "0x0",
"adc_mv": 12300,
"hv_tenths": 4211,
"current_tenths": -695,
"pass": true
},
{
"stage": "recovered",
"values": [
0,
55,
0,
0,
0,
0,
27,
1268
],
"valid_mask": "0xca",
"adc_mv": 12680,
"hv_tenths": 545,
"current_tenths": 0,
"pass": true
}
],
"task_confirm_pass": 6,
"task_cancel_pass": 6,
"pcan_status": "0x0",
"firmware_sha256": "f0da6ec9c5c8a4f803e4cdd28bb73c6458e010b15f32d3eaef5c3a1b60d8827b",
"hmi_sha256": "8a37e4961f90671f04e55ba94c173ae8fbfc5e30c2a3e74a2c37148157c3d16d",
"visual_review": "Screenshots inspected separately: standard, extended, invalid, timeout, recovery and cross-page."
}
File diff suppressed because it is too large Load Diff
+12 -10
View File
@@ -1,9 +1,11 @@
# AMI 仪表通讯交接文档
协议版本 1.2(新增低压电池电压) | 2026-10-01
屏幕接口 1.2;MCU CAN 协议 2.0(SDC / BMS) | 2026-10-03
适用工程:AMI.HMI;屏幕 TJC4827X543_011,480 × 272;编辑器 USART HMI 1.68.1.3037。本文以随附的精简指令版工程为准。
2026-10-03 补充:dash 增加全局虚拟浮点控件 `lvbat`,两位小数,`dash.lvbat.val=1230` 显示 12.30 V,来源为 SDC ADC。当前 MCU CAN 输入见 [SDC_BMS协议.md](SDC_BMS协议.md);原整数高压电压/电流控件四舍五入为 1 V / 1 A。灰色数值表示未知或失效。SDC GPIO 尚无具名安全状态映射,当前 MCU 不生成正常/故障判断。
## 1. 接手先看这三点
主控 → 屏幕:发送文本指令,末尾必须追加三个实际字节 FF FF FF。屏幕 → 主控:用户确认任务后发送固定 6 字节帧 AA 55 01 NN 0D 0A。这两种帧的结束方式不同。
@@ -117,16 +119,16 @@ Program.s 上电通过 printh 发出 00 00 00 FF FF FF 88 FF FF FF。该启动
| --- | --- | --- |
| 低压电池电压 | dash.lvbat.val=1260 | 0.01 V/计数;显示 12.60 V |
| 当前车速 | dash.speed.val=30 | 界面标注 km/h;示例显示 30 |
| 高压电压 | dash.ts.val=300 | 示例为显示值;电气单位需与主控统一 |
| 高压电压 | dash.ts.val=300 | 整数 V;BMS 原始 0.1 V 四舍五入 |
| 扭矩千分 | dash.mct.val=500 | 保留界面“扭矩千分”定义 |
| 高压电流 | dash.dl.val=20 | 示例为显示值 |
| 电机温度 | dash.djwd.val=45 | 示例为显示值 |
| MCU 温度 | dash.mcuwd.val=40 | 示例为显示值 |
| 最高单体 | dash.dtwd.val=50 | 含义/单位待主控确认,不能仅按控件名猜测 |
| 高压电流 | dash.dl.val=20 | 整数 A;BMS 原始偏置 uint16 换算后四舍五入 |
| 电机温度 | dash.djwd.val=45 | 控件支持整数 ℃;当前 MCU 无来源,保持无效 |
| MCU 温度 | dash.mcuwd.val=40 | 控件支持整数 ℃;当前 MCU 无来源,保持无效 |
| 最高单体 | dash.dtwd.val=50 | BMS 最高有效实际温度,整数 ℃ |
低压电池电压放在车速上方,保留两位小数。主控若采集为 mV,应先换算为 0.01 V 整数(例如 12600 mV → 1260)。指令 dash.lvbat.val=1260 后仍追加 FF FF FF。该值为全局,切页保留,上电设计初值 0.00 V;初值和断线后的旧值不代表有效测量,也没有自动低压告警。
数值 val 按有符号 32 位整数使用。除新增低压电池电压外,高压电压、电流、温度及“最高单体”的单位、有效范围、无效值和缩放未形成主控协议,接手者应与主控统一。
数值 val 按有符号 32 位整数使用。当前 CAN 来源、单位、缩放、独立超时和有效颜色已在 [AMI_CAN_DBC说明.md](AMI_CAN_DBC说明.md) 定义。车速、扭矩、电机/逆变器温度尚缺来源或标定,不能把示例值当作测量结果。
## 页面指令
@@ -183,13 +185,13 @@ int ami_set_debug(unsigned id, unsigned state)
## 已完成与待验证
已完成:USART HMI 编译 0 错误、0 警告;模拟器验证跨页数值更新、正常/故障/未知转换,以及 d1 双位置同步;新增 lvbat 已验证 1260 显示 12.60 V、跨页更新 1185 显示 11.85 V。六个任务回传此前已做模拟检查。待完成:实际屏幕下载、UART 收发、触摸行为、数据时序和车辆安全动作。C 示例仅为驱动接入参考,本次未在目标主控工程中编译。
已完成:USART HMI 编译 0 错误、0 警告;模拟器验证跨页数值更新、正常/故障/未知转换,以及 d1 双位置同步;新增 lvbat 已验证 1260 显示 12.60 V、跨页更新 1185 显示 11.85 V。六个任务回传此前已做模拟检查。2026-10-03 已通过实物 CAN1 / MCU / USART2 / COM4 到官方 HMI 调试器联调,含六个任务确认/取消、失效和恢复。待完成:物理屏幕下载、实物触摸与完整时延、CAN2 接线和车辆安全动作。C 示例仅为驱动接入参考,本次未在目标主控工程中编译。
## 8. 工程版本与资料
配套 AMI.HMI 的 SHA-256:
c667e115e3a7c8c1fd08e9c135d101c4d5bb1d3fe4b3f46ca80a85e860a06d1f
8a37e4961f90671f04e55ba94c173ae8fbfc5e30c2a3e74a2c37148157c3d16d
旧版工程不能与本版 dN 接口混用。配套文件包括 AMI.HMI、PDF、通讯交接文档.md 和 ami_debug_send.c;其中 Markdown 为可编辑文字源,C 文件为参考发送函数。仓库中的实际位置见 README。
旧版工程不能与本版 dN 接口混用。配套文件包括 AMI.HMI、AMI.dbc、DBC 说明、通讯交接文档.md 和 ami_debug_send.c;旧 PDF 保留为 v1.2 历史资料,其中 Markdown 为可编辑文字源,C 文件为参考发送函数。仓库中的实际位置见 README。
官方协议依据:wiki.tjc1688.com/commands/index.html;wiki.tjc1688.com/return/index.html;wiki.tjc1688.com/variables/bkcmd.html。项目自定义任务帧和 dN 编号以本文及配套工程为准。
+9 -4
View File
@@ -1,4 +1,9 @@
协议v1.2:新增dash.lvbat.val,0.01V/计数,显示两位小数;d0-d15保持不变,tm0=250ms。
编译0错误0警告;模拟器验证1260显示12.60V、跨页1185显示11.85V;此前通过debug三态显示及d1双位置同步。
真实屏幕及主控串口未联机验证。
主控C示例尚未在目标工程编译。
2026-10-03:屏幕数字接口1.2,MCU CAN输入2.0(SDC/BMS)。
AMI.dbc包含10条Classic CAN报文和33个信号,CAN1/CAN2为500 kbit/s。
cantools 44.1.0严格解析、24个已知报文、六个任务号及计数边界、标准/扩展ID、偏置电流、无效温度和SDC布局一致性检查通过;具体复现命令见docs/AMI_CAN_DBC说明.md。
HMI编译0错误0警告;固件Release编译、SWD烧录校验通过。
已实测CAN盒->实物AMI CAN1/MCU->USART2->COM4->官方HMI调试器:低压电压、高压电压/电流、最高有效温度、无效数据、超时/恢复、跨页更新、HMI重连。
六个任务确认均收到正确0x300请求,六个取消均未发送;该测试条件为CAN1持续有有效输入。
证据在docs/evidence/2026-10-03/sdc-bms;联调报告见docs/SDC_BMS联调报告.md。
未接物理串口屏或真实SDC/BMS节点,未实测CAN2、LED极性和车辆执行/安全动作;未定义电机温度、轮频到车速标定和GPIO到具名安全信号映射。
原C示例是屏幕debug接口参考,不代表整车控制已实现。