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.Init.Mode = FDCAN_MODE_NORMAL;
	can1Handle.Init.AutoRetransmission = ENABLE;
	can1Handle.Init.TransmitPause = DISABLE;
	can1Handle.Init.ProtocolException = ENABLE;
	//500K-80%
	can1Handle.Init.NominalPrescaler = 0x01; 
	can1Handle.Init.NominalSyncJumpWidth = 1;
	can1Handle.Init.NominalTimeSeg1 = 143;
	can1Handle.Init.NominalTimeSeg2 = 36;
	//5M-77.7%
	can1Handle.Init.DataPrescaler = 0x01;
	can1Handle.Init.DataSyncJumpWidth = 1;
	can1Handle.Init.DataTimeSeg1 = 13;
	can1Handle.Init.DataTimeSeg2 = 4;
	
	can1Handle.Init.MessageRAMOffset = 0;
	can1Handle.Init.StdFiltersNbr = 1;
	can1Handle.Init.ExtFiltersNbr = 0;
	can1Handle.Init.RxFifo0ElmtsNbr = 1;
	can1Handle.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64;	
	can1Handle.Init.RxFifo1ElmtsNbr = 0;
	can1Handle.Init.RxBuffersNbr = 0;
	can1Handle.Init.TxEventsNbr = 0;
	can1Handle.Init.TxBuffersNbr = 0;
	can1Handle.Init.TxFifoQueueElmtsNbr = 1;
	can1Handle.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
	can1Handle.Init.TxElmtSize = FDCAN_DATA_BYTES_64;
	if (HAL_FDCAN_Init(&can1Handle) != HAL_OK)
	{
		/* Initialization Error */
		ERR("HAL_FDCAN_Init ERR\r\n");
	}

配置中需要计算的仲裁段/数据段参数主要是如下8个:

can1Handle.Init.NominalPrescaler
can1Handle.Init.NominalSyncJumpWidth
can1Handle.Init.NominalTimeSeg1
can1Handle.Init.NominalTimeSeg2
can1Handle.Init.DataPrescaler
can1Handle.Init.DataSyncJumpWidth
can1Handle.Init.DataTimeSeg1
can1Handle.Init.DataTimeSeg2

Prescaler:分频系数,此处不分频,配置为1即可;
SyncJumpWidth:重新同步跳跃宽度,不能比Seg1、Seg2大,此处配置为1;
波特率、采样点计算方法如下:
波特率 = CAN总线时钟频率/Prescaler/(1+TimeSeg1+TimeSeg2)
采样点 = (1+TimeSeg1)/(1+TimeSeg1+TimeSeg2)
此处 CAN总线时钟由系统时钟分频得到,频率为90M,具体根据自己系统配置确定。
>>仲裁段参数计算:
仲裁段采样点一般取80%
500K = 90M/(1+TimeSeg1+TimeSeg2)
0.8 = (1+TimeSeg1)/(1+TimeSeg1+TimeSeg2)
可以得出:
TimeSeg1=143
TimeSeg2=36

>>数据段参数计算:
数据段采样点一般取75%-80%
5M = 90M/(1+TimeSeg1+TimeSeg2)
0.75 = (1+TimeSeg1)/(1+TimeSeg1+TimeSeg2)
可以得出:
TimeSeg1=12.5
TimeSeg2=4.5
由于TimeSeg1、TimeSeg2必须取整数,在保证采样点满足的情况下,取TimeSeg1=13、TimeSeg2=4

到此,CANFD主要配置计算完成,初始化以后,再配置过滤器即可正常使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值