记录一个STM32H7高波特率下FDCAN通讯错误的原因

最近遇到一个问题,之前一直在用的一个设备一直都正常,今天被反馈说通讯出现错误帧,然而低波特率下工作正常,当变速波特率达到5M时就无法进行通讯了,观察代码没有出现问题,抓波形发现CAN波形的TX与RX不同步,需要对CAN报文进行延时补偿,具体代码如下:

	FDCAN_ClkCalUnitTypeDef clkCalUnit;
	clkCalUnit.ClockDivider = FDCAN_CLOCK_DIV1;
	clkCalUnit.ClockCalibration = FDCAN_CLOCK_CALIBRATION_DISABLE;
	//clkCalUnit.CalFieldLength
	HAL_FDCAN_ConfigClockCalibration(&hfdcan1,&clkCalUnit);
	//Add Delay Compensation
	HAL_FDCAN_EnableTxDelayCompensation(&hfdcan1);
  uint32_t tdcValue = hfdcan1.Init.DataTimeSeg1;
  HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan1, tdcValue, 1);

将这段代码添加到FDCAN初始化时HAL_FDCAN_Start上方即可。

希望能够帮到你。

### STM32H7 FDCAN 寄存器详解及用法 #### 配置与初始化 STM32H7系列微控制器中的FDCAN模块支持灵活的数据通信协议,适用于汽车网络和其他实时应用。为了配置和使用这些寄存器,开发者通常会利用STM32CubeMX这样的工具来简化设置流程[^1]。 对于具体的寄存器操作而言: - **FDCAN Control Registers (FCR)** 控制寄存器用于管理总线状态、错误处理以及测试模式等功能。 - **Global Filter Configuration Register (GFC)** 全局过滤配置寄存器定义了消息ID的接受范围,允许或阻止特定的消息进入接收队列。 - **Individual Mask Filters (IMFRn)** 单独掩码滤波器则提供了更精细的选择机制,能够针对单个CAN ID设定屏蔽条件。 - **Message RAM Configuration** 消息RAM配置涉及到如何分配存储空间给同的邮箱(Mailbox)和FIFO缓冲区,这对于效管理和传递数据至关重要。 在实际编程过程中,可以通过如下方式访问上述提到的各种寄存器: ```c /* 设置全局过滤 */ fdcan->FD_GFC.GFC = value; /* 修改控制参数 */ fdcan->FD_FCR.FCR = control_value; ``` 此外,在涉及低级硬件交互的情况下,可能还需要考虑内存保护单元(MPU)的影响,特别是当应用程序试图访问某些特殊类型的内存区域时[^2]。 关于具体的应用场景和技术细节,建议查阅官方文档如《RM0433 Reference Manual》中有关于FDCAN章节的内容获取最权威的信息说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值