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 */