From 42dd1adc06475f0aa0cc03193735e1b0dfe78a4e Mon Sep 17 00:00:00 2001 From: cbb <2625274797@qq.com> Date: Wed, 9 Sep 2026 02:53:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(can):=20CAN-FD=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=AE=B5=E6=B3=A2=E7=89=B9=E7=8E=87=202Mbps=20=E6=8F=90?= =?UTF-8?q?=E5=8D=87=E8=87=B3=205Mbps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 数据段改为 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 个数据位, 自发帧被判为错误帧。 --- Robot_V2/device/Can.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Robot_V2/device/Can.cpp b/Robot_V2/device/Can.cpp index 0c496f7..ac08ef4 100644 --- a/Robot_V2/device/Can.cpp +++ b/Robot_V2/device/Can.cpp @@ -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 */