小猫爪:i.MX RT1050学习笔记26-RT1xxx系列的FlexCAN详解

1 前言

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

2 FlexCAN简介

  CAN的基本协议在这里就不多说啥了,网上资料巨多,随便搜一搜就有了。

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

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

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

2.1 MB(邮箱)系统

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

2.1.1 正常模式下

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

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

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

CODE 值(二进制)邮箱状态描述
0b0000: INACTIVE邮箱没有被启用。不会接收任何内容。
0b0100: EMPTY当前邮箱为空。
0b0010: FULL当前邮箱为满。
0b0110: OVERRUN当前邮箱溢出。
0b1010: RANSWER接收到远程请求帧。
CODE[0]=1b1FlexCAN 正在更新邮箱, 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 前四个字母, 用于设置发送邮箱本地优先级(该功能需要激活),如果邮箱作为接收邮箱则该位不起作用。

2.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

2.1.3 激活了RX FIFO情况下

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

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

  还有人关心CAN在各种模式下对DMA的支持情况,如下表显示:
在这里插入图片描述

2.2 过滤机制

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

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

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

2.2.1 标准x邮箱的过滤器

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

2.2.2 RX FIFO的过滤器

  RX FIFO的过滤器其实在介绍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。

2.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设置相同,来实现一个接收队列,在很短时间内接收多个报文。

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

3 参考示例

  至于FlexCAN的使用,大家可参考NXP官方的SDK包示例,里面有几个经典的示例,大家自行参考,如下图:
在这里插入图片描述

  另外我还搞到了一手内部资料,香香的,由NXP资深大拿Const Yu写的一些SDK里没有的例子,主要是CAN FD,结合MASK,结合DMA使用的一些例子(基于RT1170,但是RT1xxx的FlexCAN是一样的,是同用的,所以其他RT1xxx芯片是可以参考的),如下:
在这里插入图片描述
下载地址:
RT1170_CAN_Demo.7z

END

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
s32ksdkcan组件详解:canpal-flexcan是一种用于s32k系列芯片的CAN(Controller Area Network)组件,用于实现CAN总线通信。下面将详细介绍canpal-flexcan的使用和原理。 canpal-flexcan的使用是通过s32k芯片上的FLEXCAN(Flexible Controller Area Network)模块实现的。FLEXCAN模块是一个完全兼容CAN2.0B标准的硬件模块,其中包含了CAN控制器和CAN收发器。 可以通过canpal-flexcan组件来配置和控制FLEXCAN模块的工作方式。首先,我们需要使用canpal-flexcan提供的API函数来初始化FLEXCAN模块,包括设置波特率、模式、中断、滤波器等。然后,我们可以使用canpal-flexcan提供的API函数来发送和接收CAN帧。 canpal-flexcan的原理是基于CAN协议的工作原理。CAN协议是一种串行通信协议,它使用了非归零编码(NRZ)和差分信号传输来实现高速、可靠的通信。CAN协议中使用了标识符来识别不同的消息,并使用了帧格式来定义消息的结构。 FLEXCAN模块将CAN协议的物理层和数据链路层功能集成在一起,通过硬件实现CAN消息的发送和接收。FLEXCAN模块包含了一个CAN控制器,负责管理发送和接收的缓冲区和过滤器,以及一个CAN收发器,负责将CAN数据转换成差分信号进行传输。 在发送CAN帧时,canpal-flexcan将CAN帧的数据、标识符等信息写入FLEXCAN模块的发送缓冲区,然后通过CAN收发器将数据转换成差分信号进行传输。在接收CAN帧时,canpal-flexcan从FLEXCAN模块的接收缓冲区中读取数据和标识符,并进行解析和处理。 总之,canpal-flexcan是s32k系列芯片中用于CAN总线通信的组件,通过配置和控制FLEXCAN模块的工作方式来实现CAN消息的发送和接收。可以根据CAN协议的工作原理来理解canpal-flexcan的使用和原理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小猫爪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值