小猫爪:S32K3学习笔记02-S32K3之FlexCAN

1 前言

  努力学习一下S32K3的CAN外设,CAN的使用场景还是非常多的,特别在汽车电子更是主流的通信网络,下面就基于S32K3的FlexCAN模块学习一下CAN的相关知识以及S32K3有关CAN的MCAL配置示例。

2 CAN协议简介

  CAN的基本协议在这里就不多说啥了,网上资料巨多,随便搜一搜就有了。在这里贴出几个推荐的文章供大家参考:

  1. 《CAN通信协议(一)》
  2. 《CAN数据链路层的帧格式介绍——数据帧和远程帧》
  3. 《CAN-FD协议浅析》

CAN进阶篇:《CAN、CAN-FD 错误帧 Bus-Off 排查定位》

2.5 CAN资源介绍

关于S32K3系列的FlexCAN资源请详见下表:
在这里插入图片描述
在这里插入图片描述

3 FlexCAN简介

  NXP的FlexCAN外设IP如果按我来评价的话,那是巨复杂,下面就让我们一点点的拨开它。下面框图为FlexCAN的功能框图。
在这里插入图片描述
  功能框图乍一看上去那是非常的简单,其中:

名称描述
BIU可以理解成是一个总线接口控制器,用来做信号连接的,啥时钟信号,数据信号,中断信号等等信号
CHI可以理解成是FlexCAN的控制中心
PE可以理解成是控制中心的执行机构
RAM一段专门给FlexCAN使用的RAM空间,用来存储收发的报文,也就是MB(message buffer)

  就是这个简单的框图里面包含的东西巨复杂,巨恐怖,继续往下看。

3.1 MB(邮箱)系统

  上面已经提到了一点,就是说FlexCAN有一段固定的RAM空间专门用来存放收发的报文,我个人姑且将这段RAM称作为MB系统,为啥叫系统呢,因为它的结构是可变的,是根据相关配置而变化的,下面详细说说。

3.1.1 正常模式下

  正常模式下,MB系统分成了96个 MB(邮箱)(只有FlexCAN0有96个,FlexCAN1,FlexCAN2有64个,FlexCAN3,FlexCAN4,FlexCAN5有32个的,换句话说就是每个FlexCAN模块的RAM空间大小不一样),像这样的邮箱我们姑且称其为标准x邮箱,每个标准x邮箱的结构如下:
在这里插入图片描述
  邮箱各部分作用介绍如下:

① CODE :邮箱状态编码。用于记录邮箱当前状态以及消息匹配,仲裁过程也会使用到该字段。邮箱用作接收或发送时该字段的含义不同。

  当用作接收邮箱时CODE 的值与邮箱状态对应关系如下:

CODE 值(二进制)邮箱状态描述
0b0000: INACTIVE邮箱没有被启用。不会接收任何内容。
0b0100: EMPTY当前邮箱为空。
0b0010: FULL当前邮箱为满。
0b0110: OVERRUN当前邮箱溢出。
0b1010: RANSWER接收到远程请求帧。
CODE[0]=1FlexCAN 正在更新邮箱, CPU 不能访问。
  当邮箱收到消息或者收到的消息被处理, FlexCAN 会自动更新 CODE 字段的值。 我们可以通过读取该字段的值得知当前邮箱状态。

  当邮箱用作发送邮箱时 CODE 的值与邮箱状态对应关系如下所示:

CODE 值(二进制)邮箱状态描述。
0b1000:INACTIVE邮箱闲置,未启用。
0b1001:ABORT停止状态,此时邮箱不参与发送仲裁。邮箱里的内容不会被发送。
0b1100:DATA无条件执行数据帧传输,传输完成之后 返回到非活动状态。
0b1100:REMOTE当前邮箱为远程请求帧, FlesCAN 将会无条件的执行发送,并且发送完成后该邮箱自动设置为具有相同 ID 的空接收邮箱。
0b1110:TANSWER当远程请求匹配时,该邮箱将无条件发送一个响应帧,发送完成后将自动返回到 RANSWER 状态。

② SRR 字段、 IDE 字段、 RTR 字段、ID字段、Byte字段以及 DLC 字段为CAN协议里的东西,这里不再赘述。

③TIME STAMP 字段,在 FlexCAN 模块内部拥有一个 16 位自由运行计数器。当FlexCAN 从 CAN 总线上检测到与该邮箱匹配的标识符后采样定时器的计数值保存到该字段。使用到该字段时将会详细介绍。

④PRIO 字段, PRIO 是 priority 前四个字母, 用于设置发送邮箱本地优先级(该功能需要激活),如果邮箱作为接收邮箱则该位不起作用。

3.1.2 激活了CAN FD情况下

  激活了CAN FD后,MB系统也分成了若干个 MB(邮箱), MB(邮箱)的结构如下:
在这里插入图片描述
  可以看出跟上面的标准x邮箱大部分都是相同的,不同的地方都是经典CAN和CAN FD协议不同造成的,这里也就不多做赘述了。

  可以看到上面我说了若干个,为啥这里要用若干个呢,因为数量是变化的,都知道CAN FD的数据负载数是可以变化,但是这段RAM的大小是固定的,所以就有了一个此消彼长的结果。MB系统中,把正常模式下每32个MB分成一个block,每个block的数据长度和MB数量的对应关系如下:

正常情况下CAN FD 8byteCAN FD 16byteCAN FD 32byteCAN FD 64byte
323221127

3.1.3 激活了Legacy RX FIFO情况下

  激活了Legacy RX FIFO之后,MB的结构就会大变,变成了一个RX_FIFO+FILTER+标准x邮箱的组合情况,其中RX_FIFO+FILTER结构如下:
在这里插入图片描述
  激活之后,首先在正常模式下前6个标准x邮箱的所处的RAM就变成了深度为6个RX FIFO,再往后就变成了Filter表元素,而这个Filter表元素数量是可以通过RFFN[3:0]设置的,最大可支持128个,最小8个,而每4个Filter表元素就会占用一个标准x邮箱的空间。举个例子,我使能Legacy RX FIFO之后,如果只激活了8个Filter表元素,那么整个Legacy RX FIFO就会占用前(6+8/2=8)标准x邮箱的RAM空间,那么可用的标准x邮箱个数就为(96-8)个;如果激活了128个Filter表元素,那么就会占用前(6+128/4=38)标准x邮箱的RAM空间,那么可用的标准x邮箱个数就为(96-38)个。

  那么就有人问了,那如果是CAN FD咋办呢?嘿嘿,实话实说,这种模式下就不支持CAN FD,换句话说,CAN FD和Legacy RX FIFO不能共存。

3.1.4 激活了Enhanced RX FIFO情况下

  NXP为了解决CAN FD和Legacy RX FIFO不能共存的问题,就在之前FlexCAN的基础上增加了一个Enhanced RX FIFO的功能,这个FIFO就支持CAN FD,可能这个功能比较贵,S32K3只有FlexCAN0有这个功能。Enhanced RX FIFO结构如下:
在这里插入图片描述
  相比较Legacy RX FIFO,除了相关协议不同之外,最大的不同就是少了Filter 表元素,细心的小伙伴可能还发现了一个重要的一点就是偏移地址变了,好,立即推:Enhanced RX FIFO没有使用MB系统的那段RAM空间,这是两段不同的RAM空间。虽然不一样,但是这两个FIFO同一时间只能使用一个。

  那么就有人问了,这两种FIFO最大的区别是啥,最大的区别就体现在两者对DMA的支持情况,如下表所示:
在这里插入图片描述

3.2 过滤机制

  FlexCAN提供了强大的过滤机制来对总线上的报文进行过滤,只有通过过滤的报文才能成功的被接收。

  过滤机制的原理就是通过设置过滤器的ID(29bit),RTR(1bit),IDE(1bit),通过这三个特征来进行过滤,这3个特征加在一起31bit ,总共31个眼睛,再配合MASK来进行过滤,何谓MASK,你可以理解成是一块遮羞布,是用来遮那31个眼睛的遮羞布,31块布随便你怎么遮,遮住的部分don’t care, 没有遮住的部分需要检测,一旦不同,就忽略报文,只有当没有遮住的眼睛全部检查后的报文才能被接收(也或者理解成一个与门,将31bit & MASK)。

  而这个过滤机制也是得分成几种情况:

3.2.1 标准x邮箱的过滤器

  这种情况下,过滤器就是每个接收邮箱MB的中的ID,RTR,IDE,之后又根据Individual MASK有无激活分成两种情况。
①未激活状态下,那么除了14号,15号邮箱之外有自己的个人MASK,其余的接收邮箱则共用一个Global MASK。
②激活状态下,所有的接收邮箱都会有自己的Individual MASK。

3.2.2 Legacy RX FIFO的过滤器

  Legacy RX FIFO的过滤器其实在介绍Legacy RX FIFO结构就已经介绍过了,它的过滤器就是上面所说的Filter表元素,每一个Filter表元素占32bits,它根据配置会有A,B,C三种形式,这三种形式不能共存,三种结构如下:
在这里插入图片描述
  A形式就是一个完整的RTR+IDE+Standard ID,B形式就是两个完整的RTR+IDE+Standard ID或者一个完整的RTR+IDE+extended ID,而C形式就是4个ID片。那么它的MASK在哪里呢,这里比较特殊,如下图所示:
在这里插入图片描述
  可以看到在这种情况下,每个Filter表元素的MASK是变化的,举个例子,如果我们设置了128个Filter表元素,那么前32个Filter表元素有自己的Individual MASK,其余的Filter表元素则共用一个Global MASK。

3.2.3 Enhanced RX FIFO的过滤器

  上面我们说到 Enhanced RX FIFO是个独立的部分,所以其过滤器也稍微有点不同。 Enhanced RX FIFO的过滤器则通过ERFFELn寄存器来实现的,总共有128个ERFFELn寄存器,而这128个寄存器则可以配置成两种类型,分别为Standard ID类型和Extended ID类型,这两种类型可以同时存在,两种类型又都有三种模式。

Standard ID类型中,每个过滤器占用32bit,即占用一个ERFFELn寄存器,三种模式分别如下:

①传统Filter+MASK组合
在这里插入图片描述
需满足条件:

  1. CAN message is base frame format (IDE = 0)
  2. (ID[n] = STD ID filter [n]) or (STD ID Mask[n] =0)
  3. (RTR = RTR Filter) or (RTR MASK = 0)

②一个ID Fliter范围
在这里插入图片描述
需满足条件:

  1. CAN message is base frame format (IDE = 0)
  2. (ID ≥ STD ID Filter1) & ( ID ≤ STD ID Filter2)
  3. (RTR = RTR filter) or (RTR MASK = 0)

③两个固定的ID Fliter
在这里插入图片描述
需满足条件:

  1. CAN message is base frame format (IDE = 0)
  2. (ID[n] = STD ID Filter1[n]) or (ID[n] = STD ID Filter2[n])
  3. (RTR = RTR Filter1) or (RTR = RTR Filter2)

  至于Extended ID区域则是相同的,唯一的不同就是每个过滤器会占用64bit,即占用两个ERFFELn寄存器,这里就不多做介绍了。

3.3 匹配机制

  前面介绍了FlexCAN强大的过滤机制,那么我们再来看看在这个强大过滤机制下的匹配机制。
  匹配的基本过程就是根据MB的序号,从小到大一个一个匹配,直到匹配成功,并将数据移入MB。这里举几个现象,就非常清楚了。

  1. 如果2个邮箱有相同的Filter配置且都是空邮箱,那么小序号邮箱匹配成功。
  2. 如果2个邮箱有相同的Filter配置且其中一个为空邮箱一个为满邮箱,则空邮箱匹配成功。
  3. 如果4个邮箱(MB0,MB1,MB2,MB3)有相同的Filter配置且都不为空,那么如果新的消息来了则会覆盖MB0或者MB3,即覆盖第一个或者最后一个(可设置)。
  4. 如果同时使能了RX_FIFO和接收型标准x邮箱,则可以通过设置来决定先匹配FIFO还是先匹配接收型标准x邮箱
  5. 在非FIFO情况下,可以将多个接收型标准x邮箱的Filter设置相同,来实现一个接收队列,在很短时间内接收多个报文。

  至于其他的什么仲裁机制,什么数据同步机制,什么发送机制等等机制对于我们的使用影响不大,在这里就不多介绍了,感兴趣的小伙伴可以去S32K3的RM手册上找到相关介绍。

4 CAN MCAL配置

  下面说一点MCAL配置CAN的几点注意事项。

4.1 时钟源的选择

  对于CAN时钟源的选择配置为:
在这里插入图片描述
  CAN的时钟源来源有三个:在这里插入图片描述

  时钟源的选择上强烈建议选择PLL产生的时钟,即AIPS_PLAT_CLK,其中FXOSC_CLK为外部晶振16M太慢,FIRC_CLK为内部RC振荡器,精度太差,对于CAN FD应用来说可能会产生错误,所以要选择AIPS_PLAT_CLK。

  还有一点需要注意的,不要忘记在Mcu模块中的McuModeSettingConf->McuPeripheral中使能相应外设的时钟。

4.2 波特率的设置

  对于经典CAN来说,波特率的配置如下:
在这里插入图片描述
  波特率计算方式如下:
baud = AIPS_PLAT_CLK/ Prescaller / ( SynchronizationSegment + PropagationSegment + PhaseSegment1 + PhaseSegment2)。

  其中采样位置计算为:
position = 1 - (PhaseSegment2 / ( SynchronizationSegment + PropagationSegment + PhaseSegment1 + PhaseSegment2)* 100%)

  CAN FD数据速率的计算方式和上面相同。
在这里插入图片描述

4.3 Can ID Message Type

在这里插入图片描述
  对于接收邮箱的配置,如果Can ID Message Type 设置成MIXED,那么程序则会将邮箱初始化成extended。
  还有一点非常重要,对于用MCAL配置CAN邮箱的种类,它的配置代码里面有一个强制写MASK的操作,它会强制使能IDE位的检查,所以在MACL的配置中,同一个邮箱不能同时支持接收扩展帧和标准帧,该说法在FIFO激活后同样适用。

4.4 Polling vs Interrupt

  在MCAL中配置TX和RX方式的时候有关于polling和interrupt的选择,如下图:
在这里插入图片描述
  polling就是程序去一直轮询标志位去判断发送和接收的状态,interrupt则是通过中断去实现。
  如果设置成polling方式则不需要额外的配置,如果配置成interrupt,则还需要在EB工程的去配置Platform模块来激活相关中断号和服务函数。如下图所示:

  1. 激活中断配置
    在这里插入图片描述
  2. 使能相应中断
    在这里插入图片描述
  3. 注册中断服务函数
    在这里插入图片描述
      这样配置完,CAN才能正常工作。

4.5 使能FIFO

  如果要使能FIFO的话,就非常简单了,只需要在之前配置原有的基础上打开FIFO即可,如下:
在这里插入图片描述
  然后根据自己的需求选择相应的FIFO类型,其中Legacy FIFO是不支持CANFD的,Enhanced FIFO支持CANFD。

4.6 DMA+CAN

  如果需要使用DMA的话,有以下几个限制:

  1. 只有在使能FIFO的情况下,才能使用DMA来接收数据。
  2. 发送是不能使用DMA的,而且在使用DMA后,发送则必须使用中断的方式。

  首先得使能FIFO,使能FIFO的步骤在上面已经提过了。打开FIFO后,则需要指定DMA通道,DMA通道则需要在Mcl模块中进行配置:
在这里插入图片描述
  这里的Interrupt Callback一定要使用特定的名称,如下图描述:
在这里插入图片描述
  指定DMA通道触发源:
在这里插入图片描述
  最后再去Platform处注册相应DMA通道的中断服务函数:
在这里插入图片描述
  注意:这里还有一点很重要,就是如果你使能了D_CACHE的话,还需要去修改一下优化选项如下图:
在这里插入图片描述
不要勾选Data sections这个选项。这样才能让相关变量定义到no cache区域中。

4.7 Filter的配置

4.7.1. 标准邮箱的Filter配置

在这里插入图片描述
  根据上面的介绍,标准邮箱的filter只有一种形式,这样配置的结果就是:只有0x11110~0x1111F的ID报文才会被这个邮箱接收。如果Mask填写成0x1ffffff, 则只有0x11111的ID报文才会被接收。

4.7.2. Legacy FIFO的Filter配置

  Legacy FIFO的Filter形式有三种类型,关于选择哪一种Filter,则需要在下图处选择:
在这里插入图片描述
①一个完整的filter+mask(FORMAT_A)
  原理与标准邮箱的Filter配置相同,不多做赘述了。

②两个14bit的ID片段+mask(FORMAT_B)
③四个8bit的ID片++mask(FORMAT_C)
  这两种情况用的不多,也不建议大家使用,在这里就不介绍了。

4.7.3. Enhanced FIFO的Filter配置

  Enhanced FIFO的Filter形式有三种类型,关于选择哪一种Filter,则需要在下图处选择:
在这里插入图片描述

①传统Filter+MASK组合(MASK_FILTER_SCHEME)
在这里插入图片描述
  原理与标准邮箱的Filter配置相同。

②一个ID Fliter范围
在这里插入图片描述
  只有0x110 ~ 0x11f的ID报文才会被接收,只有0x100100100 ~ 0x1001001F的ID报文才会被接收。

③两个固定的ID Fliter
在这里插入图片描述
  只有0x110,0x111,0x112,0x113这四个ID报文才会被接收。

5 CAN MCAL例程下载

S32K3_RTD1.0.0_MCAL4.4_FlexCAN_Example.7z

END

  • 65
    点赞
  • 261
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 40
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小猫爪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值