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:
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user