Set CAN1 to 500K and CAN2 to 250K with matching DBCs and PDF

This commit is contained in:
shenlefengnai-rgb
2026-10-03 17:44:55 +08:00
parent ff6ef4c5e7
commit 9120bd0ec1
17 changed files with 316 additions and 33 deletions
+35 -5
View File
@@ -6,6 +6,21 @@ import cantools
ROOT = Path(__file__).resolve().parents[1]
OUTPUT = ROOT / 'docs/AMI_CAN_DBC说明.md'
CAN2_OUTPUT = ROOT / 'AMI_CAN2_250k.dbc'
def can2_dbc_text():
text = (ROOT / 'AMI.dbc').read_text(encoding='ascii')
for old, new in [
('BA_DEF_DEF_ "Baudrate" 500000;', 'BA_DEF_DEF_ "Baudrate" 250000;'),
('BA_ "Baudrate" 500000;', 'BA_ "Baudrate" 250000;'),
('"AMIPort" "CAN1";', '"AMIPort" "CAN2";'),
('This file is CAN1; use AMI_CAN2_250k.dbc for CAN2.',
'This file is CAN2; use AMI.dbc for CAN1.'),
]:
assert old in text, old
text = text.replace(old, new)
return text
PURPOSE = {
0x300: 'AMI -> VCU:用户确认后的任务选择请求',
@@ -27,8 +42,19 @@ def render():
'# AMI CAN DBC 说明', '',
f'版本:`{db.version}`。由 [AMI.dbc](../AMI.dbc) 自动生成,10 条报文、33 个信号。', '',
'## 使用范围', '',
'CAN1 / CAN2 功能相同,均为 500 kbit/s、Classic CAN、87.5% 采样点。'
'CAN1 为 500 kbit/s,CAN2 为 250 kbit/s,均为 Classic CAN、87.5% 采样点。'
'两路保留相同的接收 ID、解码与任务发送功能,MCU 不在两路之间转发原始报文。'
'节点 AMI 为仪表 MCU,VCU 为任务请求的逻辑接收者,SDC_ACQ_DAC 和 BMS 为数据源。', '',
'| 端口 | 速率 | RX / TX 引脚 | 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) |', '',
'DBC 的 `Baudrate` / `AMIPort` 分别标注所属总线。每份 DBC 均含 10 条报文、33 个信号;'
'同一份报文表适用于两路。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%。', '',
'本 DBC 包含 AMI 唯一发送的 `0x300` 任务请求,以及 AMI 当前识别的 SDC / BMS 输入。'
'SDC `0x6A3` DAC 控制、`0x6A5` ASSI 控制、BMS 其他电芯/故障字段不属于此接口子集。'
'没有定义电机温度、逆变器温度、扭矩、标定后的车速、AMI 周期心跳或 VCU 执行反馈。'
@@ -123,11 +149,13 @@ def render():
'标准/扩展格式、33 个信号、发送/接收节点、SDC 周期、24 个已知报文解码、'
'六个任务号与计数边界编码、大端偏置电流、无效温度枚举、全负温度和截短 DLC。'
'已安装并验证 cantools 44.1.0,接口参考 [cantools 官方文档](https://cantools.readthedocs.io/en/latest/)。', '',
'上述是静态及软件编解码验证。之前 CAN 盒 -> 实物 AMI CAN1 / MCU -> USART2 -> COM4 '
'上述是静态及软件编解码验证,另校验两份 DBC 的速率、相同信号布局及源码 / CubeMX 位时序一致。'
'v2.1 的 CAN2 250 kbit/s 固件已编译,尚未烧录或实物验证。'
'之前 v2.0 的 CAN 盒 -> 实物 AMI CAN1 / MCU -> USART2 -> COM4 '
'-> 官方 HMI 调试器的实际更新和六个任务回传见 [联调报告](SDC_BMS联调报告.md)。'
'物理串口屏、CAN2 接线、真实 SDC/BMS 节点和车辆执行动作尚未实测;'
'文档生成和 DBC 解析不替代这些测试。', '',
'修改 AMI.dbc 后运行 `python scripts/export_dbc_docs.py` 更新本文;'
'修改 AMI.dbc 后运行 `python scripts/export_dbc_docs.py` 更新 CAN2 DBC 和本文;'
'固件字节布局、DBC 与此文档需同时保持一致。', '',
]
return '\n'.join(lines)
@@ -140,10 +168,12 @@ def main():
text = render()
if args.check:
assert OUTPUT.read_text(encoding='utf-8') == text, 'DBC document is stale; run export_dbc_docs.py'
print('DBC documentation matches AMI.dbc')
assert CAN2_OUTPUT.read_text(encoding='ascii') == can2_dbc_text(), 'CAN2 DBC is stale'
print('DBC documentation and CAN2 DBC match AMI.dbc')
else:
CAN2_OUTPUT.write_text(can2_dbc_text(), encoding='ascii', newline='\n')
OUTPUT.write_text(text, encoding='utf-8', newline='\n')
print('Generated docs/AMI_CAN_DBC说明.md')
print('Generated CAN2 DBC and docs/AMI_CAN_DBC说明.md')
if __name__ == '__main__':