Add CAN inputs for drivetrain display values with DBC and bench evidence

This commit is contained in:
shenlefengnai-rgb
2026-10-03 18:53:17 +08:00
parent ceb88a90a5
commit dade0e5d3a
51 changed files with 7084 additions and 51 deletions
+2
View File
@@ -10,3 +10,5 @@
# Keep vendor source and captured logs as supplied. # Keep vendor source and captured logs as supplied.
firmware/Drivers/** -whitespace firmware/Drivers/** -whitespace
docs/evidence/**/*.log -whitespace docs/evidence/**/*.log -whitespace
# Byte hashes in this capture manifest refer to the original bytes.
docs/evidence/2026-10-03/v2.2-display/* -text
+24 -4
View File
@@ -1,4 +1,4 @@
VERSION "AMI-2.1-2026-10-03" VERSION "AMI-2.2-2026-10-03"
NS_ : NS_ :
NS_DESC_ NS_DESC_
@@ -12,6 +12,15 @@ BS_:
BU_: AMI VCU SDC_ACQ_DAC BMS BU_: AMI VCU SDC_ACQ_DAC BMS
BO_ 386 AMI_DrivetrainDisplay: 8 VCU
SG_ Torque_Permille : 0|16@1- (1,0) [-1000|1000] "permille" AMI
SG_ Motor_Temperature : 16|16@1- (0.1,0) [-3276.8|3276.7] "degC" AMI
SG_ MCU_Temperature : 32|16@1- (0.1,0) [-3276.8|3276.7] "degC" AMI
SG_ Torque_Valid : 48|1@1+ (1,0) [0|1] "" AMI
SG_ Motor_Temperature_Valid : 49|1@1+ (1,0) [0|1] "" AMI
SG_ MCU_Temperature_Valid : 50|1@1+ (1,0) [0|1] "" AMI
SG_ Protocol_Version : 56|8@1+ (1,0) [1|1] "" AMI
BO_ 768 AMI_TaskRequest: 8 AMI BO_ 768 AMI_TaskRequest: 8 AMI
SG_ Protocol_Version : 0|8@1+ (1,0) [1|1] "" VCU SG_ Protocol_Version : 0|8@1+ (1,0) [1|1] "" VCU
SG_ Task_ID : 8|8@1+ (1,0) [1|6] "" VCU SG_ Task_ID : 8|8@1+ (1,0) [1|6] "" VCU
@@ -65,12 +74,18 @@ BO_ 2556444915 BMS_Status_Extended: 8 BMS
BO_ 2556510451 BMS_Extremes_Extended: 8 BMS BO_ 2556510451 BMS_Extremes_Extended: 8 BMS
SG_ Maximum_Cell_Temperature : 39|8@0+ (1,-40) [-40|215] "degC" AMI SG_ Maximum_Cell_Temperature : 39|8@0+ (1,-40) [-40|215] "degC" AMI
CM_ "AMI CAN interface v2.1. CAN1: 500000 bit/s; CAN2: 250000 bit/s. Both use Classic CAN, identical IDs, parsing and task request capability. This file is CAN1; use AMI_CAN2_250k.dbc for CAN2. Frames are not bridged between buses. SDC fields follow SDC_ACQ_DAC.dbc VERSION 1.1. BMS consumed fields follow BmsMonitor-CANTest commit e65c95203d1689df05343775982d7e85bd782646. Omitted bytes/signals are not interpreted by the AMI firmware. No motor temperature, calibrated vehicle speed, torque, task execution feedback or AMI heartbeat frame is defined."; CM_ "AMI CAN interface v2.2. CAN1: 500000 bit/s; CAN2: 250000 bit/s. Both use Classic CAN, identical IDs, parsing and task request capability. This file is CAN1; use AMI_CAN2_250k.dbc for CAN2. Frames are not bridged between buses. SDC fields follow SDC_ACQ_DAC.dbc VERSION 1.1. BMS consumed fields follow BmsMonitor-CANTest commit e65c95203d1689df05343775982d7e85bd782646. AMI_DrivetrainDisplay is a custom instrument input; native motor-controller protocols are not defined. No calibrated vehicle speed, task execution feedback or AMI heartbeat frame is defined.";
CM_ BU_ AMI "Instrument MCU. UART HMI task confirmation produces AMI_TaskRequest. Display values are received from SDC and BMS."; CM_ BU_ AMI "Instrument MCU. UART HMI task confirmation produces AMI_TaskRequest. Display values come from SDC, BMS and custom VCU display inputs.";
CM_ BU_ VCU "Logical receiver of task selection requests; execution and safety interlocks are outside this AMI interface."; CM_ BU_ VCU "Logical task receiver and sender/adapter for custom drivetrain display data. Execution and safety interlocks are outside this interface.";
CM_ BU_ SDC_ACQ_DAC "Source of ADC, capture frequencies and raw PD0-PD14 states; both SDC CAN ports carry the same protocol."; CM_ BU_ SDC_ACQ_DAC "Source of ADC, capture frequencies and raw PD0-PD14 states; both SDC CAN ports carry the same protocol.";
CM_ BU_ BMS "Logical BMS source. Source frame periods are not specified here; do not infer them from test traffic."; CM_ BU_ BMS "Logical BMS source. Source frame periods are not specified here; do not infer them from test traffic.";
CM_ BO_ 386 "Standard ID 0x182, DLC exactly 8, send every 100 ms. Three little-endian signed int16 values: torque permille, motor temperature in 0.1 degC, motor-controller MCU temperature in 0.1 degC. Byte 6 bits 0/1/2 are individual valid flags; bits 3..7 must be zero. Byte 7 is fixed version 1. Wrong DLC, frame type, version or reserved bits rejects the whole frame without refreshing timeout. Valid fields update white; invalid fields retain last value and turn grey. Source expires independently after 2000 ms. Display only, no motor torque actuation.";
CM_ SG_ 386 Torque_Permille "Signed -1000..1000 permille relative to sender-defined reference torque. Out-of-range marks only torque invalid; temperatures still update.";
CM_ SG_ 386 Motor_Temperature "Signed int16 raw tenths degC. Screen rounds to whole degC, halves away from zero.";
CM_ SG_ 386 MCU_Temperature "Sender-supplied motor-controller MCU/inverter temperature, not the AMI STM32 die temperature. Screen rounds to whole degC, halves away from zero.";
CM_ SG_ 386 Protocol_Version "Fixed 1, independent of AMI interface package version 2.2.";
CM_ BO_ 768 "Standard ID 0x300, DLC 8. Event-driven: one request on valid HMI task confirmation, none on cancel. Counter wraps at 255. Request is not proof of execution and is not SDC ASSI_Lamp_Set (0x6A5). No CAN application-level acknowledgement is defined. Route to ports with valid RX within 500 ms; if none, attempt both."; CM_ BO_ 768 "Standard ID 0x300, DLC 8. Event-driven: one request on valid HMI task confirmation, none on cancel. Counter wraps at 255. Request is not proof of execution and is not SDC ASSI_Lamp_Set (0x6A5). No CAN application-level acknowledgement is defined. Route to ports with valid RX within 500 ms; if none, attempt both.";
CM_ SG_ 768 Protocol_Version "Fixed 1."; CM_ SG_ 768 Protocol_Version "Fixed 1.";
CM_ SG_ 768 Task_ID "Valid task values are 1 through 6."; CM_ SG_ 768 Task_ID "Valid task values are 1 through 6.";
@@ -103,6 +118,10 @@ CM_ SG_ 2556444915 Pack_Current "Current = raw_uint16 * 0.1 - 500 A.";
CM_ BO_ 2556510451 "Extended arbitration ID 0x186140F3, DLC 8. AMI consumes byte 4 as maximum cell temperature. Raw 0xFF is invalid. Other bytes, including BMS low-voltage bytes 6..7, are not used and cannot override SDC ADC. DBC BO_ numeric ID includes 0x80000000."; CM_ BO_ 2556510451 "Extended arbitration ID 0x186140F3, DLC 8. AMI consumes byte 4 as maximum cell temperature. Raw 0xFF is invalid. Other bytes, including BMS low-voltage bytes 6..7, are not used and cannot override SDC ADC. DBC BO_ numeric ID includes 0x80000000.";
VAL_ 768 Protocol_Version 1 "Version_1"; VAL_ 768 Protocol_Version 1 "Version_1";
VAL_ 386 Protocol_Version 1 "Version_1";
VAL_ 386 Torque_Valid 0 "Invalid" 1 "Valid";
VAL_ 386 Motor_Temperature_Valid 0 "Invalid" 1 "Valid";
VAL_ 386 MCU_Temperature_Valid 0 "Invalid" 1 "Valid";
VAL_ 768 Task_ID 1 "Skidpad" 2 "Acceleration" 3 "Autocross" 4 "Inspection_Test" 5 "EBS_Test" 6 "Manual_Driving"; VAL_ 768 Task_ID 1 "Skidpad" 2 "Acceleration" 3 "Autocross" 4 "Inspection_Test" 5 "EBS_Test" 6 "Manual_Driving";
VAL_ 768 Request_Source 1 "AMI_HMI"; VAL_ 768 Request_Source 1 "AMI_HMI";
VAL_ 1696 Board_Identifier 161 "A11_F407"; VAL_ 1696 Board_Identifier 161 "A11_F407";
@@ -130,6 +149,7 @@ BA_DEF_DEF_ "GenMsgCycleTime" 0;
BA_ "BusType" "CAN"; BA_ "BusType" "CAN";
BA_ "Baudrate" 500000; BA_ "Baudrate" 500000;
BA_ "AMIPort" "CAN1"; BA_ "AMIPort" "CAN1";
BA_ "GenMsgCycleTime" BO_ 386 100;
BA_ "GenMsgCycleTime" BO_ 1696 100; BA_ "GenMsgCycleTime" BO_ 1696 100;
BA_ "GenMsgCycleTime" BO_ 1697 500; BA_ "GenMsgCycleTime" BO_ 1697 500;
BA_ "GenMsgCycleTime" BO_ 1698 20; BA_ "GenMsgCycleTime" BO_ 1698 20;
+24 -4
View File
@@ -1,4 +1,4 @@
VERSION "AMI-2.1-2026-10-03" VERSION "AMI-2.2-2026-10-03"
NS_ : NS_ :
NS_DESC_ NS_DESC_
@@ -12,6 +12,15 @@ BS_:
BU_: AMI VCU SDC_ACQ_DAC BMS BU_: AMI VCU SDC_ACQ_DAC BMS
BO_ 386 AMI_DrivetrainDisplay: 8 VCU
SG_ Torque_Permille : 0|16@1- (1,0) [-1000|1000] "permille" AMI
SG_ Motor_Temperature : 16|16@1- (0.1,0) [-3276.8|3276.7] "degC" AMI
SG_ MCU_Temperature : 32|16@1- (0.1,0) [-3276.8|3276.7] "degC" AMI
SG_ Torque_Valid : 48|1@1+ (1,0) [0|1] "" AMI
SG_ Motor_Temperature_Valid : 49|1@1+ (1,0) [0|1] "" AMI
SG_ MCU_Temperature_Valid : 50|1@1+ (1,0) [0|1] "" AMI
SG_ Protocol_Version : 56|8@1+ (1,0) [1|1] "" AMI
BO_ 768 AMI_TaskRequest: 8 AMI BO_ 768 AMI_TaskRequest: 8 AMI
SG_ Protocol_Version : 0|8@1+ (1,0) [1|1] "" VCU SG_ Protocol_Version : 0|8@1+ (1,0) [1|1] "" VCU
SG_ Task_ID : 8|8@1+ (1,0) [1|6] "" VCU SG_ Task_ID : 8|8@1+ (1,0) [1|6] "" VCU
@@ -65,12 +74,18 @@ BO_ 2556444915 BMS_Status_Extended: 8 BMS
BO_ 2556510451 BMS_Extremes_Extended: 8 BMS BO_ 2556510451 BMS_Extremes_Extended: 8 BMS
SG_ Maximum_Cell_Temperature : 39|8@0+ (1,-40) [-40|215] "degC" AMI SG_ Maximum_Cell_Temperature : 39|8@0+ (1,-40) [-40|215] "degC" AMI
CM_ "AMI CAN interface v2.1. CAN1: 500000 bit/s; CAN2: 250000 bit/s. Both use Classic CAN, identical IDs, parsing and task request capability. This file is CAN2; use AMI.dbc for CAN1. Frames are not bridged between buses. SDC fields follow SDC_ACQ_DAC.dbc VERSION 1.1. BMS consumed fields follow BmsMonitor-CANTest commit e65c95203d1689df05343775982d7e85bd782646. Omitted bytes/signals are not interpreted by the AMI firmware. No motor temperature, calibrated vehicle speed, torque, task execution feedback or AMI heartbeat frame is defined."; CM_ "AMI CAN interface v2.2. CAN1: 500000 bit/s; CAN2: 250000 bit/s. Both use Classic CAN, identical IDs, parsing and task request capability. This file is CAN2; use AMI.dbc for CAN1. Frames are not bridged between buses. SDC fields follow SDC_ACQ_DAC.dbc VERSION 1.1. BMS consumed fields follow BmsMonitor-CANTest commit e65c95203d1689df05343775982d7e85bd782646. AMI_DrivetrainDisplay is a custom instrument input; native motor-controller protocols are not defined. No calibrated vehicle speed, task execution feedback or AMI heartbeat frame is defined.";
CM_ BU_ AMI "Instrument MCU. UART HMI task confirmation produces AMI_TaskRequest. Display values are received from SDC and BMS."; CM_ BU_ AMI "Instrument MCU. UART HMI task confirmation produces AMI_TaskRequest. Display values come from SDC, BMS and custom VCU display inputs.";
CM_ BU_ VCU "Logical receiver of task selection requests; execution and safety interlocks are outside this AMI interface."; CM_ BU_ VCU "Logical task receiver and sender/adapter for custom drivetrain display data. Execution and safety interlocks are outside this interface.";
CM_ BU_ SDC_ACQ_DAC "Source of ADC, capture frequencies and raw PD0-PD14 states; both SDC CAN ports carry the same protocol."; CM_ BU_ SDC_ACQ_DAC "Source of ADC, capture frequencies and raw PD0-PD14 states; both SDC CAN ports carry the same protocol.";
CM_ BU_ BMS "Logical BMS source. Source frame periods are not specified here; do not infer them from test traffic."; CM_ BU_ BMS "Logical BMS source. Source frame periods are not specified here; do not infer them from test traffic.";
CM_ BO_ 386 "Standard ID 0x182, DLC exactly 8, send every 100 ms. Three little-endian signed int16 values: torque permille, motor temperature in 0.1 degC, motor-controller MCU temperature in 0.1 degC. Byte 6 bits 0/1/2 are individual valid flags; bits 3..7 must be zero. Byte 7 is fixed version 1. Wrong DLC, frame type, version or reserved bits rejects the whole frame without refreshing timeout. Valid fields update white; invalid fields retain last value and turn grey. Source expires independently after 2000 ms. Display only, no motor torque actuation.";
CM_ SG_ 386 Torque_Permille "Signed -1000..1000 permille relative to sender-defined reference torque. Out-of-range marks only torque invalid; temperatures still update.";
CM_ SG_ 386 Motor_Temperature "Signed int16 raw tenths degC. Screen rounds to whole degC, halves away from zero.";
CM_ SG_ 386 MCU_Temperature "Sender-supplied motor-controller MCU/inverter temperature, not the AMI STM32 die temperature. Screen rounds to whole degC, halves away from zero.";
CM_ SG_ 386 Protocol_Version "Fixed 1, independent of AMI interface package version 2.2.";
CM_ BO_ 768 "Standard ID 0x300, DLC 8. Event-driven: one request on valid HMI task confirmation, none on cancel. Counter wraps at 255. Request is not proof of execution and is not SDC ASSI_Lamp_Set (0x6A5). No CAN application-level acknowledgement is defined. Route to ports with valid RX within 500 ms; if none, attempt both."; CM_ BO_ 768 "Standard ID 0x300, DLC 8. Event-driven: one request on valid HMI task confirmation, none on cancel. Counter wraps at 255. Request is not proof of execution and is not SDC ASSI_Lamp_Set (0x6A5). No CAN application-level acknowledgement is defined. Route to ports with valid RX within 500 ms; if none, attempt both.";
CM_ SG_ 768 Protocol_Version "Fixed 1."; CM_ SG_ 768 Protocol_Version "Fixed 1.";
CM_ SG_ 768 Task_ID "Valid task values are 1 through 6."; CM_ SG_ 768 Task_ID "Valid task values are 1 through 6.";
@@ -103,6 +118,10 @@ CM_ SG_ 2556444915 Pack_Current "Current = raw_uint16 * 0.1 - 500 A.";
CM_ BO_ 2556510451 "Extended arbitration ID 0x186140F3, DLC 8. AMI consumes byte 4 as maximum cell temperature. Raw 0xFF is invalid. Other bytes, including BMS low-voltage bytes 6..7, are not used and cannot override SDC ADC. DBC BO_ numeric ID includes 0x80000000."; CM_ BO_ 2556510451 "Extended arbitration ID 0x186140F3, DLC 8. AMI consumes byte 4 as maximum cell temperature. Raw 0xFF is invalid. Other bytes, including BMS low-voltage bytes 6..7, are not used and cannot override SDC ADC. DBC BO_ numeric ID includes 0x80000000.";
VAL_ 768 Protocol_Version 1 "Version_1"; VAL_ 768 Protocol_Version 1 "Version_1";
VAL_ 386 Protocol_Version 1 "Version_1";
VAL_ 386 Torque_Valid 0 "Invalid" 1 "Valid";
VAL_ 386 Motor_Temperature_Valid 0 "Invalid" 1 "Valid";
VAL_ 386 MCU_Temperature_Valid 0 "Invalid" 1 "Valid";
VAL_ 768 Task_ID 1 "Skidpad" 2 "Acceleration" 3 "Autocross" 4 "Inspection_Test" 5 "EBS_Test" 6 "Manual_Driving"; VAL_ 768 Task_ID 1 "Skidpad" 2 "Acceleration" 3 "Autocross" 4 "Inspection_Test" 5 "EBS_Test" 6 "Manual_Driving";
VAL_ 768 Request_Source 1 "AMI_HMI"; VAL_ 768 Request_Source 1 "AMI_HMI";
VAL_ 1696 Board_Identifier 161 "A11_F407"; VAL_ 1696 Board_Identifier 161 "A11_F407";
@@ -130,6 +149,7 @@ BA_DEF_DEF_ "GenMsgCycleTime" 0;
BA_ "BusType" "CAN"; BA_ "BusType" "CAN";
BA_ "Baudrate" 250000; BA_ "Baudrate" 250000;
BA_ "AMIPort" "CAN2"; BA_ "AMIPort" "CAN2";
BA_ "GenMsgCycleTime" BO_ 386 100;
BA_ "GenMsgCycleTime" BO_ 1696 100; BA_ "GenMsgCycleTime" BO_ 1696 100;
BA_ "GenMsgCycleTime" BO_ 1697 500; BA_ "GenMsgCycleTime" BO_ 1697 500;
BA_ "GenMsgCycleTime" BO_ 1698 20; BA_ "GenMsgCycleTime" BO_ 1698 20;
+9 -4
View File
@@ -2,19 +2,24 @@
YMR A11 仪表,使用淘晶驰 TJC4827X543_011 串口屏,分辨率 480 × 272。 YMR A11 仪表,使用淘晶驰 TJC4827X543_011 串口屏,分辨率 480 × 272。
当前 MCU CAN 输入为 **v2.1(CAN1 500 kbit/s、CAN2 250 kbit/s,2026-10-03)**,两路保留相同的 SDC / BMS 解码和任务收发功能;屏幕沿用 debug 数字状态接口。工程使用 USART HMI 1.68.1.3037 编辑、编译。 当前 MCU CAN 输入为 **v2.2(CAN1 500 kbit/s、CAN2 250 kbit/s,2026-10-03)**,新增标准 `0x182`,设置仪表上的扭矩千分、电机温度和 MCU 温度。两路保留相同解码和任务收发功能;屏幕沿用 debug 数字状态接口。工程使用 USART HMI 1.68.1.3037 编辑、编译。
dash 顶部已加入低压电池电压 `lvbat`(两位小数),来源是 SDC `0x6A1` ADC mV。高压电压、电流来自 BMS `0x140` / 扩展 `0x186040F3`,现有控件显示整数单位;最高单体温度取 `0x156` 的有效实际温度最大值,或扩展 `0x186140F3`。旧 `0x180 / 0x181 / 0x280` 输入不再使用。 dash 顶部已加入低压电池电压 `lvbat`(两位小数),来源是 SDC `0x6A1` ADC mV。高压电压、电流来自 BMS `0x140` / 扩展 `0x186040F3`,现有控件显示整数单位;最高单体温度取 `0x156` 的有效实际温度最大值,或扩展 `0x186140F3`。旧 `0x180 / 0x181 / 0x280` 输入不再使用。
CAN 工具设置标准 ID `0x182`、DLC `8`、周期 `100 ms`,发送 `F4 01 C2 01 90 01 07 01` 即设置 **500‰ / 45℃ / 40℃**。三个数值为小端 int16;温度缩放 0.1℃;字节 6 的 bit0/1/2 为有效标志,字节 7 固定 1。停发超过 2 秒后三个数值变灰。该帧只设置显示;实际电机控制器协议由上游转换。详见 [字节布局和发送示例](docs/AMI_CAN_DBC说明.md#自定义动力显示输入-0x182)。
## 工程与交接资料 ## 工程与交接资料
- [CAN1 DBC](AMI.dbc):500 kbit/s,10 条报文、33 个信号,含标准/扩展帧。 - [CAN1 DBC](AMI.dbc):500 kbit/s,11 条报文、40 个信号,含标准/扩展帧。
- [CAN2 DBC](AMI_CAN2_250k.dbc):250 kbit/s,报文布局与 CAN1 相同。 - [CAN2 DBC](AMI_CAN2_250k.dbc):250 kbit/s,报文布局与 CAN1 相同。
- [DBC 对应说明](docs/AMI_CAN_DBC说明.md):信号布局、枚举、字节序、样例与复现检查。 - [DBC 对应说明](docs/AMI_CAN_DBC说明.md):信号布局、枚举、字节序、样例与复现检查。
- [CAN 报文说明 PDF](output/pdf/AMI_CAN报文说明.pdf):当前 v2.1 协议的中文打印版,包含两路速率和全部 10 条报文。 - [CAN 报文说明 PDF](output/pdf/AMI_CAN报文说明.pdf):当前 v2.2 协议的中文打印版,包含两路速率和全部 11 条报文。
- [CAN 显示发送工具](scripts/send_drivetrain_can.py):通过 python-can 发送扭矩千分和两路温度,支持预览字节、有效标志和适配器参数。
- [v2.2 显示 CAN 测试报告](docs/AMI自定义显示CAN测试报告.md):新帧烧录回读和 CAN2 数据、失效、异常帧测试。
- [联调报告](docs/SDC_BMS联调报告.md):真实 CAN1 / MCU / COM4 到 HMI 调试器的证据。 - [联调报告](docs/SDC_BMS联调报告.md):真实 CAN1 / MCU / COM4 到 HMI 调试器的证据。
- [v2.1 双 CAN 测试报告](docs/CAN1_CAN2_v2.1测试报告.md):烧录和完整回读、CAN1 500K / CAN2 250K 数据与六个任务确认/取消测试。 - [v2.1 双 CAN 测试报告](docs/CAN1_CAN2_v2.1测试报告.md):烧录和完整回读、CAN1 500K / CAN2 250K 数据与六个任务确认/取消测试。
- [当前固件 BIN](output/firmware/AMI_Controller.bin):STM32G0B1CBT6,CAN1 500K / CAN2 250K,已烧录并完成两路分别测试;配套源码在 firmware。 - [当前固件 BIN](output/firmware/AMI_Controller.bin):STM32G0B1CBT6,v2.2,CAN1 500K / CAN2 250K,已烧录并完整回读比对;本次新帧实测 CAN2。
- [此前已联调的 v2.1 BIN](output/firmware/AMI_Controller_v2.1_500k_250k.bin):CAN1 500K / CAN2 250K,保留双 CAN 分别测试的历史版本。
- [此前已联调的 v2.0 BIN](output/firmware/AMI_Controller_v2.0_500k.bin):两路均为 500K,保留历史测试版本。 - [此前已联调的 v2.0 BIN](output/firmware/AMI_Controller_v2.0_500k.bin):两路均为 500K,保留历史测试版本。
- [AMI.HMI](AMI.HMI):最新版屏幕工程,打开后编译并下载到对应型号屏幕。 - [AMI.HMI](AMI.HMI):最新版屏幕工程,打开后编译并下载到对应型号屏幕。
- [通讯交接文档](docs/通讯交接文档.md):可编辑协议说明,包含全部状态编号、任务帧、主页面属性及联调步骤。 - [通讯交接文档](docs/通讯交接文档.md):可编辑协议说明,包含全部状态编号、任务帧、主页面属性及联调步骤。
+50 -7
View File
@@ -1,6 +1,6 @@
# AMI CAN DBC 说明 # AMI CAN DBC 说明
版本:`AMI-2.1-2026-10-03`。由 [AMI.dbc](../AMI.dbc) 自动生成,10 条报文、33 个信号。 版本:`AMI-2.2-2026-10-03`。由 [AMI.dbc](../AMI.dbc) 自动生成,11 条报文、40 个信号。
## 使用范围 ## 使用范围
@@ -11,20 +11,21 @@ CAN1 为 500 kbit/s,CAN2 为 250 kbit/s,均为 Classic CAN、87.5% 采样点
| CAN1 | 500 kbit/s | PA11 / PA12 | [AMI.dbc](../AMI.dbc) | | CAN1 | 500 kbit/s | PA11 / PA12 | [AMI.dbc](../AMI.dbc) |
| CAN2 | 250 kbit/s | PB0 / PB1 | [AMI_CAN2_250k.dbc](../AMI_CAN2_250k.dbc) | | CAN2 | 250 kbit/s | PB0 / PB1 | [AMI_CAN2_250k.dbc](../AMI_CAN2_250k.dbc) |
DBC 的 `Baudrate` / `AMIPort` 分别标注所属总线。每份 DBC 均含 10 条报文、33 个信号;同一份报文表适用于两路。CAN 工具必须按接入端口设置速率,导入 DBC 不一定自动改硬件速率。实际接法:SDC 500 kbit/s 接 CAN1,BMS 250 kbit/s 接 CAN2。 DBC 的 `Baudrate` / `AMIPort` 分别标注所属总线。每份 DBC 均含 11 条报文、40 个信号;同一份报文表适用于两路。CAN 工具必须按接入端口设置速率,导入 DBC 不一定自动改硬件速率。实际接法:SDC 500 kbit/s 接 CAN1,BMS 250 kbit/s 接 CAN2。
FDCAN 时钟 64 MHz,时钟分频为 1;NominalPrescaler 为 CAN1=8、CAN2=16,两路均使用 Sync=1、TimeSeg1=13、TimeSeg2=2、SJW=1。速率 = 64 MHz / Prescaler / (1+13+2);采样点 = (1+13)/16 = 87.5%。 FDCAN 时钟 64 MHz,时钟分频为 1;NominalPrescaler 为 CAN1=8、CAN2=16,两路均使用 Sync=1、TimeSeg1=13、TimeSeg2=2、SJW=1。速率 = 64 MHz / Prescaler / (1+13+2);采样点 = (1+13)/16 = 87.5%。
本 DBC 包含 AMI 唯一发送的 `0x300` 任务请求,以及 AMI 当前识别的 SDC / BMS 输入。SDC `0x6A3` DAC 控制、`0x6A5` ASSI 控制、BMS 其他电芯/故障字段不属于此接口子集。没有定义电机温度、逆变器温度、扭矩、标定后的车速、AMI 周期心跳或 VCU 执行反馈。旧 `0x180 / 0x181 / 0x280` 输入已停用。 本 DBC 包含 AMI 唯一发送的 `0x300` 任务请求,以及 AMI 当前识别的 SDC / BMS 和自定义显示输入。SDC `0x6A3` DAC 控制、`0x6A5` ASSI 控制、BMS 其他电芯/故障字段不属于此接口子集。`0x182` 新增扭矩千分、电机温度和电机控制器 MCU 温度的仪表显示输入;发送者负责转换实际电机控制器协议。未定义标定后的车速、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`。 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;下表范围为编码范围,不表示车辆正常工作范围。 DBC 为 ASCII 编码,注释和枚举使用英文,便于导入 CAN 工具;本文为 UTF-8 中文。物理值 = 原始值 × Factor + Offset;`0x182` 的三个数值为有符号 int16,其他数值按表定义。下表范围为接口允许范围,不表示车辆正常工作范围。
## 报文总览 ## 报文总览
| CAN ID | 类型 | DLC | 报文名 | 方向和作用 | 周期 / 触发 | | CAN ID | 类型 | DLC | 报文名 | 方向和作用 | 周期 / 触发 |
| --- | --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- | --- |
| `0x182` | 标准 | 8 | `AMI_DrivetrainDisplay` | VCU / 测试器 -> AMI:扭矩千分、电机温度、MCU 温度 | 100 ms |
| `0x300` | 标准 | 8 | `AMI_TaskRequest` | AMI -> VCU:用户确认后的任务选择请求 | 确认任务触发 | | `0x300` | 标准 | 8 | `AMI_TaskRequest` | AMI -> VCU:用户确认后的任务选择请求 | 确认任务触发 |
| `0x6A0` | 标准 | 8 | `SDC_Heartbeat` | SDC -> AMI:板标识、版本、序号、上电时间 | 100 ms | | `0x6A0` | 标准 | 8 | `SDC_Heartbeat` | SDC -> AMI:板标识、版本、序号、上电时间 | 100 ms |
| `0x6A1` | 标准 | 2 | `SDC_ADC_InputVoltage` | SDC -> AMI:低压电池电压,精确 DLC=2 | 500 ms | | `0x6A1` | 标准 | 2 | `SDC_ADC_InputVoltage` | SDC -> AMI:低压电池电压,精确 DLC=2 | 500 ms |
@@ -38,12 +39,26 @@ DBC 为 ASCII 编码,注释和枚举使用英文,便于导入 CAN 工具;
扩展帧在 DBC 的 `BO_` 十进制 ID 中设置 bit31:`0x186040F3 -> 2556444915`,`0x186140F3 -> 2556510451`。CAN 工具中使用实际 29 位仲裁 ID 并选择扩展帧;bit31 不是总线上发送的仲裁 ID。 扩展帧在 DBC 的 `BO_` 十进制 ID 中设置 bit31:`0x186040F3 -> 2556444915`,`0x186140F3 -> 2556510451`。CAN 工具中使用实际 29 位仲裁 ID 并选择扩展帧;bit31 不是总线上发送的仲裁 ID。
`GenMsgCycleTime` 仅填写已确认的 SDC 周期 100 / 500 / 20 ms。其余帧未填写周期,默认 0 表示未指定,不据此推断 BMS 周期。 `GenMsgCycleTime` 填写已确认的 SDC 周期 100 / 500 / 20 ms,以及自定义 `0x182` 的约定周期 100 ms。其余帧未填写周期,默认 0 表示未指定,不据此推断 BMS 周期。
## 信号布局 ## 信号布局
Start 为 DBC 起始位,位号从 0 开始。Intel `@1` 从最低有效位起算;Motorola `@0` 从最高有效位起算。例如 BMS 的 `7|16@0+` 对应字节 0..1 大端无符号数,`23|16@0+` 对应字节 2..3。单字节温度的字节序不改变实际解码。 Start 为 DBC 起始位,位号从 0 开始。Intel `@1` 从最低有效位起算;Motorola `@0` 从最高有效位起算。例如 BMS 的 `7|16@0+` 对应字节 0..1 大端无符号数,`23|16@0+` 对应字节 2..3。单字节温度的字节序不改变实际解码。
### 0x182 - AMI_DrivetrainDisplay
| 信号 | Start | 位数 | 字节序 | Factor | Offset | 单位 | 编码范围 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `Torque_Permille` | 0 | 16 | Intel | 1 | 0 | permille | -1000..1000 |
| `Motor_Temperature` | 16 | 16 | Intel | 0.1 | 0 | degC | -3276.8..3276.7 |
| `MCU_Temperature` | 32 | 16 | Intel | 0.1 | 0 | degC | -3276.8..3276.7 |
| `Torque_Valid` | 48 | 1 | Intel | 1 | 0 | - | 0..1 |
| `Motor_Temperature_Valid` | 49 | 1 | Intel | 1 | 0 | - | 0..1 |
| `MCU_Temperature_Valid` | 50 | 1 | Intel | 1 | 0 | - | 0..1 |
| `Protocol_Version` | 56 | 8 | Intel | 1 | 0 | - | 1..1 |
`Torque_Valid`:0 = Invalid,1 = Valid;`Motor_Temperature_Valid`:0 = Invalid,1 = Valid;`MCU_Temperature_Valid`:0 = Invalid,1 = Valid;`Protocol_Version`:1 = Version_1。
### 0x300 - AMI_TaskRequest ### 0x300 - AMI_TaskRequest
| 信号 | Start | 位数 | 字节序 | Factor | Offset | 单位 | 编码范围 | | 信号 | Start | 位数 | 字节序 | Factor | Offset | 单位 | 编码范围 |
@@ -137,6 +152,29 @@ Start 为 DBC 起始位,位号从 0 开始。Intel `@1` 从最低有效位起
`Maximum_Cell_Temperature`:255 = Invalid。 `Maximum_Cell_Temperature`:255 = Invalid。
## 自定义动力显示输入 0x182
标准数据帧,DLC 必须为 8;CAN1 500K 或 CAN2 250K 均可接收,建议每 100 ms 发送。这是一条 AMI 仪表显示设置接口;扭矩千分以发送者定义的基准扭矩归一化,500 表示 500‰。MCU 温度由发送者提供,表示电机控制器 MCU / 逆变器温度,不是 AMI 芯片自动测温。
| 字节 | 字段 | 编码与规则 |
| --- | --- | --- |
| 0..1 | 扭矩千分 | 小端 int16,允许 -1000..1000,直接显示 |
| 2..3 | 电机温度 | 小端 int16 × 0.1 ℃,仪表四舍五入到整数 ℃ |
| 4..5 | MCU 温度 | 小端 int16 × 0.1 ℃,仪表四舍五入到整数 ℃ |
| 6 | 有效标志 | bit0 扭矩、bit1 电机温度、bit2 MCU 温度;1 有效,0 无效;bit3..7 必须为 0 |
| 7 | 帧版本 | 固定 1,与整体接口 v2.2 版本号独立 |
有效值更新并显示白色;标志为 0 时立即变灰并保留历史数字。扭矩超出 -1000..1000 时仅扭矩无效,两个温度仍按各自标志处理。温度的 int16 编码范围为 -3276.8..3276.7 ℃;显示正负半值均向远离零方向取整。扩展帧、错误 DLC、版本非 1 或保留位非 0 均整帧拒绝,不覆盖数值、不刷新超时。连续 2000 ms 未收到合规帧后,三个值同时变灰;BMS / SDC 流量不能续期。
CAN 工具发送样例:标准 ID `182`,DLC `8`,数据 `F4 01 C2 01 90 01 07 01`,周期 `100 ms`。可用仓库脚本发送:
```powershell
python -m pip install -r scripts/requirements-can.txt
python scripts/send_drivetrain_can.py --torque 500 --motor-temp 45 --mcu-temp 40 --dry-run
# PCAN 当前接 CAN2,速率 250000;其他适配器按 python-can 接口参数设置
python scripts/send_drivetrain_can.py --interface pcan --channel PCAN_USBBUS1 --bitrate 250000 --torque 500 --motor-temp 45 --mcu-temp 40 --duration 10
```
## AMI 任务请求语义 ## AMI 任务请求语义
| Task_ID | 任务 | | Task_ID | 任务 |
@@ -160,6 +198,9 @@ Start 为 DBC 起始位,位号从 0 开始。Intel `@1` 从最低有效位起
| 高压电压 | BMS 大端 uint16 × 0.1 V;现有控件四舍五入到整数 V | 2000 ms 无有效 BMS 状态 | | 高压电压 | BMS 大端 uint16 × 0.1 V;现有控件四舍五入到整数 V | 2000 ms 无有效 BMS 状态 |
| 高压电流 | BMS 大端 uint16 × 0.1 - 500 A;四舍五入到整数 A | 2000 ms 无有效 BMS 状态 | | 高压电流 | BMS 大端 uint16 × 0.1 - 500 A;四舍五入到整数 A | 2000 ms 无有效 BMS 状态 |
| 最高单体温度 | `0x156` 有效通道最大值,或扩展帧字节 4 - 40 | 全无效或 2000 ms 无有效温度源 | | 最高单体温度 | `0x156` 有效通道最大值,或扩展帧字节 4 - 40 | 全无效或 2000 ms 无有效温度源 |
| 扭矩千分 | `0x182` 小端 int16,直接更新 `dash.mct.val` | bit0=0、超范围或 2000 ms 超时 |
| 电机温度 | `0x182` int16 × 0.1 ℃,整数显示 `dash.djwd.val` | bit1=0 或 2000 ms 超时 |
| MCU 温度 | `0x182` int16 × 0.1 ℃,整数显示 `dash.mcuwd.val` | bit2=0 或 2000 ms 超时 |
电流字段是带偏置的 uint16,不能按 int16 解码。温度原始 `0xFF` 为无效;DBC 枚举将其标为 Invalid。关闭枚举解码的工具可能显示 215,聚合时必须先排除 原始 255,不能把它当作 215 ℃。有效实际温度范围为 -40..214 ℃。第 9/10 路虚拟温度没有总线字段,最高温度也属于 MCU 派生结果,不新增虚构信号。 电流字段是带偏置的 uint16,不能按 int16 解码。温度原始 `0xFF` 为无效;DBC 枚举将其标为 Invalid。关闭枚举解码的工具可能显示 215,聚合时必须先排除 原始 255,不能把它当作 215 ℃。有效实际温度范围为 -40..214 ℃。第 9/10 路虚拟温度没有总线字段,最高温度也属于 MCU 派生结果,不新增虚构信号。
@@ -172,6 +213,8 @@ BMS 扩展帧的其他字段没有纳入本 DBC,尤其字节 6..7 的低压电
| ID / DLC | 数据(十六进制) | 解码及仪表显示 | | ID / DLC | 数据(十六进制) | 解码及仪表显示 |
| --- | --- | --- | | --- | --- | --- |
| `0x300 / 8` | `01 02 00 01 E8 03 00 00` | 直线加速请求、序号 0、来源 AMI、上电 1000 ms | | `0x300 / 8` | `01 02 00 01 E8 03 00 00` | 直线加速请求、序号 0、来源 AMI、上电 1000 ms |
| `0x182 / 8` | `F4 01 C2 01 90 01 07 01` | 500‰、45.0 ℃、40.0 ℃,三个值有效 |
| `0x182 / 8` | `0C FE 9B FF 33 FF 07 01` | -500‰、-10.1 ℃、-20.5 ℃;显示 -500 / -10 / -21 |
| `0x6A1 / 2` | `0C 30` | ADC 12300 mV;低压 12.30 V | | `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 | | `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 | | `0x140 / 8` | `0F A0 14 03 00 00 00 05` | 400.0 V / +12.3 A;显示 400 / 12 |
@@ -191,8 +234,8 @@ python scripts/export_dbc_docs.py --check
python scripts/verify_dbc.py --sdc-dbc ../SDC_ACQ_DAC/SDC_ACQ_DAC.dbc 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/)。 校验覆盖严格 DBC 解析(长度、信号越界与重叠)、11 个 ID 与固件宏对应、标准/扩展格式、40 个信号、发送/接收节点、SDC / 自定义帧周期、已知报文解码、六个任务号与计数边界编码、大端偏置电流、无效温度枚举、全负温度和截短 DLC。已安装并验证 cantools 44.1.0,接口参考 [cantools 官方文档](https://cantools.readthedocs.io/en/latest/)。
上述是静态及软件编解码验证,另校验两份 DBC 的速率、相同信号布局及源码 / CubeMX 位时序一致。v2.1 已完成烧录、完整 Flash 回读比对、CAN1 500K 与 CAN2 250K 到官方 HMI 调试器的实物测试,详见 [双 CAN 测试报告](CAN1_CAN2_v2.1测试报告.md)。之前 v2.0 的 CAN 盒 -> 实物 AMI CAN1 / MCU -> USART2 -> COM4 -> 官方 HMI 调试器的实际更新和六个任务回传见 [联调报告](SDC_BMS联调报告.md)。物理串口屏、真实 SDC/BMS 节点、两路同时接入和车辆执行动作尚未实测;文档生成和 DBC 解析不替代这些测试。 上述是静态及软件编解码验证,另校验两份 DBC 的速率、相同信号布局及源码 / CubeMX 位时序一致。v2.2 的烧录回读、新帧 CAN2 测试及串口显示核验状态见 [显示 CAN 测试报告](AMI自定义显示CAN测试报告.md)。v2.1 已完成烧录、完整 Flash 回读比对、CAN1 500K 与 CAN2 250K 到官方 HMI 调试器的实物测试,详见 [双 CAN 测试报告](CAN1_CAN2_v2.1测试报告.md)。之前 v2.0 的 CAN 盒 -> 实物 AMI CAN1 / MCU -> USART2 -> COM4 -> 官方 HMI 调试器的实际更新和六个任务回传见 [联调报告](SDC_BMS联调报告.md)。物理串口屏、真实 SDC/BMS 节点、两路同时接入和车辆执行动作尚未实测;文档生成和 DBC 解析不替代这些测试。
修改 AMI.dbc 后运行 `python scripts/export_dbc_docs.py` 更新 CAN2 DBC 和本文;固件字节布局、DBC 与此文档需同时保持一致。 修改 AMI.dbc 后运行 `python scripts/export_dbc_docs.py` 更新 CAN2 DBC 和本文;固件字节布局、DBC 与此文档需同时保持一致。
+43
View File
@@ -0,0 +1,43 @@
# AMI v2.2 自定义显示 CAN 测试
2026-10-03,新增标准 `0x182 / DLC 8`,用 CAN 设置扭矩千分、电机温度和 MCU 温度。CAN1 500K / CAN2 250K 保持原速率;本次 CAN 盒接 CAN2,250 kbit/s。
## 固件和烧录
- STM32G0B1CBT6,ST-LINK SN `37FF71064E573436188C1543`,目标 ID `0x467`,供电 3.28 V。
- Release 编译通过,Flash 15880 字节,RAM 2632 字节。
- [当前 BIN](../output/firmware/AMI_Controller.bin) SHA256:`E73994418D346ADEF7E2ED5EE3C018C4CD3B74C4E4A2884CD8628218153BEA7F`。
- 烧录返回 `Download verified successfully`,另完整回读 15880 字节,逐字节一致。
- CAN1 / CAN2 NBTP 分别为 `0x00070C01` / `0x000F0C01`;64 MHz 时钟下为 500K / 250K,采样点 87.5%。
- 两份 DBC 各 11 条报文、40 个信号,严格解析和 28 个已知报文校验通过;五条 SDC 布局与源 DBC 一致。
## CAN2 与 MCU 状态
CAN 盒同时发送自定义输入和 BMS `0x140 / 0x156`;未发送 SDC 报文。SWD 根据本次 ELF 符号地址读取真实 MCU 状态,检查数值、有效位和时间戳。CAN1 接收时间为 0,CAN2 接收时间有效;各阶段 CAN / UART 接收错误均为 0,PCAN 状态 `0x0`。
| 阶段 | 输入 / 操作 | MCU 结果 |
| --- | --- | --- |
| 正值 | `F4 01 C2 01 90 01 07 01` | 500‰ / 45℃ / 40℃,均有效 |
| 负值 | `0C FE 9B FF 33 FF 07 01` | -500‰ / -10℃ / -21℃ |
| 取整和扭矩边界 | 1000‰ / 45.5℃ / -20.5℃ | 1000 / 46 / -21 |
| 部分无效 | 标志 05,仅扭矩 / MCU 有效 | 电机温度保留旧值但无效 |
| 全无效 | 标志 00 | 三项保留旧数字,均无效 |
| 扭矩超范围 | 1200‰ / 80℃ / 60℃,标志 07 | 扭矩无效,两个温度仍有效更新 |
| 有效基线 | 重新发送正值 | 三项恢复有效 |
| 错误版本 | 字节 7 改为 02,连续发送 | 整帧拒绝,原数值保留且独立超时 |
| 非零保留位 | 字节 6 改为 87 | 不更新值、不刷新时间戳 |
| 截短 DLC | DLC 7 | 不更新值、不刷新时间戳 |
| 错误帧类型 | 扩展 ID 182 | 不更新值、不刷新时间戳 |
| 恢复 | -250‰ / 70℃ / 55℃ | 三项恢复有效 |
| 独立超时 | 仅停止 0x182,BMS 持续发送 | 三项失效,BMS 400V / 12A / 40℃ 持续有效 |
| 再恢复 | 正值报文 | 三项恢复有效 |
## 串口与 HMI 核验状态
本次 MCU 状态测试已通过;官方 HMI 调试窗口的显示更新尚未确认。COM4 9600 8N1 直接接收 6 秒得到 0 字节;电脑发送 `AA 55 01 02 0D 0A` 后收到 CAN2 标准 `0x300` 请求,说明电脑到 MCU 方向有效,MCU 到电脑方向待检查 PA2 -> 转串口 RXD 接线。不能据 MCU 数值正确宣称屏幕已更新。
随后在官方调试器点击六个任务按钮,每个任务先取消再确认:六个取消均无 `0x300`,六个确认均收到一条正确标准 `0x300 / DLC 8`,任务号 1..6、序号 0..5。此结果验证 HMI 操作到 MCU 再到 CAN2 的方向;不作为 CAN 输入到 HMI 数值更新的证据。发布的发送脚本另实际发送 30 条 `0x182`,每 100 ms 一条,3 秒后自动停止。
本次未重新接 CAN1 验证新帧;CAN1 与 CAN2 共享解码器和相同过滤 ID,属于源码 / 配置校验。未接物理串口屏、真实 BMS / 电机控制器或同时接两路。扭矩输入仅用于仪表显示。
证据见 [发送帧与状态](evidence/2026-10-03/v2.2-display/display-results.json)、[烧录回读](evidence/2026-10-03/v2.2-display/flash-verified.json)、[任务回传](evidence/2026-10-03/v2.2-display/task-results.json)、[串口诊断](evidence/2026-10-03/v2.2-display/uart-diagnostic.json)。v2.1 双 CAN 历史证据及 BIN 见 [双 CAN 报告](CAN1_CAN2_v2.1测试报告.md)。
+2
View File
@@ -2,6 +2,8 @@
2026-10-03,固件来源提交 `9120bd0`。实际链路为 PCAN-USB CAN 盒 -> 实物 AMI MCU -> USART2 PA2/PA3 -> CH340 COM4(9600 8N1)-> USART HMI 官方调试器。先测试 CAN1,通知用户切换接线并收到确认后,再测试 CAN2。 2026-10-03,固件来源提交 `9120bd0`。实际链路为 PCAN-USB CAN 盒 -> 实物 AMI MCU -> USART2 PA2/PA3 -> CH340 COM4(9600 8N1)-> USART HMI 官方调试器。先测试 CAN1,通知用户切换接线并收到确认后,再测试 CAN2。
本报告为 v2.1 历史记录,对应 [归档 BIN](../output/firmware/AMI_Controller_v2.1_500k_250k.bin)。通用 `AMI_Controller.bin` 已更新为 v2.2,请勿把本报告的双 CAN 结果直接套用于后续版本。
CAN1 按 SDC 的 500 kbit/s 使用,CAN2 按 BMS 的 250 kbit/s 使用。此次用 CAN 盒模拟源报文,未连接真实 SDC/BMS 节点或物理串口屏;未同时连接两路。 CAN1 按 SDC 的 500 kbit/s 使用,CAN2 按 BMS 的 250 kbit/s 使用。此次用 CAN 盒模拟源报文,未连接真实 SDC/BMS 节点或物理串口屏;未同时连接两路。
## 烧录与实际位时序 ## 烧录与实际位时序
+5 -3
View File
@@ -1,6 +1,6 @@
# AMI 接入 SDC / BMS 协议 # AMI 接入 SDC / BMS 协议
版本 2.1,2026-10-03。CAN1 为 500 kbit/s,CAN2 为 250 kbit/s;两路均为 Classic CAN、87.5% 采样点,接收 ID、解码和任务发送功能相同,不转发原始帧。CAN1 使用 [AMI.dbc](../AMI.dbc),CAN2 使用 [AMI_CAN2_250k.dbc](../AMI_CAN2_250k.dbc)。当前固件不再接收旧 `0x180 / 0x181 / 0x280` 数据接口。 版本 2.2,2026-10-03。CAN1 为 500 kbit/s,CAN2 为 250 kbit/s;两路均为 Classic CAN、87.5% 采样点,接收 ID、解码和任务发送功能相同,不转发原始帧。CAN1 使用 [AMI.dbc](../AMI.dbc),CAN2 使用 [AMI_CAN2_250k.dbc](../AMI_CAN2_250k.dbc)。当前固件不再接收旧 `0x180 / 0x181 / 0x280` 数据接口。
v2.1 已通过源码 / CubeMX 位时序一致性检查及 Release 编译,已烧录并完整回读比对;CAN1 500K(SDC)与 CAN2 250K(BMS)分别通过数据更新、失效恢复和六个任务确认/取消测试,见 [双 CAN 测试报告](CAN1_CAN2_v2.1测试报告.md)。本文后面旧的实物联调引用属于两路均为 500K 的 v2.0。 v2.1 已通过源码 / CubeMX 位时序一致性检查及 Release 编译,已烧录并完整回读比对;CAN1 500K(SDC)与 CAN2 250K(BMS)分别通过数据更新、失效恢复和六个任务确认/取消测试,见 [双 CAN 测试报告](CAN1_CAN2_v2.1测试报告.md)。本文后面旧的实物联调引用属于两路均为 500K 的 v2.0。
@@ -53,6 +53,8 @@ USART2 为 9600、8N1,PA2 TX / PA3 RX。命令为 ASCII,末尾三个真实 `
## 任务回传 ## 任务回传
另有 v2.2 新增的标准 `0x182` 仪表显示输入,设置扭矩千分、电机温度和 MCU 温度,三个值独立于 BMS / SDC 计时。该自定义接口不改变本文的源协议字段,详见 [DBC 说明](AMI_CAN_DBC说明.md)。
屏幕确认后发送 `AA 55 01 NN 0D 0A`,`NN=01..06`;取消不发送。MCU 用 Receive-to-Idle DMA 按字节流解析拆包/粘包。 屏幕确认后发送 `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` 灯状态。 MCU 发出标准 `0x300 / 8`:版本 1、任务号、uint8 序号、来源 1、uint32 小端 MCU ms。任务依次为八字绕环、直线加速、高速循迹、车检测试、EBS 测试、手动驾驶。此接口是原有 AMI 请求,**不是 SDC DBC 定义的 ASSI 控制**;没有 VCU 映射前不把任务号直接写成 `0x6A5` 灯状态。
@@ -61,10 +63,10 @@ MCU 发出标准 `0x300 / 8`:版本 1、任务号、uint8 序号、来源 1、
PA0 LED 每 500 ms 翻转,PA1 为仪表/SDC 状态活动超时提示,默认高电平有效;尚未观察验证灯的物理极性和行为,活动灯不能替代每个数值的有效性判断。 PA0 LED 每 500 ms 翻转,PA1 为仪表/SDC 状态活动超时提示,默认高电平有效;尚未观察验证灯的物理极性和行为,活动灯不能替代每个数值的有效性判断。
## 验证范围 ## v2.0 历史验证范围
已完成 Release 编译、SWD 烧录校验、HMI 编译(0 错误 / 0 警告),以及 **CAN 盒 → 实物 AMI CAN1 → MCU USART2 → COM4 → 官方 HMI 调试器** 数据更新测试。 已完成 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)。 同时发送 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 文案不能作为安全状态证明。 上述 v2.0 测试未接线实测 CAN2。后续 v2.1 已按 CAN1 500K / CAN2 250K 分别测试,见 [双 CAN 报告](CAN1_CAN2_v2.1测试报告.md);当前 v2.2 见 [显示 CAN 报告](AMI自定义显示CAN测试报告.md)。未测试物理串口屏,未接真实 SDC/BMS 节点,未验证 VCU 实际执行或安全动作。现有画面的 EBS 文案不能作为安全状态证明。
@@ -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: : 0x200002CC
0x200002CC : 00000000 00000000 00000000 00031E98
0x200002DC : 0000007B 00000FA0 00000000 00000000
0x200002EC : 00000000 00000000 00000000 00031E98
0x200002FC : 00031E97 00031E97 00000000 00000000
0x2000030C : 00031E98 00000000 00000000 00000190
0x2000031C : FFFFFC18 0000000C 0000002E 00000032
0x2000032C : 00000028 00000000 0000004A 00000000
0x2000033C : 00000000 00000000 00000000 1C6D559A
@@ -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: : 0x200002CC
0x200002CC : 00000000 00000000 00000000 0003287A
0x200002DC : 0000007B 00000FA0 00000000 00000000
0x200002EC : 00000000 00000000 00000000 0003287A
0x200002FC : 0003287A 00032879 00000000 00000000
0x2000030C : 0003287A 00000000 00000000 00000190
0x2000031C : 000001F4 0000000C 0000002D 00000028
0x2000032C : 00000028 00000000 0000007E 00000000
0x2000033C : 00000000 00000000 00000000 1C6D559A
@@ -0,0 +1,27 @@
-------------------------------------------------------------------
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: : 0x4000641C
0x4000641C : 00070C01
@@ -0,0 +1,27 @@
-------------------------------------------------------------------
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: : 0x4000681C
0x4000681C : 000F0C01
File diff suppressed because it is too large Load Diff
@@ -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: : 0x200002CC
0x200002CC : 00000000 00000000 00000000 00034388
0x200002DC : 0000007B 00000FA0 00000000 00000000
0x200002EC : 00000000 00000000 00000000 0003287A
0x200002FC : 00034388 00034387 00000000 00000000
0x2000030C : 00034388 00000000 00000000 00000190
0x2000031C : 000001F4 0000000C 0000002D 00000028
0x2000032C : 00000028 00000000 0000004A 00000000
0x2000033C : 00000000 00000000 00000000 1C6D559A
@@ -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: : 0x200002CC
0x200002CC : 00000000 00000000 00000000 000357AD
0x200002DC : 0000007B 00000FA0 00000000 00000000
0x200002EC : 00000000 00000000 00000000 000357AD
0x200002FC : 000357AD 000357AC 00000000 00000000
0x2000030C : 000357AD 00000000 00000000 00000190
0x2000031C : 000001F4 0000000C 0000002D 00000028
0x2000032C : 00000028 00000000 0000007E 00000000
0x2000033C : 00000000 00000000 00000000 1C6D559A
@@ -0,0 +1,29 @@
-------------------------------------------------------------------
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
UPLOADING ...
File : D:\YMR\AMI\tmp\can-display-v22-test-20261003\flash-readback.bin
Size : 15880 Bytes
Address: : 0x8000000
Read progress:
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± 0%␍ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ 100%
Data read successfully
Time elapsed during read operation is: 00:00:00.252
@@ -0,0 +1,6 @@
{
"bytes": 15880,
"sha256": "E73994418D346ADEF7E2ED5EE3C018C4CD3B74C4E4A2884CD8628218153BEA7F",
"flash_verified": true,
"full_readback_identical": true
}
@@ -0,0 +1,56 @@
-------------------------------------------------------------------
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.51 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.762
Verifying...
Read progress:
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± 50%␍ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ 100%
Time elapsed during verifying operation: 00:00:00.252
Download verified successfully
MCU Reset
Software reset is performed
Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

@@ -0,0 +1,29 @@
{
"all_invalid_ram.log": "4c5aec9dc454cfcabdd74a9fee1f173c6debfa17498c0c8194628b7a1aaa99d2",
"baseline_ram.log": "99821ebe2305bb7e04da970f4c191ae1d9bfe6b076d47003d0b2511e028ca9e0",
"can1-nbtp.log": "cab2516dc364f705b4d76aebefaa6c74c2613508df26602c7bceb3f0d28bdc3f",
"can2-nbtp.log": "5a4ab1de646f825fb1f10de307c835e1d5bdaeba26b203bf39188cb9a4307684",
"display-results.json": "2a8772323cd8a29988ed3f1abee28dd91bcfcc776f86d08b5db1b3268d88687f",
"extended_ram.log": "659a043bc153e36b968797d182f458b5461d7e17059accf41efabb1543be07b2",
"final_recovered_ram.log": "28e14f32a0712ec0cbd47f65ecdb7aa02608c4d123ba31e3322473bea46d3c59",
"flash-readback.log": "5269ba5a41f38ffbf61e82f54b9f1bd0590d9074b4efd52700e9a63123b84cab",
"flash-verified.json": "884caaaa1f340ee008e9629f927230f4fa6fef65c6e09184f7f0b68160ec8924",
"flash.log": "bce4b434ea80aec044a9bc10e31a2701d5179ad7939c33f39f13acd2f36db47c",
"hmi-not-updated.png": "3382d2407b4238829f76bbc4beb290451ff2fc51d7e007d23fd95edbda5faafc",
"negative_ram.log": "b3b05102cb09e552ec151cb2e4ebc92c33fdab4a0a9c2303980556ebf7c528ad",
"out_of_range_ram.log": "fa0c56aaff993322bc358f447161006e352c557fc7c264ff2bc302812fa6c2f2",
"partial_invalid_ram.log": "b857e871f6ef4a26bbe485c6a68f9e34a790e9e5f3932561a30c7096d7a1cd12",
"positive_ram.log": "1bf1ae2e0c8fcdd843fad842c0c766c2dceec5cbfcb0eef92b4b708a5ff51333",
"recovered_ram.log": "4027dd15d4d1c47f8100ac40e37bc313c3370856fd6b9fb0c775e5c65e86bd85",
"reject_baseline_ram.log": "1d95a37bdee533c131bf1e70e884a2ad624d4125081571f9b7d47b38363ef366",
"reserved_bits_ram.log": "a40b1c3867115835703c1f891f4309d0d2de475709816dc3d291416a58736854",
"rounding_ram.log": "4e11287a4ccc6362108de61c322dad78471fe296a14789d8cad121a34d0378a9",
"source_timeout_ram.log": "128f9fd78c10d26bd92ae36f0d6bccab732b6d594e21123d01e6a719eba4b9f2",
"symbols.json": "cb979c1b25e3b55d7ffaf378f7ad90b8e34b4b282e23eeb766fe61d36087e2d4",
"task-reset.log": "541d5b7b95ef470302a7cf87b29215fac268331a31b172d193b6ec1625b9bc7c",
"task-results.json": "496d10c60935c09d0aa8cb5f28c5b38eda225c560325c552eb9cd2bc5adcfe18",
"truncated_ram.log": "dfac2f39b7d5a951645e29546382954f2f7bfe19ca4e716adb607e64ffc559a0",
"uart-diagnostic.bin": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"uart-diagnostic.json": "4edb6c1a0cbdedb87936f264b4e0445c46b96454ebbd90d7938f42b5e2802edd",
"wrong_version_ram.log": "560afd44bc00d332c7ac3b81b35e968e3cce4e10185e78a8389be224bea27514"
}
@@ -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: : 0x200002CC
0x200002CC : 00000000 00000000 00000000 00030F96
0x200002DC : 0000007B 00000FA0 00000000 00000000
0x200002EC : 00000000 00000000 00000000 00030F96
0x200002FC : 00030F96 00030F95 00000000 00000000
0x2000030C : 00030F96 00000000 00000000 00000190
0x2000031C : FFFFFE0C 0000000C FFFFFFF6 FFFFFFEB
0x2000032C : 00000028 00000000 0000007E 00000000
0x2000033C : 00000000 00000000 00000000 1C6D559A
@@ -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: : 0x200002CC
0x200002CC : 00000000 00000000 00000000 00032360
0x200002DC : 0000007B 00000FA0 00000000 00000000
0x200002EC : 00000000 00000000 00000000 00032360
0x200002FC : 0003235F 0003235F 00000000 00000000
0x2000030C : 00032360 00000000 00000000 00000190
0x2000031C : FFFFFC18 0000000C 00000050 0000003C
0x2000032C : 00000028 00000000 0000007A 00000000
0x2000033C : 00000000 00000000 00000000 1C6D559A
@@ -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: : 0x200002CC
0x200002CC : 00000000 00000000 00000000 0003197F
0x200002DC : 0000007B 00000FA0 00000000 00000000
0x200002EC : 00000000 00000000 00000000 0003197F
0x200002FC : 0003197F 0003197E 00000000 00000000
0x2000030C : 0003197F 00000000 00000000 00000190
0x2000031C : FFFFFC18 0000000C 0000002E 00000032
0x2000032C : 00000028 00000000 0000006E 00000000
0x2000033C : 00000000 00000000 00000000 1C6D559A
@@ -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: : 0x200002CC
0x200002CC : 00000000 00000000 00000000 00030AE1
0x200002DC : 0000007B 00000FA0 00000000 00000000
0x200002EC : 00000000 00000000 00000000 00030AE1
0x200002FC : 00030AE1 00030AE0 00000000 00000000
0x2000030C : 00030AE1 00000000 00000000 00000190
0x2000031C : 000001F4 0000000C 0000002D 00000028
0x2000032C : 00000028 00000000 0000007E 00000000
0x2000033C : 00000000 00000000 00000000 1C6D559A
@@ -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: : 0x200002CC
0x200002CC : 00000000 00000000 00000000 0003484A
0x200002DC : 0000007B 00000FA0 00000000 00000000
0x200002EC : 00000000 00000000 00000000 0003484A
0x200002FC : 0003484A 00034849 00000000 00000000
0x2000030C : 0003484A 07FFFFE0 00000000 00000190
0x2000031C : FFFFFF06 0000000C 00000046 00000037
0x2000032C : 00000028 00000000 0000007E 00000000
0x2000033C : 00000000 00000000 00000000 1C6D559A
@@ -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: : 0x200002CC
0x200002CC : 00000000 00000000 00000000 00032A0B
0x200002DC : 0000007B 00000FA0 00000000 00000000
0x200002EC : 00000000 00000000 00000000 0003287A
0x200002FC : 00032A0B 00032A0B 00000000 00000000
0x2000030C : 00032A0B 00000000 00000000 00000190
0x2000031C : 000001F4 0000000C 0000002D 00000028
0x2000032C : 00000028 00000000 0000007E 00000000
0x2000033C : 00000000 00000000 00000000 1C6D559A
@@ -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: : 0x200002CC
0x200002CC : 00000000 00000000 00000000 00033957
0x200002DC : 0000007B 00000FA0 00000000 00000000
0x200002EC : 00000000 00000000 00000000 0003287A
0x200002FC : 00033957 00033956 00000000 00000000
0x2000030C : 00033957 00000000 00000000 00000190
0x2000031C : 000001F4 0000000C 0000002D 00000028
0x2000032C : 00000028 00000000 0000004A 00000000
0x2000033C : 00000000 00000000 00000000 1C6D559A
@@ -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: : 0x200002CC
0x200002CC : 00000000 00000000 00000000 000314B1
0x200002DC : 0000007B 00000FA0 00000000 00000000
0x200002EC : 00000000 00000000 00000000 000314B1
0x200002FC : 000314B0 000314B0 00000000 00000000
0x2000030C : 000314B1 00000000 00000000 00000190
0x2000031C : 000003E8 0000000C 0000002E FFFFFFEB
0x2000032C : 00000028 00000000 0000007E 00000000
0x2000033C : 00000000 00000000 00000000 1C6D559A
@@ -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: : 0x200002CC
0x200002CC : 00000000 00000000 00000000 000352E0
0x200002DC : 0000007B 00000FA0 00000000 00000000
0x200002EC : 00000000 00000000 00000000 000348AF
0x200002FC : 000352E0 000352E0 00000000 00000000
0x2000030C : 000352E0 00000000 00000000 00000190
0x2000031C : FFFFFF06 0000000C 00000046 00000037
0x2000032C : 00000028 00000000 0000004A 00000000
0x2000033C : 00000000 00000000 00000000 1C6D559A
@@ -0,0 +1,232 @@
{
"_Min_Heap_Size": 512,
"_Min_Stack_Size": 1280,
"g_pfnVectors": 134217728,
"__do_global_dtors_aux": 134217916,
"frame_dummy": 134217956,
"__gnu_thumb1_case_sqi": 134217988,
"__gnu_thumb1_case_uqi": 134218008,
"__aeabi_uidiv": 134218028,
"__udivsi3": 134218028,
"__aeabi_uidivmod": 134218296,
"__aeabi_idiv": 134218304,
"__divsi3": 134218304,
"__aeabi_idivmod": 134218764,
"__aeabi_idiv0": 134218772,
"__aeabi_ldiv0": 134218772,
"__aeabi_uldivmod": 134218776,
"__udivmoddi4": 134218840,
"__clzdi2": 134219248,
"__clzsi2": 134219272,
"strlen": 134219332,
"SystemInit": 134219346,
"HAL_FDCAN_Init": 134219348,
"HAL_FDCAN_ConfigFilter": 134219888,
"HAL_FDCAN_ConfigGlobalFilter": 134219970,
"HAL_FDCAN_Start": 134220026,
"HAL_FDCAN_AddMessageToTxFifoQ": 134220072,
"HAL_FDCAN_GetRxMessage": 134220272,
"HAL_FDCAN_GetRxFifoFillLevel": 134220556,
"HAL_FDCAN_GetTxFifoFreeLevel": 134220576,
"HAL_FDCAN_ActivateNotification": 134220588,
"HAL_FDCAN_TxEventFifoCallback": 134220836,
"HAL_FDCAN_RxFifo1Callback": 134220838,
"HAL_FDCAN_TxFifoEmptyCallback": 134220840,
"HAL_FDCAN_TxBufferCompleteCallback": 134220842,
"HAL_FDCAN_TxBufferAbortCallback": 134220844,
"HAL_FDCAN_TimestampWraparoundCallback": 134220846,
"HAL_FDCAN_TimeoutOccurredCallback": 134220848,
"HAL_FDCAN_HighPriorityMessageCallback": 134220850,
"HAL_FDCAN_ErrorStatusCallback": 134220852,
"HAL_FDCAN_IRQHandler": 134220854,
"HAL_RCC_OscConfig": 134221212,
"HAL_RCC_GetSysClockFreq": 134222404,
"HAL_RCC_ClockConfig": 134222540,
"HAL_RCC_GetPCLK1Freq": 134222880,
"HAL_RCCEx_PeriphCLKConfig": 134222920,
"HAL_GPIO_Init": 134223596,
"HAL_GPIO_WritePin": 134223964,
"HAL_GPIO_TogglePin": 134223976,
"DMA_SetConfig": 134223992,
"DMA_CalcDMAMUXChannelBaseAndMask": 134224048,
"HAL_DMA_Init": 134224124,
"HAL_DMA_Start_IT": 134224344,
"HAL_DMA_Abort": 134224488,
"HAL_DMA_Abort_IT": 134224596,
"HAL_DMA_IRQHandler": 134224704,
"HAL_DMA_GetError": 134224880,
"HAL_PWREx_ControlVoltageScaling": 134224884,
"HAL_NVIC_SetPriority": 134224972,
"HAL_NVIC_EnableIRQ": 134225056,
"HAL_SYSTICK_Config": 134225080,
"HAL_InitTick": 134225132,
"HAL_Init": 134225212,
"HAL_IncTick": 134225252,
"HAL_GetTick": 134225276,
"HAL_SYSCFG_StrobeDBattpinsConfig": 134225288,
"UART_EndTxTransfer": 134225312,
"UART_EndRxTransfer": 134225372,
"HAL_UART_Transmit_DMA": 134225472,
"HAL_UART_AbortReceive": 134225636,
"UART_DMATransmitCplt": 134225828,
"HAL_UART_TxHalfCpltCallback": 134225908,
"UART_DMATxHalfCplt": 134225910,
"HAL_UART_RxCpltCallback": 134225920,
"HAL_UART_RxHalfCpltCallback": 134225922,
"UART_DMAError": 134225924,
"UART_DMAAbortOnError": 134226008,
"HAL_UART_IRQHandler": 134226032,
"UART_DMARxHalfCplt": 134226860,
"UART_DMAReceiveCplt": 134226896,
"UART_SetConfig": 134227056,
"UART_AdvFeatureConfig": 134227708,
"UART_WaitOnFlagUntilTimeout": 134227916,
"UART_CheckIdleState": 134228064,
"HAL_UART_Init": 134228264,
"UART_Start_Receive_DMA": 134228368,
"UARTEx_SetNbDataToProcess": 134228540,
"HAL_UARTEx_WakeupCallback": 134228620,
"HAL_UARTEx_RxFifoFullCallback": 134228622,
"HAL_UARTEx_TxFifoEmptyCallback": 134228624,
"HAL_UARTEx_DisableFifoMode": 134228628,
"HAL_UARTEx_SetTxFifoThreshold": 134228688,
"HAL_UARTEx_SetRxFifoThreshold": 134228752,
"HAL_UARTEx_ReceiveToIdle_DMA": 134228820,
"SystemClock_Config": 134228920,
"main": 134229042,
"Error_Handler": 134229084,
"MX_GPIO_Init": 134229088,
"MX_DMA_Init": 134229180,
"MX_FDCAN1_Init": 134229240,
"MX_FDCAN2_Init": 134229316,
"HAL_FDCAN_MspInit": 134229392,
"MX_USART2_UART_Init": 134229676,
"HAL_UART_MspInit": 134229784,
"NMI_Handler": 134230044,
"HardFault_Handler": 134230046,
"SVC_Handler": 134230048,
"PendSV_Handler": 134230050,
"SysTick_Handler": 134230052,
"DMA1_Channel1_IRQHandler": 134230060,
"DMA1_Channel2_3_IRQHandler": 134230076,
"TIM16_FDCAN_IT0_IRQHandler": 134230092,
"TIM17_FDCAN_IT1_IRQHandler": 134230116,
"USART2_LPUART2_IRQHandler": 134230124,
"HAL_MspInit": 134230140,
"Reset_Handler": 134230216,
"CopyDataInit": 134230234,
"LoopCopyDataInit": 134230240,
"FillZerobss": 134230254,
"LoopFillZerobss": 134230258,
"LoopForever": 134230270,
"ADC1_COMP_IRQHandler": 134230296,
"CEC_IRQHandler": 134230296,
"Default_Handler": 134230296,
"DMA1_Ch4_7_DMA2_Ch1_5_DMAMUX1_OVR_IRQHandler": 134230296,
"EXTI0_1_IRQHandler": 134230296,
"EXTI2_3_IRQHandler": 134230296,
"EXTI4_15_IRQHandler": 134230296,
"FLASH_IRQHandler": 134230296,
"I2C1_IRQHandler": 134230296,
"I2C2_3_IRQHandler": 134230296,
"Infinite_Loop": 134230296,
"PVD_VDDIO2_IRQHandler": 134230296,
"RCC_CRS_IRQHandler": 134230296,
"RTC_TAMP_IRQHandler": 134230296,
"SPI1_IRQHandler": 134230296,
"SPI2_3_IRQHandler": 134230296,
"TIM1_BRK_UP_TRG_COM_IRQHandler": 134230296,
"TIM1_CC_IRQHandler": 134230296,
"TIM14_IRQHandler": 134230296,
"TIM15_IRQHandler": 134230296,
"TIM2_IRQHandler": 134230296,
"TIM3_TIM4_IRQHandler": 134230296,
"TIM6_DAC_LPTIM1_IRQHandler": 134230296,
"TIM7_LPTIM2_IRQHandler": 134230296,
"USART1_IRQHandler": 134230296,
"USART3_4_5_6_LPUART1_IRQHandler": 134230296,
"USB_UCPD1_2_IRQHandler": 134230296,
"WWDG_IRQHandler": 134230296,
"RoundTenths": 134230298,
"ReadLeS16": 134230320,
"ConfigureCanPort": 134230344,
"SetDashValid": 134230532,
"SetDashValue": 134230592,
"RestartScreenRx": 134230644,
"AMI_App_Init": 134230700,
"AMI_App_Service": 134230856,
"HAL_FDCAN_RxFifo0Callback": 134232012,
"HAL_FDCAN_ErrorCallback": 134232724,
"HAL_UARTEx_RxEventCallback": 134232740,
"HAL_UART_TxCpltCallback": 134232936,
"HAL_UART_ErrorCallback": 134232960,
"memset": 134232996,
"__libc_init_array": 134233012,
"memcpy": 134233084,
"__EH_FRAME_BEGIN__": 134233104,
"_init": 134233104,
"_fini": 134233116,
"_etext": 134233128,
"APBPrescTable": 134233128,
"AHBPrescTable": 134233160,
"DLCtoBytes": 134233224,
"UARTPrescTable": 134233240,
"__exidx_start": 134233580,
"__exidx_end": 134233588,
"__frame_dummy_init_array_entry": 134233588,
"__init_array_start": 134233588,
"__preinit_array_end": 134233588,
"__preinit_array_start": 134233588,
"__do_global_dtors_aux_fini_array_entry": 134233592,
"__init_array_end": 134233592,
"_sidata": 134233596,
"_sdata": 536870912,
"SystemCoreClock": 536870912,
"uwTickFreq": 536870916,
"uwTickPrio": 536870920,
"__bss_start__": 536870924,
"_edata": 536870924,
"_sbss": 536870924,
"uwTick": 536870952,
"HAL_RCC_FDCAN_CLK_ENABLED": 536870956,
"hfdcan2": 536870960,
"hfdcan1": 536871060,
"hdma_usart2_rx": 536871160,
"hdma_usart2_tx": 536871256,
"huart2": 536871352,
"task_drop_count": 536871516,
"task_target_mask": 536871520,
"task_tx_mask": 536871521,
"task_sequence": 536871522,
"task_tail": 536871523,
"task_head": 536871524,
"task_queue": 536871525,
"parser_task_id": 536871529,
"parser_pos": 536871530,
"screen_tx_busy": 536871531,
"screen_tx_dma": 536871532,
"screen_rx_dma": 536871564,
"uart_rx_error_count": 536871628,
"can_rx_error_count": 536871632,
"can_port_last_rx_ms": 536871636,
"bms_current_tenths": 536871644,
"bms_voltage_tenths": 536871648,
"sdc_gpio_received": 536871650,
"sdc_gpio_timestamp_ms": 536871652,
"sdc_gpio_changed": 536871656,
"sdc_gpio_state": 536871658,
"sdc_frequency_hz": 536871660,
"sdc_adc_mv": 536871668,
"drivetrain_last_rx_ms": 536871672,
"bms_temperature_last_rx_ms": 536871676,
"bms_status_last_rx_ms": 536871680,
"adc_last_rx_ms": 536871684,
"debug_last_rx_ms": 536871688,
"dash_last_rx_ms": 536871692,
"display_dirty": 536871696,
"display_state": 536871700,
"__bss_end__": 536871752,
"_ebss": 536871752,
"_end": 536871752,
"_estack": 537018368
}
@@ -0,0 +1,24 @@
-------------------------------------------------------------------
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
MCU Reset
Software reset is performed
Core run
@@ -0,0 +1,141 @@
{
"results": [
{
"task": 1,
"cancel_no_can_request": true,
"confirm_can_request_correct": true,
"cancel_frames": [],
"confirm_frames": [
{
"time_s": 4.289997600018978,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 01 00 01 6d 0f 00 00"
}
]
},
{
"task": 2,
"cancel_no_can_request": true,
"confirm_can_request_correct": true,
"cancel_frames": [],
"confirm_frames": [
{
"time_s": 8.514357500011101,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 02 01 01 e8 1f 00 00"
}
]
},
{
"task": 3,
"cancel_no_can_request": true,
"confirm_can_request_correct": true,
"cancel_frames": [],
"confirm_frames": [
{
"time_s": 12.751596000045538,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 03 02 01 75 30 00 00"
}
]
},
{
"task": 4,
"cancel_no_can_request": true,
"confirm_can_request_correct": true,
"cancel_frames": [],
"confirm_frames": [
{
"time_s": 16.996419199975207,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 04 03 01 01 41 00 00"
}
]
},
{
"task": 5,
"cancel_no_can_request": true,
"confirm_can_request_correct": true,
"cancel_frames": [],
"confirm_frames": [
{
"time_s": 21.236944500007667,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 05 04 01 8c 51 00 00"
}
]
},
{
"task": 6,
"cancel_no_can_request": true,
"confirm_can_request_correct": true,
"cancel_frames": [],
"confirm_frames": [
{
"time_s": 25.482824600068852,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 06 05 01 27 62 00 00"
}
]
}
],
"rx": [
{
"time_s": 4.289997600018978,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 01 00 01 6d 0f 00 00"
},
{
"time_s": 8.514357500011101,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 02 01 01 e8 1f 00 00"
},
{
"time_s": 12.751596000045538,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 03 02 01 75 30 00 00"
},
{
"time_s": 16.996419199975207,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 04 03 01 01 41 00 00"
},
{
"time_s": 21.236944500007667,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 05 04 01 8c 51 00 00"
},
{
"time_s": 25.482824600068852,
"id": 768,
"dlc": 8,
"extended": false,
"data": "01 06 05 01 27 62 00 00"
}
],
"pcan_status": "0x0",
"path": "Official HMI task buttons -> COM4 / AMI MCU -> CAN2 250K",
"hmi_data_display_verified": false
}
@@ -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: : 0x200002CC
0x200002CC : 00000000 00000000 00000000 00033E71
0x200002DC : 0000007B 00000FA0 00000000 00000000
0x200002EC : 00000000 00000000 00000000 0003287A
0x200002FC : 00033E71 00033E70 00000000 00000000
0x2000030C : 00033E71 00000000 00000000 00000190
0x2000031C : 000001F4 0000000C 0000002D 00000028
0x2000032C : 00000028 00000000 0000004A 00000000
0x2000033C : 00000000 00000000 00000000 1C6D559A
@@ -0,0 +1,16 @@
{
"baudrate": 9600,
"port": "COM4",
"sample_seconds": 6,
"rx_bytes": 0,
"pc_to_mcu_task": "AA 55 01 02 0D 0A",
"can2_response": "01 02 00 01 42 E2 04 00",
"can_id": "0x300",
"can_type": "standard",
"dlc": 8,
"mcu_gpioa_moder": "0xEABFFFA5",
"mcu_gpioa_afrl": "0x00001100",
"PA2_PA3_mode": "alternate function 1, USART2",
"PA2_idle": "high",
"hmi_display_verified": false
}
@@ -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: : 0x200002CC
0x200002CC : 00000000 00000000 00000000 000334A3
0x200002DC : 0000007B 00000FA0 00000000 00000000
0x200002EC : 00000000 00000000 00000000 0003287A
0x200002FC : 000334A3 000334A3 00000000 00000000
0x2000030C : 000334A3 07FFFFFF 00000000 00000190
0x2000031C : 000001F4 0000000C 0000002D 00000028
0x2000032C : 00000028 00000000 0000004A 00000000
0x2000033C : 00000000 00000000 00000000 1C6D559A
+3 -1
View File
@@ -1,9 +1,11 @@
# AMI 仪表通讯交接文档 # AMI 仪表通讯交接文档
屏幕接口 1.2;MCU CAN 协议 2.1(CAN1 500K / CAN2 250K) | 2026-10-03 屏幕接口 1.2;MCU CAN 协议 2.2(CAN1 500K / CAN2 250K) | 2026-10-03
适用工程:AMI.HMI;屏幕 TJC4827X543_011,480 × 272;编辑器 USART HMI 1.68.1.3037。本文以随附的精简指令版工程为准。 适用工程:AMI.HMI;屏幕 TJC4827X543_011,480 × 272;编辑器 USART HMI 1.68.1.3037。本文以随附的精简指令版工程为准。
v2.2 新增标准 CAN `0x182 / DLC 8`,分别设置 `dash.mct`(扭矩千分)、`dash.djwd`(电机温度)、`dash.mcuwd`(MCU 温度)。数据 `F4 01 C2 01 90 01 07 01` 对应 500‰ / 45℃ / 40℃;建议每 100 ms 发一次。CAN1 500K / CAN2 250K 均可接收,三个字段各有有效标志,帧源独立超时 2000 ms。完整布局、有符号温度和异常处理见 [DBC 说明](AMI_CAN_DBC说明.md),实测范围见 [v2.2 报告](AMI自定义显示CAN测试报告.md)。
v2.1 已烧录并通过 CAN1 500K(SDC)与 CAN2 250K(BMS)分别到官方 HMI 调试器的测试,含两路各六个任务确认/取消;见 [双 CAN 测试报告](CAN1_CAN2_v2.1测试报告.md)。下文的旧模拟器及 v2.0 测试描述属于历史记录,物理串口屏、真实节点和两路同时接入仍待实测。 v2.1 已烧录并通过 CAN1 500K(SDC)与 CAN2 250K(BMS)分别到官方 HMI 调试器的测试,含两路各六个任务确认/取消;见 [双 CAN 测试报告](CAN1_CAN2_v2.1测试报告.md)。下文的旧模拟器及 v2.0 测试描述属于历史记录,物理串口屏、真实节点和两路同时接入仍待实测。
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 不生成正常/故障判断。 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 不生成正常/故障判断。
+9 -4
View File
@@ -1,13 +1,18 @@
2026-10-03:屏幕数字接口1.2,MCU CAN输入2.1(SDC/BMS)。 2026-10-03:屏幕数字接口1.2,MCU CAN输入2.2(SDC/BMS及自定义动力显示)。
CAN1为500 kbit/s,使用AMI.dbc;CAN2为250 kbit/s,使用AMI_CAN2_250k.dbc。每份包含10条Classic CAN报文和33个信号,报文布局相同。 CAN1为500 kbit/s,使用AMI.dbc;CAN2为250 kbit/s,使用AMI_CAN2_250k.dbc。每份包含11条Classic CAN报文和40个信号,报文布局相同。
v2.2新增标准0x182/DLC8,设置扭矩千分、电机温度及MCU温度,三个有效标志和独立2000ms超时;不控制电机执行。
v2.2编译通过,烧录及完整15880字节回读一致;14组CAN2 MCU状态核对通过,CAN/UART接收错误均为0。
v2.2官方HMI按钮到CAN2回传方向六个确认/六个取消通过,任务号1..6、序号0..5;发送脚本实发30条0x182。
当前COM4未收到MCU输出字节,已请检查PA2->RXD线;本次HMI显示尚未确认,详见docs/AMI自定义显示CAN测试报告.md。
以下双CAN分别联调结果对应归档v2.1 BIN,不能直接作为v2.2新帧CAN1/HMI实测证据。
v2.1源码/CubeMX/DBC位时序一致性校验及Release编译通过;已烧录,完整15612字节Flash回读与发布BIN一致。 v2.1源码/CubeMX/DBC位时序一致性校验及Release编译通过;已烧录,完整15612字节Flash回读与发布BIN一致。
CAN1 500K(SDC)及CAN2 250K(仅BMS数据)分别完成MCU/USART2/COM4/官方HMI调试器的数据更新、无效、超时和恢复测试。 CAN1 500K(SDC)及CAN2 250K(仅BMS数据)分别完成MCU/USART2/COM4/官方HMI调试器的数据更新、无效、超时和恢复测试。
两路各六个任务确认及六个取消通过;十组MCU状态快照符合预期,CAN/UART接收错误均为0。新证据见docs/CAN1_CAN2_v2.1测试报告.md。 两路各六个任务确认及六个取消通过;十组MCU状态快照符合预期,CAN/UART接收错误均为0。新证据见docs/CAN1_CAN2_v2.1测试报告.md。
cantools 44.1.0严格解析、24个已知报文、六个任务号及计数边界、标准/扩展ID、偏置电流、无效温度和SDC布局一致性检查通过;具体复现命令见docs/AMI_CAN_DBC说明.md。 cantools 44.1.0严格解析、28个已知报文、六个任务号及计数边界、标准/扩展ID、偏置电流、无效温度、有符号扭矩/温度和SDC布局一致性检查通过;具体复现命令见docs/AMI_CAN_DBC说明.md。
下述历史实物证据对应v2.0,两路均为500K;原BIN保留在output/firmware/AMI_Controller_v2.0_500k.bin。 下述历史实物证据对应v2.0,两路均为500K;原BIN保留在output/firmware/AMI_Controller_v2.0_500k.bin。
HMI编译0错误0警告;v2.0固件Release编译、SWD烧录校验通过。 HMI编译0错误0警告;v2.0固件Release编译、SWD烧录校验通过。
已实测CAN盒->实物AMI CAN1/MCU->USART2->COM4->官方HMI调试器:低压电压、高压电压/电流、最高有效温度、无效数据、超时/恢复、跨页更新、HMI重连。 已实测CAN盒->实物AMI CAN1/MCU->USART2->COM4->官方HMI调试器:低压电压、高压电压/电流、最高有效温度、无效数据、超时/恢复、跨页更新、HMI重连。
六个任务确认均收到正确0x300请求,六个取消均未发送;该测试条件为CAN1持续有有效输入。 六个任务确认均收到正确0x300请求,六个取消均未发送;该测试条件为CAN1持续有有效输入。
证据在docs/evidence/2026-10-03/sdc-bms;联调报告见docs/SDC_BMS联调报告.md。 证据在docs/evidence/2026-10-03/sdc-bms;联调报告见docs/SDC_BMS联调报告.md。
v2.1仍未接物理串口屏或真实SDC/BMS节点,未实测两路同时接入、LED极性和车辆执行/安全动作;未定义电机温度、轮频到车速标定和GPIO到具名安全信号映射。 未接物理串口屏或真实SDC/BMS/电机控制器节点,未实测两路同时接入、LED极性和车辆执行/安全动作;未定义轮频到车速标定和GPIO到具名安全信号映射。
原C示例是屏幕debug接口参考,不代表整车控制已实现。 原C示例是屏幕debug接口参考,不代表整车控制已实现。
+2 -2
View File
@@ -50,7 +50,7 @@ FDCAN1.IPParameters=AutoRetransmission,CalculateTimeQuantumNominal,CalculateTime
FDCAN1.NominalPrescaler=8 FDCAN1.NominalPrescaler=8
FDCAN1.NominalTimeSeg1=13 FDCAN1.NominalTimeSeg1=13
FDCAN1.NominalTimeSeg2=2 FDCAN1.NominalTimeSeg2=2
FDCAN1.StdFiltersNbr=3 FDCAN1.StdFiltersNbr=4
FDCAN1.ExtFiltersNbr=1 FDCAN1.ExtFiltersNbr=1
FDCAN2.AutoRetransmission=ENABLE FDCAN2.AutoRetransmission=ENABLE
FDCAN2.CalculateBaudRateNominal=250000 FDCAN2.CalculateBaudRateNominal=250000
@@ -63,7 +63,7 @@ FDCAN2.IPParameters=AutoRetransmission,CalculateTimeQuantumNominal,CalculateTime
FDCAN2.NominalPrescaler=16 FDCAN2.NominalPrescaler=16
FDCAN2.NominalTimeSeg1=13 FDCAN2.NominalTimeSeg1=13
FDCAN2.NominalTimeSeg2=2 FDCAN2.NominalTimeSeg2=2
FDCAN2.StdFiltersNbr=3 FDCAN2.StdFiltersNbr=4
FDCAN2.ExtFiltersNbr=1 FDCAN2.ExtFiltersNbr=1
File.Version=6 File.Version=6
GPIO.groupedBy=Group By Peripherals GPIO.groupedBy=Group By Peripherals
+3 -1
View File
@@ -1,7 +1,8 @@
#ifndef AMI_PROTOCOL_H #ifndef AMI_PROTOCOL_H
#define AMI_PROTOCOL_H #define AMI_PROTOCOL_H
/* Both CAN ports use the same 500 kbit/s protocol and the same IDs. */ /* CAN1 is 500 kbit/s; CAN2 is 250 kbit/s. Both share IDs and parsing. */
#define AMI_CAN_ID_DRIVETRAIN_DISPLAY 0x182U
#define AMI_CAN_ID_SDC_HEARTBEAT 0x6A0U #define AMI_CAN_ID_SDC_HEARTBEAT 0x6A0U
#define AMI_CAN_ID_SDC_ADC 0x6A1U #define AMI_CAN_ID_SDC_ADC 0x6A1U
#define AMI_CAN_ID_SDC_FREQUENCY 0x6A2U #define AMI_CAN_ID_SDC_FREQUENCY 0x6A2U
@@ -17,6 +18,7 @@
#define AMI_CAN_DATA_TIMEOUT_MS 500U #define AMI_CAN_DATA_TIMEOUT_MS 500U
#define AMI_ADC_TIMEOUT_MS 1500U #define AMI_ADC_TIMEOUT_MS 1500U
#define AMI_BMS_TIMEOUT_MS 2000U #define AMI_BMS_TIMEOUT_MS 2000U
#define AMI_DRIVETRAIN_TIMEOUT_MS 2000U
#define AMI_SCREEN_BOOT_DELAY_MS 800U #define AMI_SCREEN_BOOT_DELAY_MS 800U
#define AMI_SCREEN_RESYNC_MS 5000U #define AMI_SCREEN_RESYNC_MS 5000U
+39
View File
@@ -41,6 +41,7 @@ static volatile uint32_t debug_last_rx_ms;
static volatile uint32_t adc_last_rx_ms; static volatile uint32_t adc_last_rx_ms;
static volatile uint32_t bms_status_last_rx_ms; static volatile uint32_t bms_status_last_rx_ms;
static volatile uint32_t bms_temperature_last_rx_ms; static volatile uint32_t bms_temperature_last_rx_ms;
static volatile uint32_t drivetrain_last_rx_ms;
/* Preserve the exact source units even where the HMI has integer controls. */ /* Preserve the exact source units even where the HMI has integer controls. */
static volatile uint16_t sdc_adc_mv; static volatile uint16_t sdc_adc_mv;
static volatile uint16_t sdc_frequency_hz[4]; static volatile uint16_t sdc_frequency_hz[4];
@@ -88,6 +89,12 @@ static int32_t RoundTenths(int32_t value)
return (value >= 0) ? ((value + 5) / 10) : ((value - 5) / 10); return (value >= 0) ? ((value + 5) / 10) : ((value - 5) / 10);
} }
static int32_t ReadLeS16(const uint8_t *data)
{
uint32_t raw = ReadLeU16(data);
return (raw & 0x8000U) ? ((int32_t)raw - 65536) : (int32_t)raw;
}
static size_t AppendUnsigned(char *dst, uint32_t value) static size_t AppendUnsigned(char *dst, uint32_t value)
{ {
char reversed[10]; char reversed[10];
@@ -245,6 +252,27 @@ static bool DecodeCan(uint32_t identifier, uint32_t id_type,
uint32_t now = HAL_GetTick(); uint32_t now = HAL_GetTick();
if (id_type == FDCAN_STANDARD_ID) if (id_type == FDCAN_STANDARD_ID)
{ {
if (identifier == AMI_CAN_ID_DRIVETRAIN_DISPLAY)
{
/* Version 1 display input only; no motor actuation is performed. */
if ((length != 8U) || (data[7] != 1U) || ((data[6] & 0xF8U) != 0U))
{
return false;
}
int32_t torque = ReadLeS16(data);
if ((data[6] & 1U) && (torque >= -1000) && (torque <= 1000))
{
SetDashValue(2U, torque);
}
else { SetDashValid(2U, false); }
if (data[6] & 2U) { SetDashValue(4U, RoundTenths(ReadLeS16(&data[2]))); }
else { SetDashValid(4U, false); }
if (data[6] & 4U) { SetDashValue(5U, RoundTenths(ReadLeS16(&data[4]))); }
else { SetDashValid(5U, false); }
drivetrain_last_rx_ms = now;
dash_last_rx_ms = now;
return true;
}
if ((identifier == AMI_CAN_ID_SDC_ADC) && (length == 2U)) if ((identifier == AMI_CAN_ID_SDC_ADC) && (length == 2U))
{ {
sdc_adc_mv = (uint16_t)ReadLeU16(data); sdc_adc_mv = (uint16_t)ReadLeU16(data);
@@ -350,6 +378,10 @@ static void ConfigureCanPort(FDCAN_HandleTypeDef *hfdcan)
filter.FilterID1 = AMI_CAN_ID_BMS_TEMPERATURE; filter.FilterID1 = AMI_CAN_ID_BMS_TEMPERATURE;
if (HAL_FDCAN_ConfigFilter(hfdcan, &filter) != HAL_OK) { Error_Handler(); } if (HAL_FDCAN_ConfigFilter(hfdcan, &filter) != HAL_OK) { Error_Handler(); }
filter.FilterIndex = 3U;
filter.FilterID1 = AMI_CAN_ID_DRIVETRAIN_DISPLAY;
if (HAL_FDCAN_ConfigFilter(hfdcan, &filter) != HAL_OK) { Error_Handler(); }
filter.IdType = FDCAN_EXTENDED_ID; filter.IdType = FDCAN_EXTENDED_ID;
filter.FilterIndex = 0U; filter.FilterIndex = 0U;
filter.FilterType = FDCAN_FILTER_DUAL; filter.FilterType = FDCAN_FILTER_DUAL;
@@ -489,6 +521,13 @@ static void UpdateTimeoutsAndLeds(void)
{ {
SetDashValid(6U, false); SetDashValid(6U, false);
} }
if ((drivetrain_last_rx_ms == 0U) ||
((now - drivetrain_last_rx_ms) > AMI_DRIVETRAIN_TIMEOUT_MS))
{
SetDashValid(2U, false);
SetDashValid(4U, false);
SetDashValid(5U, false);
}
__enable_irq(); __enable_irq();
if (debug_timeout && !debug_timeout_applied) if (debug_timeout && !debug_timeout_applied)
+2 -2
View File
@@ -53,7 +53,7 @@ void MX_FDCAN1_Init(void)
hfdcan1.Init.DataSyncJumpWidth = 1; hfdcan1.Init.DataSyncJumpWidth = 1;
hfdcan1.Init.DataTimeSeg1 = 13; hfdcan1.Init.DataTimeSeg1 = 13;
hfdcan1.Init.DataTimeSeg2 = 2; hfdcan1.Init.DataTimeSeg2 = 2;
hfdcan1.Init.StdFiltersNbr = 3; hfdcan1.Init.StdFiltersNbr = 4;
hfdcan1.Init.ExtFiltersNbr = 1; hfdcan1.Init.ExtFiltersNbr = 1;
hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
@@ -91,7 +91,7 @@ void MX_FDCAN2_Init(void)
hfdcan2.Init.DataSyncJumpWidth = 1; hfdcan2.Init.DataSyncJumpWidth = 1;
hfdcan2.Init.DataTimeSeg1 = 13; hfdcan2.Init.DataTimeSeg1 = 13;
hfdcan2.Init.DataTimeSeg2 = 2; hfdcan2.Init.DataTimeSeg2 = 2;
hfdcan2.Init.StdFiltersNbr = 3; hfdcan2.Init.StdFiltersNbr = 4;
hfdcan2.Init.ExtFiltersNbr = 1; hfdcan2.Init.ExtFiltersNbr = 1;
hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)
+3 -2
View File
@@ -21,7 +21,8 @@ CAN1 为 500 kbit/s、CAN2 为 250 kbit/s。FDCAN 时钟为 64 MHz,两路 Cloc
## 数据路径 ## 数据路径
- FDCAN1、FDCAN2 使用相同的三条标准过滤器和一条扩展过滤器,接收 SDC 0x6A0..0x6A6 与 BMS 0x140 / 0x156 / 0x186040F3 / 0x186140F3。 - FDCAN1、FDCAN2 使用相同的四条标准过滤器和一条扩展过滤器,接收自定义显示 0x182、SDC 0x6A0..0x6A6 与 BMS 0x140 / 0x156 / 0x186040F3 / 0x186140F3。
- 标准 0x182 / DLC 8:小端 int16 扭矩千分、0.1℃ 电机温度、0.1℃ MCU 温度;有效标志及版本校验见 [DBC 说明](../docs/AMI_CAN_DBC说明.md)。设置 dash.mct / djwd / mcuwd,独立超时 2000 ms。
- SDC ADC 为低压电池电压;BMS 总压、偏置电流和最高有效实际温度按源协议解码。旧 0x180 / 0x181 / 0x280 不再接收。 - SDC ADC 为低压电池电压;BMS 总压、偏置电流和最高有效实际温度按源协议解码。旧 0x180 / 0x181 / 0x280 不再接收。
- 主循环通过 USART2 TX DMA 一次发送一条完整 TJC 指令,末尾为三个真实字节 `FF FF FF`。 - 主循环通过 USART2 TX DMA 一次发送一条完整 TJC 指令,末尾为三个真实字节 `FF FF FF`。
- 仅变化后的数值排队,字段轮转和 DMA 合并最新值,避免刷新饥饿;白色为有效数值,灰色为未知/失效,ADC 和 BMS 各自计时。 - 仅变化后的数值排队,字段轮转和 DMA 合并最新值,避免刷新饥饿;白色为有效数值,灰色为未知/失效,ADC 和 BMS 各自计时。
@@ -57,4 +58,4 @@ CubeMX 配置源为 `AMI_Controller.ioc`。重新生成时保留 USER CODE 区
4. 下载 `AMI.HMI` 后逐条验证仪表数值、16 路 debug 状态及 6 个任务按钮。 4. 下载 `AMI.HMI` 后逐条验证仪表数值、16 路 debug 状态及 6 个任务按钮。
5. 2026-10-03 已完成 v2.1 CAN1 500K 与 CAN2 250K 分别到 MCU / USART2 / COM4 / 官方 HMI 调试器的联调;物理屏幕、真实节点、两路同时接入和 LED 极性尚未实测。见 [双 CAN 测试报告](../docs/CAN1_CAN2_v2.1测试报告.md)。 5. 2026-10-03 已完成 v2.1 CAN1 500K 与 CAN2 250K 分别到 MCU / USART2 / COM4 / 官方 HMI 调试器的联调;物理屏幕、真实节点、两路同时接入和 LED 极性尚未实测。见 [双 CAN 测试报告](../docs/CAN1_CAN2_v2.1测试报告.md)。
此前两路均为 500K 的 v2.0 历史证据仍保留。当前 v2.1 BIN 已烧录并完整回读比对通过,两路各六个任务确认和六个取消通过;CAN2 测试仅注入 BMS 数据,未将 SDC 改成 250K。 当前 v2.2 BIN 已烧录并完整回读比对;新 0x182 在 CAN2 250K 实测,见 [显示 CAN 测试报告](../docs/AMI自定义显示CAN测试报告.md)。v2.1 的双 CAN 分别联调和两路均为 500K 的 v2.0 历史证据及 BIN 保留;SDC 仍为 500K。
Binary file not shown.
Binary file not shown.
Binary file not shown.
+2 -2
View File
@@ -127,7 +127,7 @@ def export(font_path):
canvas.line(40, 31, page_width-40, 31) canvas.line(40, 31, page_width-40, 31)
canvas.setFont('AMIChinese', 8) canvas.setFont('AMIChinese', 8)
canvas.setFillColor(colors.HexColor('#506775')) canvas.setFillColor(colors.HexColor('#506775'))
canvas.drawString(40, 19, 'AMI-2.1 | 2026-10-03 | CAN1 500K / CAN2 250K') canvas.drawString(40, 19, 'AMI-2.2 | 2026-10-03 | CAN1 500K / CAN2 250K')
canvas.drawRightString(page_width-40, 19, f'{doc.page}') canvas.drawRightString(page_width-40, 19, f'{doc.page}')
canvas.restoreState() canvas.restoreState()
@@ -136,7 +136,7 @@ def export(font_path):
leftMargin=40, rightMargin=40, leftMargin=40, rightMargin=40,
topMargin=36, bottomMargin=44, topMargin=36, bottomMargin=44,
title='AMI CAN 报文说明', author='AMI / YMR', title='AMI CAN 报文说明', author='AMI / YMR',
subject='AMI CAN DBC v2.1: CAN1 500K / CAN2 250K') subject='AMI CAN DBC v2.2: CAN1 500K / CAN2 250K')
document.build(story, onFirstPage=footer, onLaterPages=footer) document.build(story, onFirstPage=footer, onLaterPages=footer)
print(OUTPUT) print(OUTPUT)
+40 -9
View File
@@ -23,6 +23,7 @@ def can2_dbc_text():
return text return text
PURPOSE = { PURPOSE = {
0x182: 'VCU / 测试器 -> AMI:扭矩千分、电机温度、MCU 温度',
0x300: 'AMI -> VCU:用户确认后的任务选择请求', 0x300: 'AMI -> VCU:用户确认后的任务选择请求',
0x6A0: 'SDC -> AMI:板标识、版本、序号、上电时间', 0x6A0: 'SDC -> AMI:板标识、版本、序号、上电时间',
0x6A1: 'SDC -> AMI:低压电池电压,精确 DLC=2', 0x6A1: 'SDC -> AMI:低压电池电压,精确 DLC=2',
@@ -40,7 +41,7 @@ def render():
db = cantools.database.load_file(ROOT / 'AMI.dbc', strict=True) db = cantools.database.load_file(ROOT / 'AMI.dbc', strict=True)
lines = [ lines = [
'# AMI CAN DBC 说明', '', '# AMI CAN DBC 说明', '',
f'版本:`{db.version}`。由 [AMI.dbc](../AMI.dbc) 自动生成,10 条报文、33 个信号。', '', f'版本:`{db.version}`。由 [AMI.dbc](../AMI.dbc) 自动生成,{len(db.messages)} 条报文、{sum(len(m.signals) for m in db.messages)} 个信号。', '',
'## 使用范围', '', '## 使用范围', '',
'CAN1 为 500 kbit/s,CAN2 为 250 kbit/s,均为 Classic CAN、87.5% 采样点。' 'CAN1 为 500 kbit/s,CAN2 为 250 kbit/s,均为 Classic CAN、87.5% 采样点。'
'两路保留相同的接收 ID、解码与任务发送功能,MCU 不在两路之间转发原始报文。' '两路保留相同的接收 ID、解码与任务发送功能,MCU 不在两路之间转发原始报文。'
@@ -49,22 +50,24 @@ def render():
'| --- | --- | --- | --- |', '| --- | --- | --- | --- |',
'| CAN1 | 500 kbit/s | PA11 / PA12 | [AMI.dbc](../AMI.dbc) |', '| CAN1 | 500 kbit/s | PA11 / PA12 | [AMI.dbc](../AMI.dbc) |',
'| CAN2 | 250 kbit/s | PB0 / PB1 | [AMI_CAN2_250k.dbc](../AMI_CAN2_250k.dbc) |', '', '| CAN2 | 250 kbit/s | PB0 / PB1 | [AMI_CAN2_250k.dbc](../AMI_CAN2_250k.dbc) |', '',
'DBC 的 `Baudrate` / `AMIPort` 分别标注所属总线。每份 DBC 均含 10 条报文、33 个信号;' 'DBC 的 `Baudrate` / `AMIPort` 分别标注所属总线。每份 DBC 均含 11 条报文、40 个信号;'
'同一份报文表适用于两路。CAN 工具必须按接入端口设置速率,导入 DBC 不一定自动改硬件速率。' '同一份报文表适用于两路。CAN 工具必须按接入端口设置速率,导入 DBC 不一定自动改硬件速率。'
'实际接法:SDC 500 kbit/s 接 CAN1,BMS 250 kbit/s 接 CAN2。', '', '实际接法:SDC 500 kbit/s 接 CAN1,BMS 250 kbit/s 接 CAN2。', '',
'FDCAN 时钟 64 MHz,时钟分频为 1;NominalPrescaler 为 CAN1=8、CAN2=16,' 'FDCAN 时钟 64 MHz,时钟分频为 1;NominalPrescaler 为 CAN1=8、CAN2=16,'
'两路均使用 Sync=1、TimeSeg1=13、TimeSeg2=2、SJW=1。' '两路均使用 Sync=1、TimeSeg1=13、TimeSeg2=2、SJW=1。'
'速率 = 64 MHz / Prescaler / (1+13+2);采样点 = (1+13)/16 = 87.5%。', '', '速率 = 64 MHz / Prescaler / (1+13+2);采样点 = (1+13)/16 = 87.5%。', '',
'本 DBC 包含 AMI 唯一发送的 `0x300` 任务请求,以及 AMI 当前识别的 SDC / BMS 输入。' '本 DBC 包含 AMI 唯一发送的 `0x300` 任务请求,以及 AMI 当前识别的 SDC / BMS 和自定义显示输入。'
'SDC `0x6A3` DAC 控制、`0x6A5` ASSI 控制、BMS 其他电芯/故障字段不属于此接口子集。' 'SDC `0x6A3` DAC 控制、`0x6A5` ASSI 控制、BMS 其他电芯/故障字段不属于此接口子集。'
'没有定义电机温度、逆变器温度、扭矩、标定后的车速、AMI 周期心跳或 VCU 执行反馈。' '`0x182` 新增扭矩千分、电机温度和电机控制器 MCU 温度的仪表显示输入;'
'发送者负责转换实际电机控制器协议。未定义标定后的车速、AMI 周期心跳或 VCU 执行反馈。'
'旧 `0x180 / 0x181 / 0x280` 输入已停用。', '', '旧 `0x180 / 0x181 / 0x280` 输入已停用。', '',
'SDC 字段依据 `SDC_ACQ_DAC.dbc` VERSION 1.1,保持其信号名、位布局、缩放和单位;' 'SDC 字段依据 `SDC_ACQ_DAC.dbc` VERSION 1.1,保持其信号名、位布局、缩放和单位;'
'仅将输入接收节点设为 AMI。BMS 字段依据 ' '仅将输入接收节点设为 AMI。BMS 字段依据 '
'[BmsMonitor-CANTest](https://git.acetaffy.ltd/acetaffy/BmsMonitor-CANTest) ' '[BmsMonitor-CANTest](https://git.acetaffy.ltd/acetaffy/BmsMonitor-CANTest) '
'提交 `e65c95203d1689df05343775982d7e85bd782646` 的 `BmsProtocolParser.cs`。', '', '提交 `e65c95203d1689df05343775982d7e85bd782646` 的 `BmsProtocolParser.cs`。', '',
'DBC 为 ASCII 编码,注释和枚举使用英文,便于导入 CAN 工具;本文为 UTF-8 中文。' 'DBC 为 ASCII 编码,注释和枚举使用英文,便于导入 CAN 工具;本文为 UTF-8 中文。'
'物理值 = 原始无符号值 × Factor + Offset;下表范围为编码范围,不表示车辆正常工作范围。', '', '物理值 = 原始值 × Factor + Offset;`0x182` 的三个数值为有符号 int16,其他数值按表定义。'
'下表范围为接口允许范围,不表示车辆正常工作范围。', '',
'## 报文总览', '', '## 报文总览', '',
'| CAN ID | 类型 | DLC | 报文名 | 方向和作用 | 周期 / 触发 |', '| CAN ID | 类型 | DLC | 报文名 | 方向和作用 | 周期 / 触发 |',
'| --- | --- | --- | --- | --- | --- |', '| --- | --- | --- | --- | --- | --- |',
@@ -78,7 +81,7 @@ def render():
'', '扩展帧在 DBC 的 `BO_` 十进制 ID 中设置 bit31:' '', '扩展帧在 DBC 的 `BO_` 十进制 ID 中设置 bit31:'
'`0x186040F3 -> 2556444915`,`0x186140F3 -> 2556510451`。' '`0x186040F3 -> 2556444915`,`0x186140F3 -> 2556510451`。'
'CAN 工具中使用实际 29 位仲裁 ID 并选择扩展帧;bit31 不是总线上发送的仲裁 ID。', '', 'CAN 工具中使用实际 29 位仲裁 ID 并选择扩展帧;bit31 不是总线上发送的仲裁 ID。', '',
'`GenMsgCycleTime` 仅填写已确认的 SDC 周期 100 / 500 / 20 ms。' '`GenMsgCycleTime` 填写已确认的 SDC 周期 100 / 500 / 20 ms,以及自定义 `0x182` 的约定周期 100 ms。'
'其余帧未填写周期,默认 0 表示未指定,不据此推断 BMS 周期。', '', '其余帧未填写周期,默认 0 表示未指定,不据此推断 BMS 周期。', '',
'## 信号布局', '', '## 信号布局', '',
'Start 为 DBC 起始位,位号从 0 开始。Intel `@1` 从最低有效位起算;' 'Start 为 DBC 起始位,位号从 0 开始。Intel `@1` 从最低有效位起算;'
@@ -100,6 +103,28 @@ def render():
lines += ['', ';'.join(choices) + '。'] lines += ['', ';'.join(choices) + '。']
lines += [''] lines += ['']
lines += [ lines += [
'## 自定义动力显示输入 0x182', '',
'标准数据帧,DLC 必须为 8;CAN1 500K 或 CAN2 250K 均可接收,建议每 100 ms 发送。'
'这是一条 AMI 仪表显示设置接口;扭矩千分以发送者定义的基准扭矩归一化,500 表示 500‰。'
'MCU 温度由发送者提供,表示电机控制器 MCU / 逆变器温度,不是 AMI 芯片自动测温。', '',
'| 字节 | 字段 | 编码与规则 |', '| --- | --- | --- |',
'| 0..1 | 扭矩千分 | 小端 int16,允许 -1000..1000,直接显示 |',
'| 2..3 | 电机温度 | 小端 int16 × 0.1 ℃,仪表四舍五入到整数 ℃ |',
'| 4..5 | MCU 温度 | 小端 int16 × 0.1 ℃,仪表四舍五入到整数 ℃ |',
'| 6 | 有效标志 | bit0 扭矩、bit1 电机温度、bit2 MCU 温度;1 有效,0 无效;bit3..7 必须为 0 |',
'| 7 | 帧版本 | 固定 1,与整体接口 v2.2 版本号独立 |', '',
'有效值更新并显示白色;标志为 0 时立即变灰并保留历史数字。'
'扭矩超出 -1000..1000 时仅扭矩无效,两个温度仍按各自标志处理。'
'温度的 int16 编码范围为 -3276.8..3276.7 ℃;显示正负半值均向远离零方向取整。'
'扩展帧、错误 DLC、版本非 1 或保留位非 0 均整帧拒绝,不覆盖数值、不刷新超时。'
'连续 2000 ms 未收到合规帧后,三个值同时变灰;BMS / SDC 流量不能续期。', '',
'CAN 工具发送样例:标准 ID `182`,DLC `8`,数据 `F4 01 C2 01 90 01 07 01`,周期 `100 ms`。'
'可用仓库脚本发送:', '', '```powershell',
'python -m pip install -r scripts/requirements-can.txt',
'python scripts/send_drivetrain_can.py --torque 500 --motor-temp 45 --mcu-temp 40 --dry-run',
'# PCAN 当前接 CAN2,速率 250000;其他适配器按 python-can 接口参数设置',
'python scripts/send_drivetrain_can.py --interface pcan --channel PCAN_USBBUS1 --bitrate 250000 --torque 500 --motor-temp 45 --mcu-temp 40 --duration 10',
'```', '',
'## AMI 任务请求语义', '', '## AMI 任务请求语义', '',
'| Task_ID | 任务 |', '| --- | --- |', '| Task_ID | 任务 |', '| --- | --- |',
'| 1 | 八字绕环 |', '| 2 | 直线加速 |', '| 3 | 高速循迹 |', '| 1 | 八字绕环 |', '| 2 | 直线加速 |', '| 3 | 高速循迹 |',
@@ -117,7 +142,10 @@ def render():
'| 低压电池 | `0x6A1` uint16 mV;`lvbat.val=(mV+5)/10`,显示两位小数 V | 1500 ms 无有效 ADC |', '| 低压电池 | `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 V;现有控件四舍五入到整数 V | 2000 ms 无有效 BMS 状态 |',
'| 高压电流 | BMS 大端 uint16 × 0.1 - 500 A;四舍五入到整数 A | 2000 ms 无有效 BMS 状态 |', '| 高压电流 | BMS 大端 uint16 × 0.1 - 500 A;四舍五入到整数 A | 2000 ms 无有效 BMS 状态 |',
'| 最高单体温度 | `0x156` 有效通道最大值,或扩展帧字节 4 - 40 | 全无效或 2000 ms 无有效温度源 |', '', '| 最高单体温度 | `0x156` 有效通道最大值,或扩展帧字节 4 - 40 | 全无效或 2000 ms 无有效温度源 |',
'| 扭矩千分 | `0x182` 小端 int16,直接更新 `dash.mct.val` | bit0=0、超范围或 2000 ms 超时 |',
'| 电机温度 | `0x182` int16 × 0.1 ℃,整数显示 `dash.djwd.val` | bit1=0 或 2000 ms 超时 |',
'| MCU 温度 | `0x182` int16 × 0.1 ℃,整数显示 `dash.mcuwd.val` | bit2=0 或 2000 ms 超时 |', '',
'电流字段是带偏置的 uint16,不能按 int16 解码。温度原始 `0xFF` 为无效;' '电流字段是带偏置的 uint16,不能按 int16 解码。温度原始 `0xFF` 为无效;'
'DBC 枚举将其标为 Invalid。关闭枚举解码的工具可能显示 215,聚合时必须先排除 ' 'DBC 枚举将其标为 Invalid。关闭枚举解码的工具可能显示 215,聚合时必须先排除 '
'原始 255,不能把它当作 215 ℃。有效实际温度范围为 -40..214 ℃。' '原始 255,不能把它当作 215 ℃。有效实际温度范围为 -40..214 ℃。'
@@ -131,6 +159,8 @@ def render():
'## 报文样例', '', '## 报文样例', '',
'| ID / DLC | 数据(十六进制) | 解码及仪表显示 |', '| --- | --- | --- |', '| ID / DLC | 数据(十六进制) | 解码及仪表显示 |', '| --- | --- | --- |',
'| `0x300 / 8` | `01 02 00 01 E8 03 00 00` | 直线加速请求、序号 0、来源 AMI、上电 1000 ms |', '| `0x300 / 8` | `01 02 00 01 E8 03 00 00` | 直线加速请求、序号 0、来源 AMI、上电 1000 ms |',
'| `0x182 / 8` | `F4 01 C2 01 90 01 07 01` | 500‰、45.0 ℃、40.0 ℃,三个值有效 |',
'| `0x182 / 8` | `0C FE 9B FF 33 FF 07 01` | -500‰、-10.1 ℃、-20.5 ℃;显示 -500 / -10 / -21 |',
'| `0x6A1 / 2` | `0C 30` | ADC 12300 mV;低压 12.30 V |', '| `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 |', '| `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 |', '| `0x140 / 8` | `0F A0 14 03 00 00 00 05` | 400.0 V / +12.3 A;显示 400 / 12 |',
@@ -145,11 +175,12 @@ def render():
'# 若同时检出 SDC 仓库,可额外比较五条输入帧的原始布局:', '# 若同时检出 SDC 仓库,可额外比较五条输入帧的原始布局:',
'python scripts/verify_dbc.py --sdc-dbc ../SDC_ACQ_DAC/SDC_ACQ_DAC.dbc', 'python scripts/verify_dbc.py --sdc-dbc ../SDC_ACQ_DAC/SDC_ACQ_DAC.dbc',
'```', '', '```', '',
'校验覆盖严格 DBC 解析(长度、信号越界与重叠)、10 个 ID 与固件宏对应、' '校验覆盖严格 DBC 解析(长度、信号越界与重叠)、11 个 ID 与固件宏对应、'
'标准/扩展格式、33 个信号、发送/接收节点、SDC 周期、24 个已知报文解码、' '标准/扩展格式、40 个信号、发送/接收节点、SDC / 自定义帧周期、已知报文解码、'
'六个任务号与计数边界编码、大端偏置电流、无效温度枚举、全负温度和截短 DLC。' '六个任务号与计数边界编码、大端偏置电流、无效温度枚举、全负温度和截短 DLC。'
'已安装并验证 cantools 44.1.0,接口参考 [cantools 官方文档](https://cantools.readthedocs.io/en/latest/)。', '', '已安装并验证 cantools 44.1.0,接口参考 [cantools 官方文档](https://cantools.readthedocs.io/en/latest/)。', '',
'上述是静态及软件编解码验证,另校验两份 DBC 的速率、相同信号布局及源码 / CubeMX 位时序一致。' '上述是静态及软件编解码验证,另校验两份 DBC 的速率、相同信号布局及源码 / CubeMX 位时序一致。'
'v2.2 的烧录回读、新帧 CAN2 测试及串口显示核验状态见 [显示 CAN 测试报告](AMI自定义显示CAN测试报告.md)。'
'v2.1 已完成烧录、完整 Flash 回读比对、CAN1 500K 与 CAN2 250K 到官方 HMI 调试器的' 'v2.1 已完成烧录、完整 Flash 回读比对、CAN1 500K 与 CAN2 250K 到官方 HMI 调试器的'
'实物测试,详见 [双 CAN 测试报告](CAN1_CAN2_v2.1测试报告.md)。' '实物测试,详见 [双 CAN 测试报告](CAN1_CAN2_v2.1测试报告.md)。'
'之前 v2.0 的 CAN 盒 -> 实物 AMI CAN1 / MCU -> USART2 -> COM4 ' '之前 v2.0 的 CAN 盒 -> 实物 AMI CAN1 / MCU -> USART2 -> COM4 '
+1
View File
@@ -0,0 +1 @@
python-can==4.6.1
+79
View File
@@ -0,0 +1,79 @@
"""Send AMI 0x182 display values through a python-can adapter (no motor actuation)."""
import argparse
from decimal import Decimal, InvalidOperation
import os
import struct
import time
def temperature_raw(value):
try:
scaled = Decimal(value) * 10
if not scaled.is_finite() or scaled != scaled.to_integral_value():
raise ValueError('temperature must have at most one decimal place')
raw = int(scaled)
except (InvalidOperation, OverflowError) as exc:
raise ValueError('invalid temperature') from exc
if not -32768 <= raw <= 32767:
raise ValueError('temperature must be -3276.8..3276.7 degC')
return raw
def build_payload(torque, motor_temp, mcu_temp, valid=7):
if not -1000 <= torque <= 1000:
raise ValueError('torque must be -1000..1000 permille')
if not 0 <= valid <= 7:
raise ValueError('valid must be 0..7 (bit0 torque, bit1 motor, bit2 MCU)')
return struct.pack('<hhhBB', torque, temperature_raw(motor_temp),
temperature_raw(mcu_temp), valid, 1)
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--torque', type=int, required=True)
parser.add_argument('--motor-temp', required=True, help='degC, up to one decimal place')
parser.add_argument('--mcu-temp', required=True, help='motor-controller temperature, degC')
parser.add_argument('--valid', type=int, default=7, help='validity mask 0..7, default all valid')
parser.add_argument('--interface', default='pcan')
parser.add_argument('--channel', default='PCAN_USBBUS1')
parser.add_argument('--bitrate', type=int, choices=(250000, 500000), default=250000)
parser.add_argument('--period', type=float, default=0.1, help='seconds, default 100 ms')
parser.add_argument('--duration', type=float, default=10, help='seconds; finite transmission')
parser.add_argument('--dll-dir', help='Windows adapter DLL directory, if required')
parser.add_argument('--dry-run', action='store_true', help='print payload without opening CAN')
args = parser.parse_args()
try:
payload = build_payload(args.torque, args.motor_temp, args.mcu_temp, args.valid)
except ValueError as exc:
parser.error(str(exc))
if not (0 < args.period <= 2 and 0 < args.duration < float('inf')):
parser.error('period must be >0 and <=2 seconds; duration must be positive and finite')
print(f'Standard ID 0x182, DLC 8, data {payload.hex(" ").upper()}, bitrate {args.bitrate}', flush=True)
if args.dry_run:
return
dll_handle = None
if args.dll_dir:
path = os.path.abspath(args.dll_dir)
os.environ['PATH'] = path + os.pathsep + os.environ['PATH']
if hasattr(os, 'add_dll_directory'):
dll_handle = os.add_dll_directory(path)
import can
count = 0
try:
with can.Bus(interface=args.interface, channel=args.channel, bitrate=args.bitrate) as bus:
message = can.Message(arbitration_id=0x182, is_extended_id=False, data=payload)
started = time.monotonic()
deadline = started
while time.monotonic() < started + args.duration:
bus.send(message, timeout=0.2)
count += 1
deadline += args.period
time.sleep(max(0, min(deadline, started + args.duration) - time.monotonic()))
finally:
if dll_handle is not None:
dll_handle.close()
print(f'Sent {count} frames. Values expire after 2 seconds without valid input.')
if __name__ == '__main__':
main()
+36 -6
View File
@@ -11,6 +11,7 @@ import re
import cantools import cantools
from export_dbc_docs import can2_dbc_text from export_dbc_docs import can2_dbc_text
from send_drivetrain_can import build_payload
ROOT = Path(__file__).resolve().parents[1] ROOT = Path(__file__).resolve().parents[1]
@@ -36,6 +37,7 @@ def verify_bit_timing():
assert value('ClockDivider') == 'FDCAN_CLOCK_DIV1' assert value('ClockDivider') == 'FDCAN_CLOCK_DIV1'
assert value('FrameFormat') == 'FDCAN_FRAME_CLASSIC' assert value('FrameFormat') == 'FDCAN_FRAME_CLASSIC'
assert int(value('StdFiltersNbr')) == int(ioc[f'FDCAN{port}.StdFiltersNbr']) == 4
prescaler, seg1, seg2, sjw = (int(value(field)) for field in prescaler, seg1, seg2, sjw = (int(value(field)) for field in
('NominalPrescaler', 'NominalTimeSeg1', ('NominalPrescaler', 'NominalTimeSeg1',
'NominalTimeSeg2', 'NominalSyncJumpWidth')) 'NominalTimeSeg2', 'NominalSyncJumpWidth'))
@@ -70,23 +72,24 @@ def main():
header = (ROOT / 'firmware/Core/Inc/ami_protocol.h').read_text(encoding='utf-8') header = (ROOT / 'firmware/Core/Inc/ami_protocol.h').read_text(encoding='utf-8')
identifiers = {int(value, 16) for value in re.findall( identifiers = {int(value, 16) for value in re.findall(
r'^#define\s+AMI_CAN_ID_\w+\s+(0x[\dA-Fa-f]+)', header, re.MULTILINE)} r'^#define\s+AMI_CAN_ID_\w+\s+(0x[\dA-Fa-f]+)', header, re.MULTILINE)}
expected = {0x300:(False,8), 0x6A0:(False,8), 0x6A1:(False,2), expected = {0x182:(False,8), 0x300:(False,8), 0x6A0:(False,8), 0x6A1:(False,2),
0x6A2:(False,8), 0x6A4:(False,4), 0x6A6:(False,8), 0x6A2:(False,8), 0x6A4:(False,4), 0x6A6:(False,8),
0x140:(False,8), 0x156:(False,8), 0x140:(False,8), 0x156:(False,8),
0x186040F3:(True,8), 0x186140F3:(True,8)} 0x186040F3:(True,8), 0x186140F3:(True,8)}
actual = {m.frame_id:(m.is_extended_frame,m.length) for m in db.messages} actual = {m.frame_id:(m.is_extended_frame,m.length) for m in db.messages}
assert actual == expected, actual assert actual == expected, actual
assert set(actual) == identifiers, (actual, identifiers) assert set(actual) == identifiers, (actual, identifiers)
assert len(db.messages) == 10 assert len(db.messages) == 11
assert sum(len(m.signals) for m in db.messages) == 33 assert sum(len(m.signals) for m in db.messages) == 40
for m in db.messages: for m in db.messages:
if m.frame_id == 0x300: if m.frame_id == 0x300:
assert m.senders == ['AMI'] and m.receivers == {'VCU'} assert m.senders == ['AMI'] and m.receivers == {'VCU'}
else: else:
assert m.receivers == {'AMI'} assert m.receivers == {'AMI'}
assert m.senders == (['SDC_ACQ_DAC'] if 0x6A0 <= m.frame_id <= 0x6A6 else ['BMS']) assert m.senders == (['VCU'] if m.frame_id == 0x182 else
['SDC_ACQ_DAC'] if 0x6A0 <= m.frame_id <= 0x6A6 else ['BMS'])
assert db.dbc.attributes['Baudrate'].value == 500000 assert db.dbc.attributes['Baudrate'].value == 500000
for ident, cycle in [(0x6A0,100), (0x6A1,500), (0x6A2,20)]: for ident, cycle in [(0x182,100), (0x6A0,100), (0x6A1,500), (0x6A2,20)]:
assert db.get_message_by_frame_id(ident).cycle_time == cycle assert db.get_message_by_frame_id(ident).cycle_time == cycle
for ident in [0x300,0x6A4,0x6A6,0x140,0x156,0x186040F3,0x186140F3]: for ident in [0x300,0x6A4,0x6A6,0x140,0x156,0x186040F3,0x186140F3]:
assert db.get_message_by_frame_id(ident).cycle_time in (None,0) assert db.get_message_by_frame_id(ident).cycle_time in (None,0)
@@ -96,6 +99,32 @@ def main():
checks.append({'id':hex(ident),'data':data}) checks.append({'id':hex(ident),'data':data})
return db.decode_message(ident, bytes.fromhex(data), decode_choices=False) return db.decode_message(ident, bytes.fromhex(data), decode_choices=False)
display = db.get_message_by_frame_id(0x182)
for raw, torque, motor, mcu, flags in [
('F4 01 C2 01 90 01 07 01',500,45,40,7),
('0C FE 9B FF 33 FF 07 01',-500,-10.1,-20.5,7),
('18 FC 00 80 FF 7F 05 01',-1000,-3276.8,3276.7,5),
('E8 03 00 00 00 00 00 01',1000,0,0,0)]:
values = decode(0x182,raw)
assert values['Torque_Permille'] == torque
near(values['Motor_Temperature'],motor)
near(values['MCU_Temperature'],mcu)
for bit, name in enumerate(('Torque_Valid','Motor_Temperature_Valid','MCU_Temperature_Valid')):
assert values[name] == ((flags >> bit) & 1)
assert values['Protocol_Version'] == 1
assert display.encode(values) == bytes.fromhex(raw)
assert build_payload(torque,str(motor),str(mcu),flags) == bytes.fromhex(raw)
assert all(display.get_signal_by_name(name).is_signed for name in
('Torque_Permille','Motor_Temperature','MCU_Temperature'))
for arguments in ((1001,'45','40',7), (0,'3276.8','40',7),
(0,'45.01','40',7), (0,'45','40',8), (0,'nan','40',7)):
try:
build_payload(*arguments)
except ValueError:
pass
else:
raise AssertionError(f'Invalid sender arguments accepted: {arguments}')
# Canonical request at 1000 ms, first sequence, task 2; all six task enums. # Canonical request at 1000 ms, first sequence, task 2; all six task enums.
task = decode(0x300,'01 02 00 01 E8 03 00 00') task = decode(0x300,'01 02 00 01 E8 03 00 00')
assert task == {'Protocol_Version':1,'Task_ID':2,'Request_Sequence':0, assert task == {'Protocol_Version':1,'Task_ID':2,'Request_Sequence':0,
@@ -189,11 +218,12 @@ def main():
for decode_choices in (False, True): for decode_choices in (False, True):
assert db.decode_message(ident, payload, decode_choices=decode_choices) == \ assert db.decode_message(ident, payload, decode_choices=decode_choices) == \
db2.decode_message(ident, payload, decode_choices=decode_choices) db2.decode_message(ident, payload, decode_choices=decode_choices)
print(json.dumps({'result':'passed','messages':len(db.messages),'signals':33, print(json.dumps({'result':'passed','messages':len(db.messages),'signals':40,
'known_payload_checks':len(checks),'all_task_ids_and_counter_edges':True, 'known_payload_checks':len(checks),'all_task_ids_and_counter_edges':True,
'ports_bitrate':bitrates,'both_dbc_layouts_and_payloads_match':True, 'ports_bitrate':bitrates,'both_dbc_layouts_and_payloads_match':True,
'firmware_and_ioc_bit_timing_match':True, 'firmware_and_ioc_bit_timing_match':True,
'firmware_ids_match':True,'sdc_source_layout_match':source_check, 'firmware_ids_match':True,'sdc_source_layout_match':source_check,
'display_sender_known_bytes_and_argument_rejection':True,
'cantools_version':cantools.__version__},indent=2)) 'cantools_version':cantools.__version__},indent=2))