STM32G4XX CANFD要开启发送延迟补偿

最近做项目需要CANFD 开启BRS(位可变速率),波特率为1M-5M,只有开启BRS后数据位波特率才会达到5M,如果不开启会与识别段一样为1M波特率,在使用过程中会经常遇到位错误,原因是没有开启TDC,那为什么要开启TDC呢?

在CANFD协议中,有个重要的概念TDC(Transmitter Delay Compensation)即发送延迟补偿。为什么会存在发送延迟,又为什么CANFD要对发送延迟做补偿?

为什么存在发送延迟?

众所周知,CAN控制器发送信号时,是经过收发器后发往CAN总线后,再经过收发器反馈总线信号。那么发送过程中,控制器发送位信号到接收位信号就不可避免地存在环路延迟。发送延迟时间的总和如下:

  • CAN控制器内部产生TX信号到Tx引脚的传播延迟;
  • Tx引脚到收发器TxD引脚的传播延迟;
  • 收发器环路延迟TxD到RxD;
  • 收发器RxD引脚到CAN控制器Rx引脚延迟;
  • CAN控制器Rx引脚到控制器内部收到Rx信号的延迟。

CAN协议中规定:发送方发送位时,需检测接收到的位与发送是否一致,若不一致则产生错误帧(位错误)。如果发送延迟过长,则将直接导致发送与接收位不一致而产生错误帧。由于传统CAN协议规定最高波特率为1Mbps,即位宽1us,正常情况下,传输延迟不会超过位宽的采样点(当然具体延迟取决于收发器环路延迟、传输距离、传输线缆质量等),因此不会因为发送延迟而产生错误。

为什么CANFD要对发送延迟做补偿?

在CANFD中,数据段的波特率是比CAN更高的(BRS位为隐性时),此时波特率越高,位宽越小,在发送报文时发送延迟影响越大,越容易产生位错误。由于发送延迟无法避免,此时就需要一种机制来保证发送与接收的位对应上,以避免产生位错误。这种机制就是发送延迟补偿了。

发送延迟补偿(TDC)

TDC实际上就是在发送BRS位为隐性的CANFD报文时(BRS隐性即开启数据域波特率),在发送时延迟一定时间后,在第二采样点采样接收位,以正确采样到发送位对应的接收位。

1. 发送延迟测量

那么延迟采样的延迟时间是多久呢?实际上,开启TDC后,控制器将自动测量Tx信号线上FDF位到r0位下降沿与Rx信号线上FDF位到r0位边沿的之间的延迟时间,如下图中所示,TDCV即为延迟时间。发送延迟测量的时间单位为CAN控制器时钟(TDC寄存器中一般对TDCV的值有限制,若超过寄存器最大位数,则发送延迟测量失败)。

2. 第二采样点(SSP)

在达到延迟时间后,控制器此时需要采样接收位,该采样点我们称为第二采样点(SSP=Second Sample Point),以区别未延迟之前的采样点(SP),如下图所示。

SSP等于测量延迟TDCV+发送延迟补偿偏移TDCO(TDC Offset)之和。一般TDCO设置与第一采样点一致,即(PROP+TSEG1) * DBRP。主要注意是:实际填入寄存器的波特率参数一般为实际值减一,具体可参考控制器手册说明。

此外,ISO11898-1:2015中还对TDC做了一些规定:

  • 开启TDC后,数据段波特率的预分频值(DBRP)应设置为1或2;
  • 控制器实现TDC机制应能补偿至少两个位时间。

TDC配置建议

  • 当CANFD数据域波特率大于1Mbps时,应开启TDC;
  • 数据段波特率的预分频值(DBRP)建议设置为1或2;
  • 第二采样点SSP=发送延迟测量值TD + Offset, 其中Offset设置与第一采样点一致或早1T

TDC代码实操

HAL_FDCAN_EnableTxDelayCompensation(&hfdcan1);//使能hfdcan1的TDC
HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan1,TdcOffset ,TdcFilter);//配置hfdcan1
//TdcOffset = DataTimeSeg1*DataPrescaler 
//TdcFilter的配置可以是0,我暂时配置为和TDCTdcOffset 一致

其中DataTimeSeg1和DataPrescaler的配置如下:可以得到TdcOffset =2*12=24

  hfdcan1.Init.NominalPrescaler = 17;
  hfdcan1.Init.NominalSyncJumpWidth = 2;
  hfdcan1.Init.NominalTimeSeg1 = 7;
  hfdcan1.Init.NominalTimeSeg2 = 2;
  hfdcan1.Init.DataPrescaler = 2;
  hfdcan1.Init.DataSyncJumpWidth = 2;
  hfdcan1.Init.DataTimeSeg1 = 12;
  hfdcan1.Init.DataTimeSeg2 = 4;

 然后可以通过查看TDC所在寄存器的值,可以查看TDC是否设置成功,设置失败DBTP=0x00000E33,设置成功DBTP=0x00800E33,具体DBTP寄存器的各位请查看STM32G4数据手册

FDCAN_ProtocolStatus_FDCAN1=HAL_FDCAN_GetProtocolStatus(&hfdcan1,&Status_FDCAN1);//查看TDC所在寄存器的值

 

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32G4 是意法半导体推出的一款面向高性能应用的 32 位 ARM® Cortex®-M4 微控制器系列,具有丰富的外设和高性能特性。其中,STM32G4 系列中的 STM32G4_CANFD 是指该系列微控制器的 Controller Area Network Flexible Data Rate (CAN FD) 外设模块。 CAN FD 是一种先进的通信协议,它可以提供更高的数据传输速率和更大的数据帧长度,同时也能够保持程序兼容性。STM32G4_CANFD 模块在该系列微控制器中的应用,使得它们能够更好地满足现代应用对于高速数据传输和复杂通信的需求。 通过 STM32G4_CANFD 模块,用户可以实现更高的数据传输速率,最大可以达到 5 Mbps。同时,CAN FD 协议支持更大的数据帧长度,可达到 64 字节,这使得它非常适合需要高速数据传输的应用场景,比如汽车网络、工业控制和通信设备等领域。 在应用方面,STM32G4_CANFD 模块的灵活性也为用户提供了更多的可能。它可以通过配置灵活地适应不同的应用需求,同时在高性能和低功耗之间取得平衡。此外,基于 STM32G4 系列的微控制器,用户可以利用丰富的外设资源和先进的性能特性,轻松实现复杂的系统设计和高性能的应用开发。 综上所述,STM32G4_CANFD 模块作为 STM32G4 系列微控制器的一部分,为用户提供了高性能、灵活性和丰富的外设资源,使得它们能够更好地满足现代高速数据传输和复杂通信的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值