IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 如何使用KEA128的CANID滤波功能 -> 正文阅读

[嵌入式]如何使用KEA128的CANID滤波功能


前端时间有做PTC的客户咨询KEA128的CAN ID滤波功能,当时由于太忙,只是帮助客户一起过了下参考手册相关章节,没有给出相关的示范例程,客户增加滤波功能的过程也有些磕磕绊绊。最近正好有空,详细描述下KEA128的CAN ID滤波功能以及注意点,同时提供下示范例程。

相比S32K1系列的FlexCAN模块,KEA128的MSCAN模块在功能上弱不少,但是对于CAN要求不高的产品,MSCAN模块还是能够胜任的。并且,KEA128相比同Flash大小的S32K116,在最近这段缺货的时间,供应更稳定些。

1.KEA128和S32K116的CAN模块对比

如下是KEA128和S32K116的CAN模块的简单对比:

芯片型号KEA128S32K116
外设名称MSCANFlexCAN
是否支持CAN FD只支持Bosch CAN 2.0A/BISO和non-ISO的CAN FD都支持
CAN报文缓存方式5级FIFO,5个MB交替映射单个存储器区域32个MB均有独立的地址
CAN报文ID过滤方式2个32bit或者4个16bit或者8个8bit每个MB可独立设置掩码,也可设置全局掩码
CAN发送和接收是否共用发送为3级缓存,接收为5级缓存,分开使用每个MB即可配置用于发送,也可配置用于接收

需要说明的是,如果S32K1使能了RX FIFO功能的话,滤波表ID可以是32bit,也可以是16bit或8bit,类似于KEA128。

在介绍两颗芯片的CAN ID滤波功能之前,先简单回顾下CAN报文的格式,了解这个,对CAN ID滤波的理解会更深入。

CAN报文格式

CAN通信帧类型有5种,分别为数据帧、远程帧、错误帧、过载帧和帧间隔。这里只介绍下数据帧和远程帧。

1.1 数据帧

数据帧的仲裁段以及控制段结构如下:

image-20220126004343394

image-20220126004531989

由上图可知,数据帧中和帧ID、SRR、RTR、IDE等相关的为仲裁段和控制段,其中:

  • 标准帧中该组成部分为ID[0:10]+RTR(显性)+IDE(显性)+r0(隐性)+DLC
  • 扩展帧中该组成部分为ID[0:10]+SRR(显性)+IDE(隐性)+ID[11:28]+RTR(显性)+r1(隐性)+r0(隐性)+DLC

1.2 远程帧

远程帧相比数据帧,去掉了数据段,结构如下:

image-20220126010025688

和数据帧的对比如下:

帧类型数据帧远程帧
帧ID发送节点的ID被请求发送节点的ID
SRR位0(显性电平)1(隐性电平)
RTR位0(显性电平)1(隐性电平)
DLC发送数据长度请求的数据长度
是否由数据段
CRC校验范围帧起始+ 仲裁段+控制段+ 数据段帧起始+ 仲裁段+控制段

2.S32K116的CAN ID滤波功能介绍

2.1 功能特性介绍

S32K116不同于S32K144,只有一路CAN,且支持CAN FD,如果用作普通CAN的话,既数据段最多8个字节,那么有32个MB(MessageBuffer)可用,地址如下:

image-20220125160757286

此时一个MB占用16个字节,结构如下:

image-20220125161746171

同时,对于ID滤波的掩码,可以使用全局掩码寄存器RXMGMASK设置,MB14和MB15不受全局影响,需要用RX14MASKRX15MASK进行设置。也可以使用独立掩码寄存器RXIMR0RXIMR31进行设置。具体采用哪一种方式,由模块配置寄存器MCR[IRMQ]确定。

上面的描述适用于未使能RX FIFO的情况。如果使能了FIFO,CAN报文接收缓存使用FIFO结构,如下图所示:

image-20220125164251335

  • MB0-5被用作FIFO,且只有MB0对应的地址是可读的,MB1-5对应的地址对用户不可见,作为FIFO的引擎。
  • MB6-37用作ID过滤表,做多可以配置为128个A类帧ID(占用32bit),256个B类帧ID(16bit),512个C类帧ID(8bit)image-20220125164457290

2.2 匹配过程介绍

当S32K116接收到一帧CAN报文时,该CAN报文会先存储在一个隐藏的辅助MB中,称为Rx SMB,其结构和正常MB一样。然后进行CRC校验,接着进行ID的匹配,如果没有检测到CAN错误,会将报文从SMB传输到ID匹配的FIFO或者MB中。

S32K1的SDK对于掩码配置有现成的API函数调用,如下所示,感兴趣的读者可以自行研究。后文就不介绍相应的示范例程了。

image-20220125174804781

3.KEA128的CAN ID滤波功能介绍

3.1接收缓冲区介绍

KEA128只有1路CAN,符合Bosch CAN 2.0A/B标准,不支持CAN FD,内部有5个报文接收缓冲区(采用5级FIFO存储方式)被交替地映射入单个存储器区域,如下图所示:

image-20220125180155031

每个接收缓冲区在存储器映像中分配15个字节(发送缓冲区会多一个TBPR,分配16个字节),其中包含一个13字节的数据结构,主要用来存储CAN控制位、标识符(标准或扩展)、数据内容等信息,结构如下图:

image-20220125181904466

相应的,

  • REIDR0-3用来存放仲裁段的扩展ID
  • RSIDR0-1用来存放仲裁段的标准ID,和REIDR0-1占用相同地址
  • REDSR0-7用来存放数据段的payload
  • RDLR用来存放DLC

上图只显示了接收缓冲区在存储器映像中分配的13个字节,还有2个字节对应的寄存器分别是RTSRHRTSRL,用来存储一个特殊的16位时间标志,具体用途笔者不太了解,没见客户使用过。

3.2 ID滤波器介绍

KEA128的ID滤波器类似于S32K1系列使能Rx FIFO之后的ID滤波表,不过数量很少,通过配置寄存器CANIDAC->IDAM可选择2个32位ID滤波器,或者4个16位ID滤波器,或者8个8位滤波器,或者封闭式滤波器(没有报文通过过滤器)。下面详细说明下这三种情况下的滤波方式。

3.2.1 32位ID滤波器

当配置成2个32位ID滤波器时,每个ID滤波器都可以用来验收:

  • 完整的扩展帧ID以及RTR,IDE和SRR位
  • 或完整的标准帧ID以及相关的RTR位和IDE位。

第一个滤波器组(CANIDAR0-CANIDAR3,CANIDMR0-CANIDMR3)的具体滤波方式如下图,第二个滤波器组(CANIDAR4-CANIDAR7,CANIDMR4-CANIDMR7)的滤波方式类似:

image-20220125202241924

由上图可以看出,标识符验收寄存器CANIDARn和标识符屏蔽寄存器CANIDMRn中的每一位与接收扩展标识符寄存器REIDR0-3或接收标准标识符寄存器RSIDR0-1一一对应,所以需要理清接收扩展标识符寄存器和接收标准标识符寄存器每一位的具体含义。上图这部分描述不够清新,我重新整理了下,如下图所示:

image-20220126135732566

当后台接收缓冲区(RxBG)接收到一帧报文时,按如下方式进行逐位检查,

  • 如果CANIDMRn的某一位设置为1时,表示报文ID对应位不和CANIDARn对应位进行比较,即这一位可以是0或1。
  • CANIDMRn某一位设置为0时,表示报文ID对应位和CANIDARn对应位需要相同。

当标识符的所有位都满足要求且没有违反CAN协议的错误,MSCAN会将RxBG的内容移入FIFO,同时置位RXF(接收器完整标志)并生成接收中断给CPU,接着用户从RxFG读取接收的报文,同时复位RXF以应答中断和释放前台缓冲器。如果RxBG的报文不满足过滤器要求或者违反CAN协议,该报文不会移入FIFO,当下一帧报文过来时,会将其覆盖。

如果不希望接收到远程帧,需要将CANIDMRn中的SRR位和RTR位设为0,CANIDMRn中对应位置也设为0。如果不希望接收扩展帧,则设置下IDE位。

如果使用场合需要同时处理标准帧和扩展帧,且CAN ID不多,建议选择此种方式。

3.2.2 16位ID滤波器

当配置成4个16位ID滤波器时,每个ID滤波器都可以用来验收:

  • 扩展帧ID的最高14位以及IDE和SRR位
  • 或完整的标准帧ID以及相关的RTR位和IDE位。

前2个滤波器组(CANIDAR0-CANIDAR3,CANIDMR0-CANIDMR3)的具体滤波方式如下图,后2个滤波器组(CANIDAR4-CANIDAR7,CANIDMR4-CANIDMR7)的滤波方式类似:

image-20220126003411882

如果使用的场合中需要接收的标准CAN ID比较多,且不需要处理扩展CAN ID,建议选择16位ID滤波器。

3.2.3 8位ID滤波器

当配置成8个8位ID滤波器时,每个ID滤波器都可以用来验收:

  • 扩展帧ID或标准帧ID的前8位

前4个滤波器组(CANIDAR0-CANIDAR3,CANIDMR0-CANIDMR3)的具体滤波方式如下图,后4个滤波器组(CANIDAR4-CANIDAR7,CANIDMR4-CANIDMR7)的滤波方式类似:

image-20220126003541919

笔者支持的客户中,没遇到过使用8位ID滤波器的方式,不推荐使用。

4.KEA128的CANID滤波功能测试

一般使用KEA128的汽车电子产品,需要接收的CAN ID比较少,所以比较常见的过滤方式是分配成两个2个32位ID滤波器,一个用来接收标准ID,一个用来接收扩展ID。下面基于前文《如何使用S32DS for ARM 2.2正常运行KEA官方例程》提分享的KEA128的CAN例程进行修改,从而滤波器配置的相关测试。

4.1环境搭建

  • 开发板:FRDM-KEAZ128
  • CAN总线调试工具:USBCAN-E-mini
  • 开发环境:S32DS for ARM 2.2

4.2软件配置

首先打开自带的例程,重命名为mscan_id_filter_kea128,本身该CAN例程包含两个接收数据帧的函数,如下图所示:

image-20220127120018950

  • Demo_Receive_DataFrame使用软件滤波的方式,只接收ID符合msCANID.h文件中宏定义设置的数据帧。
  • Demo_Receive_DataFrame_Random接收到的数据不进行软件滤波。

下面,我们修改函数Demo_Receive_DataFrame_Random的内部实现,完成相关滤波测试。

4.2.1 完善接收流程

原本例程中函数Demo_Receive_DataFrame_Random实现不了接收所有CAN数据的功能,需要进行下修改。

  1. 开启下msCANcfg.h中的和REAL_TIME_BUFFER_ENABLE相关的宏定义,如下图:
    image-20220127120837713

  2. 增加一个接收数据处理完的标志,在接收中断函数中增加,如下图:

    image-20220127184919399

  3. 然后取消之前的注释,并完善接收流程,部分代码如下。详细工程后面会分享出来。

    image-20220127185353135

  4. 最后在主函数中调用该函数,如下图。至此,该工程可以接收任意的数据帧,并将数据段通过ID为200的标准数据帧发送出来。

    image-20220127185811410

4.2.2 滤波设置

msCANcfg.h文件中已经预设好相关的宏定义用来设置CANIDAR0-7CANIDMR0-7,如下两张图所示:

image-20220127190650848

image-20220127190825482

本次例程计划实现的功能为:只接收ID为0x100的标准数据帧和接收ID为0x100的扩展远程帧,然后将接收到的数据段发送出去。

分析下该种要求,每个寄存器的值如下图:

image-20220127191416728

按照上图,填写宏定义如下两张图:

image-20220127191632182

image-20220127191728969

至此,所有配置完成,下节将展示相关的测试数据。

4.3测试数据

由于使用的例程是用来接收数据帧的,所以接收到远程帧之后存储的数据段数据有误,从而发送出来的数据段数据也有误。

但是本文主要是展示滤波的功能,相关测试数据已体现出该功能,接收远程帧之后回复数据有误的问题可以忽略。

增加滤波配置前:

image-20220127114600885

增加滤波配置后:

image-20220127113021522

5.参考资料

6.例程分享

本文所展示的例程分享如下:

链接:https://pan.baidu.com/s/1QZO8HjK4sl28Ok8P8bZ8Bw
提取码:3gvc

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 12:04:46  更:2022-01-28 12:05:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:26:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码