feat(can): CAN-FD 数据段波特率 2Mbps 提升至 5Mbps

数据段改为 prescaler=2、BS1=4TQ、BS2=1TQ:60MHz / (2 × 6TQ) = 5Mbps,
采样点 (1+4)/6 = 83.3%。仲裁段保持 1Mbps(prescaler=6、7TQ+2TQ)不变。

原注释称"数据段 prescaler 必须与非数据段相同",实际 CAN_DBT 的 DBAUDPSC
独立于仲裁段 BAUDPSC,数据段可自取分频,该约束不成立。

TDC 参数维持 filter=4 / offset=4 不变并补注说明:TDCMOD=CALC_AND_OFFSET
下硬件自动测得回路延时 TDCV,TDCO 仅作微调,经验取值约等于数据段 BS1 的
tq 数,不随波特率等比缩放;放大到 12 会使本节点回采错开约 6 个数据位,
自发帧被判为错误帧。
This commit is contained in:
cbb
2026-09-09 02:53:34 +08:00
parent 9fbd9c3d30
commit 42dd1adc06
+7 -5
View File
@@ -372,19 +372,21 @@ void canfd_config(void) {
can_fd_parameter.fd_frame = ENABLE;
can_fd_parameter.excp_event_detect = ENABLE;
can_fd_parameter.delay_compensation = ENABLE;
/* TDCF/TDCO 不随数据波特率等比缩放:TDCMOD=CALC_AND_OFFSET 下硬件已自动测得
* 回路延时(TDCV),这里只是微调,经验取 TDCO ≈ 数据段 BS1 的 tq 数(4TQ→4)。
* 放到 12 会让本节点回采时错开约 6 个数据位,自己发出的帧被判成错误帧。 */
can_fd_tdc_parameter.tdc_filter = 0x04;
can_fd_tdc_parameter.tdc_mode = CAN_TDCMOD_CALC_AND_OFFSET;
can_fd_tdc_parameter.tdc_offset = 0x04;
can_fd_parameter.p_delay_compensation = &can_fd_tdc_parameter;
can_fd_parameter.iso_bosch = CAN_FDMOD_ISO;
can_fd_parameter.esi_mode = CAN_ESIMOD_HARDWARE;
/* FD mode data baudrate 2Mbps, sample piont at 80% */
/* FD mode data baudrate 5Mbps = 60MHz / (2 × 6TQ), sample point at 83.3%.
* CAN_DBT 的 DBAUDPSC 独立于仲裁段 BAUDPSC,数据段 prescaler 可自取。 */
can_fd_parameter.data_resync_jump_width = CAN_BT_SJW_1TQ;
can_fd_parameter.data_time_segment_1 = CAN_BT_BS1_3TQ;
can_fd_parameter.data_time_segment_1 = CAN_BT_BS1_4TQ;
can_fd_parameter.data_time_segment_2 = CAN_BT_BS2_1TQ;
/* CAN-FD data segement prescaler should be the same as non-data segement
* prescaler */
can_fd_parameter.data_prescaler = 6;
can_fd_parameter.data_prescaler = 2;
can_fd_init(CAN0, &can_fd_parameter);
/* initialize filter */