CANFD协议

CANFD协议

概述: 通过MCU-STM32H743自带CANFD的收发进行了学习记录。


1.CANFD协议简介

  CAN是Controller Area Network的缩写,是ISO国际标准化的串行通信协议在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来,传统CAN总线最高传输速率为1Mbit/s,车载领域实际使用速率最高却仅为500Kbit/s,已然满足不了越来越高的数据吞吐量需求,因而CAN方案的瓶颈逐步凸显,尤其未来更多的ECU搭载终会导致总线负载率持续增加导网络拥堵。进而衍生出了CANFD协议,继承了CAN总线的主要特性。CAN总线采用双线串行通信协议,基于非破坏性仲裁技术,分布式实时控制,可靠的错误处理和检测机制,但CAN总线带宽和数据长度却受到制约,CANFD总线弥补了CAN总线带宽和数据场的制约
如下为车载构想示意图:
在这里插入图片描述

1.1 显性电平与隐形电平

  要了解CANFD协议就要先了解CAN协议遵循的电平标准。
差分信号:
  CAN总线上传输的信号为差分信号,所谓差分信号区别于传统的一根信号线一根地线的做法,差分传输在两根线上传输信号,这两个信号的振幅相同,相位相反
CAN信号的差分信号线为CAN_HCAN_L,传输一帧数据CAN_H与CAN_L信号线上的波形如下图所示:
CAN_H: 通道一(黄色)
CAN_L: 通道二(蓝色)

显性电平与隐形电平:
  总线上的电平有显性电平和隐性电平两种,CAN收发器根据总线(CAN_High 和CAN_Low)的电位差来判断总线的电平。
  总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”隐性电平为“1”。如下图所示:
在这里插入图片描述
“显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平。并且,“隐性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。 (显性电平比隐性电平更强。)

为什么CAN总线默认电平不是0V?查看ISO11898标准:
在这里插入图片描述
显性电平(逻辑0): CAN_H为3.5V,CAN_L为1.5V
隐性电平(逻辑1): CAN_H为2.5V,CAN_L为2.5V
实测一帧数据:
CAN_H:

CAN_L:

1.2 CANFD和CAN的区别

可变位速率
  CAN-FD采用了两种位速率:从控制场中的BRS位到ACK场之前(含CRC分界符)为可变速率,其余部分为原CAN总线用的速率。.两种速率各有一套位时间定义寄存器,它们除了采用不同的位时间单位TQ外,位时间各段的分配比例也可不同。.
新的数据场长度
  CAN-FD对数据场的长度作了很大的扩充,DLC最大支持64个字节,在DLC小于等于8时与原CAN总线是一样的,大于8时有一一个非线性的增长,在无位填充的情况下,最大数据传输效率为91.59%(512/559)。

1.3 CAN数据帧格式

在这里插入图片描述

(1)帧起始

  表示数据帧开始的段,1个位的显性位。
在这里插入图片描述
所谓1个位的显性(下图是CANFD的波形,只是为了表明一个显性位):

(2)仲裁段

  表示该帧优先级的段,标准格式和扩展格式在此的构成有所不同。
在这里插入图片描述
标准格式的ID有11位。从ID28到ID18被依次发送,禁止高7位都为隐形(禁止设定:ID=1111111XXXX)。
扩展格式的ID有29位。基本ID从ID28到ID18,扩展ID由ID17到ID0表示。基本ID和标准格式的ID相同。禁止高7位都为隐形(禁止设定:ID=1111111XXXX)。

(3)控制段

  表示数据的字节数以及保留位的段,有6个位组成,标准格式和扩展格式在此的构成有所不同。
在这里插入图片描述
保留位(r0、r1):
  保留位必须全部以显性电平发送。但接收方可以接收显性、隐形以及任意组合的电平。
数据长度码(DLC):
  数据的字节数必须为0-8字节。但接收方对DLC=9-15的情况并不视为错误。数据长度码与数据的字节数的对应表如下所示:
在这里插入图片描述

(4)数据段

  数据的内容,可以发送0-8字节的数据,从MSB(最高位)开始输出。
在这里插入图片描述

(5)CRC段

  检查帧的传输错误的段,由15个位的CRC顺序和1个位的CRC界定符(用于分隔的位)构成。
在这里插入图片描述
CRC顺序:
  CRC顺序是根据多项式生成的CRC值,CRC的计算范围包括帧起始、仲裁段、控制段。接收方以同样的算法计算CRC值并进行比较,不一致时会通报错误。

(6)ACK段

  表示确认正常接收的段,由ACK槽(ACK Slot)和ACK界定符2个位构成。
在这里插入图片描述
发送单元的ACK段:
  发送单元在ACK段发送2个位的隐形位。
接收单元的ACK段:
  接收到正确消息的单元在ACK槽(ACK Slot)发送显性位,通知发送单元正常接收结束。

(7)帧结束

  表示数据帧结束的段,由7个位的隐形位构成。
在这里插入图片描述

1.4 CANFD数据帧格式

在这里插入图片描述

1.5 CANFD相比CAN新添加位介绍

EDL位: ( Extended Data Length)原CAN数据帧中的保留位r,该位功能为:
  隐性:表示CAN-FD报文
  显性:表示CAN报文
BRS位: ( Bit Rate Switch)该位功能为:
  隐性:表示转换可变速率
  显性:表示不转换速率
ESI位: ( Error State Indicator),该位的功能为:
  隐性:表示发送节点处于被动错误状态( Error Passive)
  显性:.表示发送节点处于主动错误状态( Error Active)
CANFD一帧最多可以传输64字节,DLC重新定义如下:
在这里插入图片描述
  CANFD数据帧采用新的DLC编码方式,在数据场长度为0-8字节时,采用线性规则,数据场长度为12-64字节时,使用非线性编码。

CANFD采用新的CRC算法(CRC场扩展到了21位):
  根据数据场的长度,采用不同的CRC,如CRC_17(0-16Bytes),CRC21(17-64Bytes)。

在这里插入图片描述


2.STM32H7系列单片机CANFD的应用

2.1STM32H7系列单片机CANFD简介

  STM32FH743自带的是 FDCAN 它支持 CAN协议 2.0A、 2.0B和 CAN FD V1.0。它的设计目标是,以最小的 CPU负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求 (优先级特性可软件配置 )。对于安全紧要的应用, FDCAN1提供所有支持时间触发通信模式所需的硬件功能 。
STM32FH743的 FDCAN的主要特点有:
⚫ 支持 CAN协议 2.0A、 2.0B和 CAN FD V1.0。
⚫ CAN FD模式下 波特率 >5Mbps
⚫ 支持时间触发通信 ,仅 FDCAN1支持
⚫ CAN FD模式下一帧数据最高可达 64个字节。
⚫ 支持 AUTOSAR和 J1939
⚫ 两个可配置的接收 FIFO
⚫ 64个专用接收 buffer。
⚫ 32个专用发送 buffer。
CANFD框图如下所示:
在这里插入图片描述
①、双中断线
从图中可以看出, FDCAN提供了两个中断线: fdcan_intr0_it和 fdcan_intr1_it。可以通过寄
存器 FDCAN_ILE的 EINT0和 EINT1这两个位来使能或者关闭这两个中断。
② 、 CAN内核
CAN Core包含协议控制器和收发移位寄存器,它支持 ISO 11898 1:2015的所有协议功能,支持 11位和 29位 ID。
③、同步
Sync同步单元用于同步 APB时钟信号和 CAN内核时钟。
④ 、 发送 处理
TX Handler负责将消息 RAM中的数据发送到 CAN内核,最多可以给发送单元配置 32个发送 buffer。
⑥ 、接收处理
RX Handler负责将 CAN内核的数据传输到外部消息 RAM中, RX Handler支持两个接收FIFO,每FIFO可以配置 64个专用的 buffer。
⑦ 、 APB接口
连接 FDCAN到 APB总线上。
⑧ 、消息 RAM接口
  STM32H743的 FDCAN在消息 RAM实现了过滤器、接收 FIFO、接收 buffer、 发送事件 FIFO和发送 buffer。 消息 RAM是 FDCAN1和 FDCAN2共享的,是一段10KB的内存, 消息RAM的存分配如图:

在这里插入图片描述
  消息RAM中一个元素的大小为32位(4字节)。因此10KB的RAM一共有10×1024/4=2560个元素。图中左侧是为RAM分配的区域,来看一下这个区域是怎么分配的:
SIDFC.FLSSA :这个区域用来存放11位过滤ID,此区域占用128个字(1个字=4字节)。
在这里插入图片描述
XIDFC.FLESA:这个区域用来存放29位过滤ID,此区域用了64字,一共有128字。
在这里插入图片描述
RXF0C.F0SA:接收 FIFO0 这个区域用了 64个字,一共有 1152个字。
RXF1C.F1SA:接收 FIFO1,这个区域用了 64个字,一共有 1152个字。
RXBC.RBSA:接收 buffer,这个区域用了 64个字,一共有 1152个字。
这三个分别为 Rx FIFO0、 Rx FIFO1和 Rx buffer,这三个的 bit含义都是一样的,见图:
在这里插入图片描述

TXEFC.EFSA :发送事件 FIFO,这个区域用了 32个字,一共有 64个字。
在这里插入图片描述
在这里插入图片描述
TXBC.TBSA :发送 buffer,这个区域用了 32个字,一共有 576个字。
TMC.TMSA :触发内存,这个区域用了 64个字,一共有 128个字。

2.2 CANFD的波特率与采样点

  由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段。
⚫ 同步段(SS)
⚫ 传播时间段( PTS)
⚫ 相位缓冲段 1( PBS1)
⚫ 相位缓冲段 2 (PBS2)
这些段又由可称为Time Quantum(Tq)的最小时间单位构成。
1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。
1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。各段的作用和Tq 数:
在这里插入图片描述
1个位的构成如下图组成:
在这里插入图片描述
采样点:是指读取总线电平,并将读到的电平作为位值的点,位置在PBS1结束处,通过这个时序可以计算出具体的采样点和CAN通信的波特率。
  在STM32H743中CANFD的波特率是通过位时间来设置的。STM32H743的CANFD位时间有 3段:同步段(SYNC_SEG)、时间段1 (BS1)和时间段 2 (BS2)。 STM32H743的同步段长度为 1个时间单元 tq BS1段可以设置为 1-16个时间单元 tq ,BS2段可以设置 1~8个时间单元 tq。
在这里插入图片描述
STM32H743中CANFD波特率及采样点计算如下:
CANFD_Baudrate=Clk /(Pres *(Seg1 +Seg2 +1))
Sampling_Point=1-(Seg2/(Seg1+Seg2+1))
其中:
Clk: 系统时钟
Pres: 分频系数
Seg1: 寄存器seg1的值
Seg2: 寄存器segd2的值
CANFD速率1M-5M代码配置(CANFD时钟频率配置的是80M):

  hfdcan1.Init.NominalPrescaler = 1;		//仲裁场-分频系数
  hfdcan1.Init.NominalSyncJumpWidth = 12;	//仲裁场-SJW
  hfdcan1.Init.NominalTimeSeg1 = 67;		//仲裁场-Seg1
  hfdcan1.Init.NominalTimeSeg2 = 12;		//仲裁场-Seg2
  hfdcan1.Init.DataPrescaler = 1;			//数据场-分频系数
  hfdcan1.Init.DataSyncJumpWidth = 4;		//数据场-SJW
  hfdcan1.Init.DataTimeSeg1 = 11;			//数据场-Seg1
  hfdcan1.Init.DataTimeSeg2 = 4;			//数据场-Seg2

仲裁场速率: CANFD_Baudrate=80/(67+12+1)=1M
仲裁场采样点: 1-(12/(12+67+1))=85%
数据场速率为: CANFD_Baudrate=80/(11+4+1)=5M
数据场采样点: 1-(4/(4+11+1))=75%

2.3CANFD ID过滤

  FDCAN提供了过滤器设置, 通过过滤器可以设置允许接收哪些 ID的消息。前面讲解消息
RAM的时候详细的讲过 SIDFC.FLSSA和 XIDFC.FLESA这两个域,分别为标准 ID过滤器和扩展 ID过滤器。标准 ID过滤器有三种过滤模式:

1、指定范围过滤

通过 SIDFC.FLSSA的 SFID1和 SFID2来设置需要过滤的 ID范围, 其中 SFID2的值要大于 SFID1,这样只有 ID值在 SFID1-SFID2之内的消息才能被接收到。 比如我们现在要设置 只接收 ID在 0X123-0X321范围内的消息,使用标准滤波器 n, SIDFC.FLSSAn (n=0~128)的各个位设置如下:

SIDFC.FLSSAn.SFT=0 //范围滤波
SDIFC.FLSSAn.SFEC=1 //如果滤波匹配成功的话将消息保存到 Rx FIFO中
SDIFC.FLSSAn.SFID1=0x123 //ID1 
SDIFC.FLSSAn.SFID2=0X321 //ID2
2、指定 ID过滤

我们也可以设置只接收指定的一个或者两个 ID的消息,如果只接收指定的一个 ID消息的
话 SFID1=SFID2。比如我 们要设置只接收 ID为 0X123的消息,设置如下:

SIDFC.FLSSAn.SFT=1 //指定 ID过滤
SDIFC.FLSSAn.SFEC=1 //如果滤波匹配成功的话将消息保存到 Rx FIFO中
SDIFC.FLSSAn.SFID1=0x123 //ID1 
SDIFC.FLSSAn.SFID2=0X123 //ID2
3、 传统的位过滤

第三种过滤模式就是以前STM32的 CAN上存在的位过滤模式, 在屏蔽位模式下,过滤消
息 ID和过滤掩码一起工作决定接收哪些消息,其中 SFID1为过滤的消息 ID SFID2为过滤掩
码。举个简单的例子,我们设置过滤器
SIDFC.FLSSAn工作在:传统位过滤模式,然后设置如下:

SIDFC.FLSSAn.SFT=2 //传统位过滤
SDIFC.FLSSAn.SFEC=1 //如果滤波匹配成功的话将消息保存到 Rx FIFO中
SDIFC.FLSSAn.SFID1=0XFF00 //ID1 
SDIFC.FLSSAn.SFID2=0XF000 //掩码

其中 SFID1是我们期望接收到的消息 ID,我 们希望最好接收到 ID=0XFF00的消息。 SFID2的 0XF000规定了我们必须关心的 ID,也就是接收到的消息 ID其位 [15:12]必须和 SFID1中的
位 [15:12]完全一样,其他的位不关心。也即是说接收到的消息 ID必须是 0XFFxx这样的才算正
确 (x表示不关心 )。

STM32H743ID完整ID过滤代码:

//配置FDCAN1 RX滤波器   
	FDCAN1_RXFilter.IdType=FDCAN_EXTENDED_ID;                  		//扩展 ID
	FDCAN1_RXFilter.FilterIndex=0;                                  //滤波器索引                   
	FDCAN1_RXFilter.FilterType=FDCAN_FILTER_DUAL;                   //滤波器类型(包含以上所说的三种)
	FDCAN1_RXFilter.FilterConfig=FDCAN_FILTER_TO_RXFIFO0;           //过滤器0关联到FIFO0  
	FDCAN1_RXFilter.FilterID1=0x1182000;                            //
	FDCAN1_RXFilter.FilterID2=0x1182000;                            //如果FDCAN配置为MASK的话,这里是29位掩码
	HAL_FDCAN_ConfigFilter(&hfdcan1,&FDCAN1_RXFilter);//滤波器初始化
	HAL_FDCAN_ConfigGlobalFilter(&hfdcan1,FDCAN_REJECT, FDCAN_REJECT, DISABLE, DISABLE);//FDCAN_ACCEPT_IN_RX_FIFO0  全局滤波器设置
	HAL_FDCAN_Start(&hfdcan1);                              	 //开启FDCAN  配置完RX FLITER之后开始CANFD1
	HAL_FDCAN_ActivateNotification(&hfdcan1,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);

2.4 STM32H7系列MCU_CANFD中断收发以及CUBE的配置

待更…

CAN 总线自 总线自 19 世纪 80 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 年代诞生以来,在汽车、工业控制等行得到了广泛使用。但随 着汽车电子、工业自动化的 蓬勃发展,总线上设备数量据都大增加而传统着汽车电子、工业自动化的 蓬勃发展,总线上设备数量据都大增加而传统着汽车电子、工业自动化的 蓬勃发展,总线上设备数量据都大增加而传统着汽车电子、工业自动化的 蓬勃发展,总线上设备数量据都大增加而传统着汽车电子、工业自动化的 蓬勃发展,总线上设备数量据都大增加而传统着汽车电子、工业自动化的 蓬勃发展,总线上设备数量据都大增加而传统着汽车电子、工业自动化的 蓬勃发展,总线上设备数量据都大增加而传统CAN 只能支持最高 只能支持最高 只能支持最高 只能支持最高 1M bit/s bit/s传输速率 传输速率 ,这就给 ,这就给 ,这就给 CAN CAN通信带 来的极大挑战。为满足更高通信带 来的极大挑战。为满足更高通信带 来的极大挑战。为满足更高通信带 来的极大挑战。为满足更高通信带 来的极大挑战。为满足更高通信带 来的极大挑战。为满足更高通信带 来的极大挑战。为满足更高通信带 来的极大挑战。为满足更高通信带 来的极大挑战。为满足更高通信带 来的极大挑战。为满足更高宽及数据吞吐量, 宽及数据吞吐量, 宽及数据吞吐量, 宽及数据吞吐量, CAN FD CAN FD CAN FD应运而生。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数字硬鉴

你的鼓励就是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值