STM32H7 CANFD(CANFD加速)配置、调试

最近项目开发,设备需要对接客户车辆控制器,CAN接口为500K/5M,必须使用CANFD加速,先来解释一下“CANFD加速”的概念。
在CAN FD(Controller Area Network Flexible Data-Rate)通信中,“CAN FD加速”指的是在数据阶段(Data Phase)采用更高的位速率(bit rate)进行数据传输,从而提升数据传输效率和速度。具体来说,这意味着在发送消息的过程中,CAN FD允许将数据阶段的传输速率加速,以便更快速地传输数据负载。
详细解释:
1.CAN FD的基本原理
传统CAN:在传统CAN协议中,数据帧的所有部分(包括仲裁字段、控制字段、数据字段和CRC字段)都使用相同的位速率进行传输,通常为500 kbps或1 Mbps。
CAN FD:CAN FD协议引入了灵活的数据速率,通过允许在数据阶段使用更高的位速率,从而提升了数据传输效率。具体来说,CAN FD分为两个阶段:仲裁阶段(Arbitration Phase)和数据阶段(Data Phase)。

2. 仲裁阶段(Arbitration Phase)
仲裁阶段采用较低的位速率(与传统CAN相同),以确保网络上的所有节点能够公平地竞争总线访问权。
在这个阶段,所有节点都使用相同的位速率来发送和接收仲裁字段,确保没有节点因速率不同而丧失竞争公平性。

3.数据阶段(Data Phase):
一旦仲裁阶段结束,赢得仲裁的节点可以开始发送数据。
在数据阶段,CAN FD允许使用更高的位速率(通常高达几 Mbps),这就是“CAN FD加速”的主要体现。此阶段包括数据字段和CRC字段。
通过在数据阶段使用更高的位速率,CAN FD能够显著缩短数据传输时间,提高总线利用率和通信效率。
针对STM32微处理器CANFD的使用,主要介绍一下需要配置的参数以及计算方法:
主要配置项如下:

void bsp_InitCan(uint32_t Frame)
{
   
	can1Handle.Instance = SENSOR1_CAN;
	can1Handle.Init.FrameFormat = FDCAN_FRAME_FD_BRS;
	can1Handle.<
### STM32H7 CAN调试方法及教程 #### 初始化设置 对于STM32H7系列微控制器上的CAN总线初始化,需注意几个关键点。`TxFifoQueueElmtsNbr` 参数用于设定传输队列元素数量,该参数影响到FreeLevel大小,从而确保连续发送时不丢失数据帧[^1]。 ```c // 设置FIFO/queue的元素数目 hcan->Instance->TxFTxEventFifoCtrl.TxEventFifoElementNb = TxFifoQueueElmtsNbr; ``` #### 过滤器配置 尽管某些版本驱动程序可能默认给CAN2和CAN3预留了过滤器位置,但实际上这些通道可以在未显式定义过滤规则的情况下工作。为了精确控制消息接收行为,建议通过调用 `HAL_FDCAN_ConfigGlobalFilter()` 函数来激活全局过滤机制: ```c HAL_StatusTypeDef status = HAL_FDCAN_ConfigGlobalFilter( &FDCAN1_Handler, FDCAN_FILTER_REJECT, /* Rx FIFO0 filter configuration */ FDCAN_FILTER_REJECT, /* Rx Buffer filter configuration */ FDCAN_FILTER_REJECTREMOTE /* Reject remote frames on both FIFOs and Buffers*/ ); if (status != HAL_OK) { // 错误处理... } ``` 此操作有助于防止不必要的报文进入系统并提高通信效率。 #### 定时器参数调整 针对波特率及时序参数的选择,在不采用额外分频的前提下可直接将预分频寄存器(`Prescaler`)设为1。重同步跳转宽度(`SyncJumpWidth`)应小于等于时间片段一(`TimeSeg1`)加时间片段二(`TimeSeg2`)之和。当目标速率为500 kbps且期望采样点位于80%处,则有如下关系成立: - 总线时钟频率 / Prescaler / (1 + TimeSeg1 + TimeSeg2) = 500 KHz - (1 + TimeSeg1) / (1 + TimeSeg1 + TimeSeg2) ≈ 0.8 解得:TimeSeg1=143, TimeSeg2=36[^2] ```c static void MX_CAN_Init(void){ hcan.Instance = FDCAN1; hcan.Init.ClockDivider = FDCAN_CLOCK_DIV1; hcan.Init.FrameFormat = FDCAN_FRAME_FD_BRS; hcan.Init.Mode = FDCAN_MODE_NORMAL; hcan.Init.AutoRetransmission = ENABLE; hcan.Init.TransmitPause = DISABLE; hcan.Init.ProtocolException = DISABLE; if (HAL_FDCAN_Init(&hcan) != HAL_OK) { Error_Handler(); } static const uint8_t time_quantum_500k[] = {143U, 36U}; FDCANNominalBitTimingConf bit_timing_conf; bit_timing_conf.SJW = 1U; bit_timing_conf.TS1 = time_quantum_500k[0]; bit_timing_conf.TS2 = time_quantum_500k[1]; if(HAL_FDCAN_SetNominalBitRatePrescaler(&hcan, 1)!= HAL_OK || HAL_FDCAN_SetNominalBitTimingReg(&hcan,&bit_timing_conf) != HAL_OK ) { Error_Handler(); } } ``` 以上代码展示了如何基于上述理论值完成实际硬件编程中的定时器参数配置过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值