楼上讲的比较简略,我补充一点,写在我代码里面的注释
[C] 纯文本查看 复制代码 //CAN控制器发送信号时,是经过收发器后发往CAN总线后,再经过收发器反馈总线信号。那么发送过程中,控制器发送位信号到接收位信号就不可避免地存在环路延迟
//CAN协议中规定:发送方发送位时,需检测接收到的位与发送是否一致,若不一致则产生错误帧(位错误)。如果发送延迟过长,则将直接导致发送与接收位不一致而产生错误帧
//由于传统CAN协议规定最高波特率为1Mbps,即位宽1us,正常情况下,传输延迟不会超过位宽的采样点(当然具体延迟取决于收发器环路延迟、传输距离、传输线缆质量等),
//因此不会因为发送延迟而产生错误
//TDC实际上就是在发送BRS位为隐性的CANFD报文时(BRS隐性即开启数据域波特率),在发送时延迟一定时间后,在第二采样点采样接收位,以正确采样到发送位对应的接收位
//那么延迟采样的延迟时间是多久呢?实际上,开启TDC后,控制器将自动测量Tx信号线上FDF位到r0位下降沿与Rx信号线上FDF位到r0位边沿的之间的延迟时间
//发送延迟测量的时间单位为CAN控制器时钟
//当CANFD数据域波特率大于1Mbps时,应开启TDC;数据段波特率的预分频值(DBRP)建议设置为1或2
//ISO11898-1:2015中还对TDC做了一些规定:开启TDC后,数据段波特率的预分频值(DBRP)应设置为1或2;控制器实现TDC机制应能补偿至少两个位时间
//TDCF 发送器延迟补偿过滤器时间,通过引脚 FDCAN_TX 进行发送时,协议控制器会通过引脚 FDCAN_RX 接
//收到其本地 CAN 收发器发送的数据。接收数据的延迟为 CAN 收发器环路延迟。如果该延迟
//大于 TSEG1(采样点之前的时间段),则会检测到位错误。如果不进行收发器延迟补偿,
//FDCAN 帧数据阶段的比特率会受到收发器环路延迟的限制(为了适配长总线网络而设置的延迟)
#define MCU_CAN1_TDC_FILTER 2
[C] 纯文本查看 复制代码 //可变波特率设置不好,会造成TX数据在RX上检测异常,出现位错误,增加TDC延迟,让TX发出后延迟一段时间检测响应的RX
uint32_t tdcOffset = ((MCU_CAN_DataBaudArray[dataBps].brpDiv)*(MCU_CAN_DataBaudArray[dataBps].tqWithBS1));
//使能hfdcan1的TDC
HAL_FDCAN_EnableTxDelayCompensation(&FDCAN1_Handler);
//一般TDCO设置与第一采样点一致,即TdcOffset = DataTimeSeg1*DataPrescaler
HAL_FDCAN_ConfigTxDelayCompensation(&FDCAN1_Handler,tdcOffset ,MCU_CAN1_TDC_FILTER); |