| CAN ID | 名称 | 方向 / 时机 | 数据定义 |
- 0x6A0 | 心跳 | 板卡发送,每 1 s | A1 01 seq_L seq_H uptime_0..3;板号 A1、协议版本 1、序号、运行时间 ms。 |
+ 0x6A0 | 心跳 | 板卡发送,每 100 ms | A1 01 seq_L seq_H uptime_0..3;板号 A1、协议版本 1、序号、运行时间 ms。 |
0x6A1 | 输入电压 | 板卡发送,每 500 ms | uint16,单位 mV。例如 90 2F = 0x2F90 = 12176 mV = 12.176 V。 |
- 0x6A2 | 四路频率 | 板卡发送,每 500 ms | 4 个 uint16,单位 Hz;依次为 PA0、PA2、PA6、PB14。 |
- 0x6A3 | DAC 设置 | 外部发送给板卡 | [DAC 编号][mV_L][mV_H],编号仅允许 1 或 2。 |
+ 0x6A2 | 四路频率 | 板卡发送,每 20 ms | 4 个 uint16,单位 Hz;依次为 PA0、PA2、PA6、PB14。 |
+ 0x6A3 | DAC 设置 | 外部发送给板卡 | [DAC 编号][mV_L][mV_H],编号仅允许 1 或 2;每路 100 ms 未续帧归零。 |
0x6A4 | DAC 应答 | 板卡发送,设置后 | [结果][DAC 编号][mV_L][mV_H];结果 1 成功,0 失败。 |
0x6A5 | ASSI RGB 灯控 | 外部发送给板卡 | byte0:0=关、1=黄常亮、2=黄闪、3=蓝闪、4=蓝常亮。 |
0x6A6 | 15 路状态 | 板卡发送,上电或状态变化 | 状态 uint16、变化掩码 uint16、时间戳 uint32 ms。 |
diff --git a/SDC_ACQ_DAC.dbc b/SDC_ACQ_DAC.dbc
index 58e76e0..767c357 100644
--- a/SDC_ACQ_DAC.dbc
+++ b/SDC_ACQ_DAC.dbc
@@ -72,17 +72,17 @@ VAL_ 1700 DAC_Set_Result 0 "Failed" 1 "OK" ;
VAL_ 1700 DAC_Select 1 "DAC1" 2 "DAC2" ;
VAL_ 1701 ASSI_State 0 "AS_OFF" 1 "AS_READY" 2 "AS_DRIVING" 3 "AS_EMERGENCY" 4 "AS_FINISHED" ;
-CM_ BO_ 1696 "Standard ID 0x6A0. Sent every 1 s on CAN1 and CAN2.";
+CM_ BO_ 1696 "Standard ID 0x6A0. Sent every 100 ms on CAN1 and CAN2.";
CM_ BO_ 1697 "Standard ID 0x6A1. Filtered and calibrated physical input voltage before the hardware divider.";
-CM_ BO_ 1698 "Standard ID 0x6A2. Sent every 500 ms. Frequency order is PA0, PA2, PA6, PB14.";
-CM_ BO_ 1699 "Standard ID 0x6A3. Accepted on CAN1 and CAN2. The on-wire voltage is an unsigned mV value.";
+CM_ BO_ 1698 "Standard ID 0x6A2. Sent every 20 ms. Frequency order is PA0, PA2, PA6, PB14.";
+CM_ BO_ 1699 "Standard ID 0x6A3. Accepted on CAN1 and CAN2. The on-wire voltage is an unsigned mV value. Each DAC is reset to 0 mV if its own control frame is not received again within 100 ms.";
CM_ BO_ 1700 "Standard ID 0x6A4. Sent on CAN1 and CAN2 after a DAC command. Result 0 indicates the I2C write failed.";
CM_ BO_ 1701 "Standard ID 0x6A5. Accepted on CAN1 and CAN2. Byte 0 selects the latched ASSI RGB lamp state: AS_OFF, AS_READY, AS_DRIVING, AS_EMERGENCY, or AS_FINISHED.";
CM_ BO_ 1702 "Standard ID 0x6A6. Sent at startup and whenever PD0-PD14 state changes, on CAN1 and CAN2.";
-CM_ SG_ 256 Board_Identifier "Fixed board identifier 0xA1.";
-CM_ SG_ 259 Frequency_PA0 "TIM5_CH1 input capture on PA0.";
-CM_ SG_ 259 Frequency_PA2 "TIM9_CH1 input capture on PA2.";
-CM_ SG_ 259 Frequency_PA6 "TIM3_CH1 input capture on PA6.";
-CM_ SG_ 259 Frequency_PB14 "TIM12_CH1 input capture on PB14.";
-CM_ SG_ 816 SDC_Input_State "Bit 0 through bit 14 map directly to PD0 through PD14.";
-CM_ SG_ 816 SDC_Changed_Mask "A set bit identifies an input that changed since the preceding GPIO-status frame.";
+CM_ SG_ 1696 Board_Identifier "Fixed board identifier 0xA1.";
+CM_ SG_ 1698 Frequency_PA0 "TIM5_CH1 input capture on PA0.";
+CM_ SG_ 1698 Frequency_PA2 "TIM9_CH1 input capture on PA2.";
+CM_ SG_ 1698 Frequency_PA6 "TIM3_CH1 input capture on PA6.";
+CM_ SG_ 1698 Frequency_PB14 "TIM12_CH1 input capture on PB14.";
+CM_ SG_ 1702 SDC_Input_State "Bit 0 through bit 14 map directly to PD0 through PD14.";
+CM_ SG_ 1702 SDC_Changed_Mask "A set bit identifies an input that changed since the preceding GPIO-status frame.";
diff --git a/output/dbc/SDC_ACQ_DAC.dbc b/output/dbc/SDC_ACQ_DAC.dbc
new file mode 100644
index 0000000..767c357
--- /dev/null
+++ b/output/dbc/SDC_ACQ_DAC.dbc
@@ -0,0 +1,88 @@
+VERSION "1.1"
+
+NS_ :
+ NS_DESC_
+ CM_
+ BA_DEF_
+ BA_
+ VAL_
+ CAT_DEF_
+ CAT_
+ FILTER
+ BA_DEF_DEF_
+ EV_DATA_
+ ENVVAR_DATA_
+ SGTYPE_
+ SGTYPE_VAL_
+ BA_DEF_SGTYPE_
+ BA_SGTYPE_
+ SIG_TYPE_REF_
+ VAL_TABLE_
+ SIG_GROUP_
+ SIG_VALTYPE_
+ SIGTYPE_VALTYPE_
+ BO_TX_BU_
+ BA_DEF_REL_
+ BA_REL_
+ BA_DEF_DEF_REL_
+ BU_SG_REL_
+ BU_EV_REL_
+ BU_BO_REL_
+ SG_MUL_VAL_
+
+BS_:
+
+BU_: SDC_ACQ_DAC VehicleController
+
+BO_ 1696 SDC_Heartbeat: 8 SDC_ACQ_DAC
+ SG_ Board_Identifier : 0|8@1+ (1,0) [0|255] "" VehicleController
+ SG_ Protocol_Version : 8|8@1+ (1,0) [0|255] "" VehicleController
+ SG_ Heartbeat_Sequence : 16|16@1+ (1,0) [0|65535] "" VehicleController
+ SG_ Uptime : 32|32@1+ (0.001,0) [0|4294967.295] "s" VehicleController
+
+BO_ 1697 SDC_ADC_InputVoltage: 2 SDC_ACQ_DAC
+ SG_ Input_Voltage : 0|16@1+ (0.001,0) [0|65.535] "V" VehicleController
+
+BO_ 1698 SDC_InputFrequencies: 8 SDC_ACQ_DAC
+ SG_ Frequency_PA0 : 0|16@1+ (1,0) [0|65535] "Hz" VehicleController
+ SG_ Frequency_PA2 : 16|16@1+ (1,0) [0|65535] "Hz" VehicleController
+ SG_ Frequency_PA6 : 32|16@1+ (1,0) [0|65535] "Hz" VehicleController
+ SG_ Frequency_PB14 : 48|16@1+ (1,0) [0|65535] "Hz" VehicleController
+
+BO_ 1699 SDC_DAC_Set: 3 VehicleController
+ SG_ DAC_Select : 0|8@1+ (1,0) [1|2] "" SDC_ACQ_DAC
+ SG_ DAC_Command_Voltage : 8|16@1+ (0.001,0) [0|5] "V" SDC_ACQ_DAC
+
+BO_ 1700 SDC_DAC_Ack: 4 SDC_ACQ_DAC
+ SG_ DAC_Set_Result : 0|8@1+ (1,0) [0|1] "" VehicleController
+ SG_ DAC_Select : 8|8@1+ (1,0) [1|2] "" VehicleController
+ SG_ DAC_Output_Voltage : 16|16@1+ (0.001,0) [0|5] "V" VehicleController
+
+BO_ 1701 ASSI_Lamp_Set: 1 VehicleController
+ SG_ ASSI_State : 0|8@1+ (1,0) [0|4] "" SDC_ACQ_DAC
+
+BO_ 1702 SDC_GPIO_Status: 8 SDC_ACQ_DAC
+ SG_ SDC_Input_State : 0|15@1+ (1,0) [0|32767] "" VehicleController
+ SG_ SDC_Changed_Mask : 16|15@1+ (1,0) [0|32767] "" VehicleController
+ SG_ Timestamp : 32|32@1+ (0.001,0) [0|4294967.295] "s" VehicleController
+
+VAL_ 1696 Board_Identifier 161 "A11_F407" ;
+VAL_ 1699 DAC_Select 1 "DAC1" 2 "DAC2" ;
+VAL_ 1700 DAC_Set_Result 0 "Failed" 1 "OK" ;
+VAL_ 1700 DAC_Select 1 "DAC1" 2 "DAC2" ;
+VAL_ 1701 ASSI_State 0 "AS_OFF" 1 "AS_READY" 2 "AS_DRIVING" 3 "AS_EMERGENCY" 4 "AS_FINISHED" ;
+
+CM_ BO_ 1696 "Standard ID 0x6A0. Sent every 100 ms on CAN1 and CAN2.";
+CM_ BO_ 1697 "Standard ID 0x6A1. Filtered and calibrated physical input voltage before the hardware divider.";
+CM_ BO_ 1698 "Standard ID 0x6A2. Sent every 20 ms. Frequency order is PA0, PA2, PA6, PB14.";
+CM_ BO_ 1699 "Standard ID 0x6A3. Accepted on CAN1 and CAN2. The on-wire voltage is an unsigned mV value. Each DAC is reset to 0 mV if its own control frame is not received again within 100 ms.";
+CM_ BO_ 1700 "Standard ID 0x6A4. Sent on CAN1 and CAN2 after a DAC command. Result 0 indicates the I2C write failed.";
+CM_ BO_ 1701 "Standard ID 0x6A5. Accepted on CAN1 and CAN2. Byte 0 selects the latched ASSI RGB lamp state: AS_OFF, AS_READY, AS_DRIVING, AS_EMERGENCY, or AS_FINISHED.";
+CM_ BO_ 1702 "Standard ID 0x6A6. Sent at startup and whenever PD0-PD14 state changes, on CAN1 and CAN2.";
+CM_ SG_ 1696 Board_Identifier "Fixed board identifier 0xA1.";
+CM_ SG_ 1698 Frequency_PA0 "TIM5_CH1 input capture on PA0.";
+CM_ SG_ 1698 Frequency_PA2 "TIM9_CH1 input capture on PA2.";
+CM_ SG_ 1698 Frequency_PA6 "TIM3_CH1 input capture on PA6.";
+CM_ SG_ 1698 Frequency_PB14 "TIM12_CH1 input capture on PB14.";
+CM_ SG_ 1702 SDC_Input_State "Bit 0 through bit 14 map directly to PD0 through PD14.";
+CM_ SG_ 1702 SDC_Changed_Mask "A set bit identifies an input that changed since the preceding GPIO-status frame.";
diff --git a/output/pdf/CAN报文说明表.pdf b/output/pdf/CAN报文说明表.pdf
index 8813947..891a288 100644
--- a/output/pdf/CAN报文说明表.pdf
+++ b/output/pdf/CAN报文说明表.pdf
@@ -47,7 +47,7 @@ endobj
endobj
6 0 obj
<<
-/Author (\(anonymous\)) /CreationDate (D:20260918211423+08'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260918211423+08'00') /Producer (ReportLab PDF Library - \(opensource\))
+/Author (\(anonymous\)) /CreationDate (D:20260922213520+08'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260922213520+08'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (\376\377\000S\000D\000C\000-\000A\000C\000Q\000_\000D\000A\000C\000 \000C\000A\000N\000 b\245e\207\213\364f\016\210h) /Trapped /False
>>
endobj
@@ -58,10 +58,10 @@ endobj
endobj
8 0 obj
<<
-/Filter [ /ASCII85Decode /FlateDecode ] /Length 2111
+/Filter [ /ASCII85Decode /FlateDecode ] /Length 2151
>>
stream
-Gb!;fh/h((&:`#5Tg!Re16%B=ojKYo"7u]ZKS7Mh@60e&L5&MI+XA`F*r+L%P0]Xn:@RY>6o>J'tgP:)LT+A(Q3m9EL\HB2W`gB%u\8fuDbU3Tj?FfSs\;1G4Zm_CuIBs87+oABM-8@C$VN!gkOp&tn%^JB2R.5kNa%$e3En#VgJH:TjN@2-[5o'tP(14:Nj(^qu9Wg[Sd/'e"K0JZok[XO*p/Q&p_]il1Y.p6*\'Z)ptQ1;SYCqTL'>[p#-D%/gT$"pV@H'S%)>a3k5t0Wp*^$6f!\#X!Am/V9WH?^C;IE$d^6K+.;JB6VB&:pOHS65#8u=3(KVIBQXNX\EkHN7'SNa1V@HUsl_gKuW3OumcCL%9A?jUgGN7$r`K38ff_\Y@443J"?mGN[^Y,&JS5J/rTV?2;+fCqW-RYD;g4^Z[)Y+Kf@:Ejc1ojld"%G(^B>u.4hT+7VYO+RlA:6+2sWQ/+NV=t#7VZGQ/)jgX[2o(kGgqB?6H9]%H7D,`*RXe$6)N4i'VKQ#CZohp'$tu';rAl[I;VD6\Q2i`W:ShBuB5OR1FkGI\3M5RfACWtZ48KOp.C1-bWCdGGRcOVN,d7H1f8o3Rspp9"csLseN@+AT_b&X.3;F;;\=^j"2:m[\tHb$5V)PaB%pZ!48+S7M(5MB8]WDR(9f/n9p_4-8Q:ks.`1bk-pN%b0gtkWpYthLA*`']cMhLi_@(NNlc5P(e#6_*W`"gdffuI^ji9_re5)`k7nj*Hds`,O"NWHhUc3YOqk<%;sPph.C!?J+X'<]fR/Q2>]I_2F!%jJmJ+.RsL62'1=T,>)Y&!!C?.[H]-srJY\Ij>rRifSHX"6C"a9d2$=;(!qdI`.bY$j2$?IZh^i]=p/b"CjuIendstream
+Gb!;fh/h((&:`#5Tg!QhR79`J0:Nh#kSMSP$(!`jF>-9*)FC,(+b;*3d(d7Eq=JfBT?eu4mA(J_G-tMWp:%YsNt[7tgpPI($2JI.DZ.K[#;UWl\>5;3[`OT:NOKjSc7(9DGcbbU^eb=EE#t/kdpSsqP\Y!#-5>25`Q8>,jC&p#AuE-A&74*;5hQ<+#\kghUsFKsU2DlJZ)MShYg)pNfs8lYd%/hO0X*qH#u>GTa,M)s+OtH6bV[+(,IDjG0Wq[u?@G7RYK6&WfueG('27o!b7%WQUJu*Td*9@N?pHe>"[WM^7BMuW#ZXPu'eJ$0;WTK1gIJjpc;[J8W2htJ.O/kT]IseM\CG4)BS8)L'42B$ps^%rTV1Mo4f9_s+>13[c#E56s>@OCfCSo\YX)$F`RaW7\S+Zu\=u42!i17Yg_o\o+Y2drl;^2J;aMhe$#2>&ti'[omFFCT'5o@fjP?31Sqi>a6-kfhBnoK-V8RjMah-CB*EY]OD2.cuU739?mu=XHfqF3`9f[aZ@Y/CIeZ\`A8XIeq8P`'ZcQiTNkUt:+g3gb[:ncYS=AWg/>EW_VEK^fS#6*/_DPQUD2WcUYu=)1?)pe@[:_,=CqD)4PffjTkp0A""Z*ejWK,4aIt%*u!>jl#/2CJ(4NaM!Op]KftHrB$s`THC;&?_nQtef@O@g!Y^o%OE[MI;jT*]2D]p_0IX:[cjFQKPrP_:m5")Em]T`n9VqnQM,Rm*f=fiTOH9q]=;N+Kp]!>%tdoV:Btb5N40jh!]4#K?F)BM(t8<5GMs:t&CaEsKh*")O^>!A!72N)]`@hQ(`3_S10k'T5W+F+VbI"(E.?(G`0u=0%6YDoqr0UEb24uHKM.tC5mpo2p#M$=UWG+R0c:9dep%P&;,YN\J/@f_S8,H\'`t9.5lEkCE<)F]9k^jEO^eLX)6BM"El)p&F=E_fF*tVQE4Di.k"S^"abUg1>9I^g!"maLc9^L\6dr,g3!k[bL*gQe"mYo](RV_jt0$\QF8C"A6M5&ZVe"^_'W#(JJ(0q$&Ho)hdFQm,fI?FEZp]C<%otU\a/LVs45"e?V+abtl0mQU_\8Q?n"(Vi'Dj"YSnd;ur85IY>'=W4o,el]kn6K`UKo&LX.(u]9,9\IEND$cJhhrhgo-jaicR0epbX=?YrUa%%oQ.$NFnV_scF9TL+dU_UnS3pk@CEs!1N5@OZk>_^o4i=F(,'YPALHFot\9XBMM9m!426P^knmOB"ogSgQf&qL3]!D7m/(puhEE>cBVN=Eendstream
endobj
xref
0 9
@@ -77,7 +77,7 @@ xref
trailer
<<
/ID
-[<0c601b021e0ca62988154610c4965733><0c601b021e0ca62988154610c4965733>]
+[]
% ReportLab generated PDF document -- digest (opensource)
/Info 6 0 R
@@ -85,5 +85,5 @@ trailer
/Size 9
>>
startxref
-4057
+4097
%%EOF
diff --git a/固件使用说明.md b/固件使用说明.md
index 944430d..bdfb0d1 100644
--- a/固件使用说明.md
+++ b/固件使用说明.md
@@ -12,8 +12,8 @@
2. 接收 CAN1、CAN2 的 DAC 控制帧。
3. 读取四路定时器捕获值并计算频率。
4. 汇总 15 路 GPIO 变化并上报。
-5. 每 500 ms 上报 ADC 和四路频率。
-6. 每 500 ms 翻转运行指示灯,每 1 s 发送 CAN 心跳。
+5. 每 500 ms 上报 ADC、每 20 ms 上报四路频率。
+6. 每 500 ms 翻转运行指示灯,每 100 ms 发送 CAN 心跳。
`PE0` 为正常运行心跳灯;若进入 `Error_Handler()`,`PE0` 和 `PE1` 会快速同时翻转。
@@ -78,16 +78,18 @@ CAN1 和 CAN2 使用相同协议,所有主动上报均分别发送到两条总
| ID | 名称 | 周期/触发 | 数据 |
|---:|---|---|---|
-| `0x6A0` | 心跳 | 每 1 s | `A1 01 seq_L seq_H uptime_0..3` |
+| `0x6A0` | 心跳 | 每 100 ms | `A1 01 seq_L seq_H uptime_0..3` |
| `0x6A1` | ADC 电压 | 每 500 ms | 输入电压 `uint16`,单位 mV |
-| `0x6A2` | 四路频率 | 每 500 ms | 4 个 `uint16`,单位 Hz,顺序 PA0/PA2/PA6/PB14 |
-| `0x6A3` | DAC 设置命令 | 接收 | `[DAC 编号][mV_L][mV_H]` |
+| `0x6A2` | 四路频率 | 每 20 ms | 4 个 `uint16`,单位 Hz,顺序 PA0/PA2/PA6/PB14 |
+| `0x6A3` | DAC 设置命令 | 接收 | `[DAC 编号][mV_L][mV_H]`;每路在 100 ms 内未收到本路下一帧时归零 |
| `0x6A4` | DAC 应答 | 每次 DAC 设置后 | `[结果][DAC 编号][mV_L][mV_H]` |
| `0x6A5` | ASSI 灯控 | 接收 | `byte0`:`0=AS_OFF`、`1=AS_READY`、`2=AS_DRIVING`、`3=AS_EMERGENCY`、`4=AS_FINISHED` |
| `0x6A6` | GPIO 状态 | 上电、任一输入变化 | 状态 `uint16`、变化掩码 `uint16`、时间戳 `uint32 ms` |
心跳帧中板号为 `0xA1`、协议版本为 `0x01`,序号与上电时间均为低字节在前。完整信号定义和量纲以 [DBC 文件](SDC_ACQ_DAC.dbc) 为准。
+DAC 的 CAN 安全超时按通道独立执行:收到 `0x6A3` 中 DAC1 或 DAC2 的有效控制帧后,该通道必须在 100 ms 内再次收到自己的控制帧,否则固件仅将该通道写为 0 mV 一次。串口 DAC 指令不启动或刷新这个 CAN 控制帧超时。
+
### ASSI RGB 状态灯
`PE9/PE10/PE11` 分别控制外部红、绿、蓝灯 MOS,均为高电平有效。`0x6A5` 可由 CAN1 或 CAN2 接收,状态在下一帧有效灯控报文到达前保持不变;上电默认 `AS_OFF`。`AS_READY` 为红绿常亮(黄),`AS_DRIVING` 为红绿以 2 Hz、50% 占空比闪烁(各 250 ms 亮/灭),`AS_EMERGENCY` 为蓝灯以相同节奏闪烁,`AS_FINISHED` 为蓝灯常亮。`PE0` 运行心跳和 `PE1` 故障指示保持原行为。