硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1149|回复: 6
收起左侧

[CAN/FDCAN] FD-can配置5Mbps没有输出

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2023-6-8 13:32:37 | 显示全部楼层 |阅读模式
最近在调试fdcan这一块,测试1M仲裁5M数据始终无法正确通信,使用示波器测试can的tx发现没有脉冲输出。实测最快只能做到3M的数据频率,想咨询一下如何做到5M


使用120M时钟fdcan的配置

hfdcan1.Instance = FDCAN1;
  hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;
  hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
  hfdcan1.Init.AutoRetransmission = ENABLE;
  hfdcan1.Init.TransmitPause = DISABLE;
  hfdcan1.Init.ProtocolException = ENABLE;
  hfdcan1.Init.NominalPrescaler = 1;
  hfdcan1.Init.NominalSyncJumpWidth = 24;
  hfdcan1.Init.NominalTimeSeg1 = 95;
  hfdcan1.Init.NominalTimeSeg2 = 24;
  hfdcan1.Init.DataPrescaler = 1;
  hfdcan1.Init.DataSyncJumpWidth = 3;
  hfdcan1.Init.DataTimeSeg1 = 19;
  hfdcan1.Init.DataTimeSeg2 = 5;
  hfdcan1.Init.MessageRAMOffset = 0;
  hfdcan1.Init.StdFiltersNbr = 4;
  hfdcan1.Init.ExtFiltersNbr = 4;
  hfdcan1.Init.RxFifo0ElmtsNbr = 32;
  hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64;
  hfdcan1.Init.RxFifo1ElmtsNbr = 0;
  hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_64;
  hfdcan1.Init.RxBuffersNbr = 0;
  hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_64;
  hfdcan1.Init.TxEventsNbr = 0;
  hfdcan1.Init.TxBuffersNbr = 0;
  hfdcan1.Init.TxFifoQueueElmtsNbr = 32;
  hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_64;


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111801
QQ
发表于 2023-6-8 16:28:29 | 显示全部楼层
楼主的CANFD PHY芯片是用的SIC加强版吧

这个确保没问题了,剩下排查时钟配置,合理配置参数即可。
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2023-6-8 17:32:18 | 显示全部楼层
破案了,高速时需要加上  
HAL_FDCAN_ConfigTxDelayCompensation()
HAL_FDCAN_EnableTxDelayCompensation()
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111801
QQ
发表于 2023-6-9 09:17:26 | 显示全部楼层
Sundodry 发表于 2023-6-8 17:32
破案了,高速时需要加上  
HAL_FDCAN_ConfigTxDelayCompensation()
HAL_FDCAN_EnableTxDelayCompensati ...

回复

使用道具 举报

4

主题

50

回帖

62

积分

初级会员

积分
62
发表于 2023-6-9 09:25:29 | 显示全部楼层
楼上讲的比较简略,我补充一点,写在我代码里面的注释
[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);
回复

使用道具 举报

4

主题

1407

回帖

1419

积分

至尊会员

积分
1419
发表于 2023-6-9 15:03:40 | 显示全部楼层
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2024-1-26 13:37:46 | 显示全部楼层
Sundodry 发表于 2023-6-8 17:32
破案了,高速时需要加上  
HAL_FDCAN_ConfigTxDelayCompensation()
HAL_FDCAN_EnableTxDelayCompensati ...

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-11-11 03:41 , Processed in 0.276419 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表