【以雅特力AT32为例】CAN过滤器及其原理与邮箱配置

个人认为过滤器的本质就是对ID值(局部or全部)的比较。

协议层雅特力跟标准CAN略有不同,详见:【雅特力AT32】 MCU CAN入门指南(超详细)

协议层了解差不多,直接来应用编程实战就好了,CAN实操学习步骤大致如下(个人见解,欢迎讨论,小白有问题可私信):

  1. CANdb++Editor安装包及教程移步:
    【安装手册】CANdb++ Editor
  2. DBC文件如何看懂,怎么使用?做一个就知道了:
    【使用手册】CANdb++Editor:自制一个DBC文件
  3. 雅特力AT32 CAN使用入门:
    【雅特力AT32 CAN】 MCU CAN入门使用指南(超详细)
  4. can数据收发实战:
    【CAN 数据收发实战】上位机ZCANPRO发送+USART打印DBC文件发送的报文信息——以雅特力AT32为例
    【以雅特力AT32为例】CAN过滤器及其原理与邮箱配置
  5. CAN报文解析:
    【DBC报文矩阵分析】读懂.DBC文件报文矩阵,信号矩阵数据解析思路(源码见链接)
    【数据存储】大/小端存储与字节顺序转换函数详解
  6. 解析代码实现移步:
    【CAN报文数据解析】矩阵信号Intel与Motorola格式(C语言)代码
  7. SocketCan 应用编程与Socket网络编程及其相似:
    【CAN 应用编程基础】SocketCan实战
  8. 学完QT,尝试试自己做一个CAN上位机软件,基本掌握CAN;
    【自制 CAN上位机】MY_CAN Tool V1.0 (GitHub开源)

优秀文章参考与推荐见文末。

目录

1.AT32–过滤器

1.1 过滤器的位宽
1.2 过滤器模式

2.AT32过滤器的使用(过滤器工作原理

2.1 过滤器配置结构体参数说明
2.2 过滤器工作原理
2.3 过滤器应用实例

3.AT32收发邮箱(FIFO)

1. AT32–过滤器

在 CAN 协议里,报文的 ID 不代表节点的地址,而是跟报文的内容相关的。

首先,发送者以广播的形式把报文发送给所有的接收者。
其后,节点在接收报文时,根据 ID 的值决定软件是否需要该报文;如果需要,就存到接收 FIFO 里,用户可通过软件读取接收邮箱寄存器获取该报文;如不需要,报文就被丢弃且无需软件的干预。

为满足这一需求,AT32 CAN 控制器为应用程序提供了 28 个硬件过滤器组(AT32F435 系列有 28 个过滤器组,0~27;但 AT32F403A 等系列只有 14 个过滤器组,0~13。具体请参考相应型号的 RM),以便只接收那些软件需要的报文。用户配置好需要的 ID 后,整个过滤过程无需软件参与,不占用CPU 资源。

1.1 过滤器的位宽

每个过滤器组由 2 个 32bit 的寄存器,CAN_FiFB1 和 CAN_FiFB2 组成。

通过配置 CAN_FBWCFG寄存器的 FBWSELx 位,设置 2 个 16 位宽或 1 个 32 位宽的过滤器。

32 位宽的过滤器寄存器 CAN_FiFBx :一组 SID[10:0]、EID[17:0]、IDT 和 RTR 位。
16 位宽的过滤器寄存器 CAN_FiFBx :两组 SID[10:0]、IDT、RTR 和 EID[17:15]位。
1.2 过滤器模式

通过设置 CAN_FMCFG 寄存器的 FMSELx 位可以设置过滤器寄存器工作在标识符掩码模式或者标识符列表模式

掩码模式:用来指定 ID 的哪些位需要与预设 ID 相同,哪些位无需比较;第一步:首先准备好一张表,把需要关注的所有CAN报文ID写上去;第二步:过滤对比次表,如果接收报文ID与表相符则通过,没有则不通过。列表模式:用来表示 ID的每个位都必须与预设 ID 一致。第一步:获取想进城的人的身份证号码;第二步:只看获取到身份证的第7~9位,其他位忽略;第三步:将忽略后的结果与1156进行比较;第四步:比较结果相同则通过,不同则不能通过。

两种模式与过滤器位宽配合使用,可以有以下四种过滤方式:

在这里插入图片描述

加强理解:验证码与屏蔽码

在这里插入图片描述

掩码模式的过滤器计算逻辑为:

ID码: 0110 0110 	 // 0x66
掩码: 0101 0101 	// 0x55
计算结果:
x1x0  x1x0		  // ...
0100 0100-0x44;
0100 0110-0x46;
0100 1100-0x4b;
0100 1110-0x4e;
0110 0100-0x64;
0110 0110-0x66;
0110 1100-0x6c;
0110 1110-0x6e;
1100 0100-0xc4;
1100 0110-0xc6;
1100 1100-0xcc;
1100 1110-0xce;
1110 0100-0xe4;
1110 0110-0xe6;
1110 1100-0xec;
1110 1110-0xee;
这些结果都是可以通过过滤器的。
2. AT32过滤器的使用(过滤器工作原理)
2.1 过滤器配置结构体参数说明
typedef struct
{confirm_state filter_activate_enable;  /*!< 用于启用或禁用过滤器激活.*/can_filter_mode_type filter_mode;      /*!< 用于配置过滤器模式,可以是掩码模式或列表模式.*/can_filter_fifo_type filter_fifo;      /*!< 用于配置将匹配的帧存储在哪个 FIFO 中. */uint8_t filter_number;                 /*!< 用于配置过滤器编号,范围从 0 到 13. */can_filter_bit_width_type filter_bit;  /*!< 用于配置过滤器的位宽,可以是 16 位或 32 位.*/uint16_t filter_id_high;               /*!< 用于配置过滤器的标识符高位部分. */uint16_t filter_id_low;                /*!< 用于配置过滤器的标识符低位部分. */uint16_t filter_mask_high;             /*!< 用于配置过滤器的掩码或标识符的高位部分. */uint16_t filter_mask_low;              /*!< 用于配置过滤器的掩码或标识符的低位部分. */
} can_filter_init_type;
2.2 过滤器工作原理

网上看了一堆没懂,感觉好多废话,**上面的引入(验证码与屏蔽码)**看懂就没啥问题,过滤器玩来玩去就原理这么两句(红色框):

在这里插入图片描述

重点在于掩码模式:对结构体后四个值filter_id_high\low、filter_mask_high\low的配置;

2.3 过滤器应用实例

典例1:16/32位掩码模式应用实例

以下位16位:

项目要求:过滤出来0x62a-0x62c和0x64a-0x64c的ID
因为是标准ID所以选择16位模式,设置两个过滤器;0x62a - 0000 0110 0010 1010
0x62b - 0000 0110 0010 1011
0x62c - 0000 0110 0010 1100

看到只有低三位不一样,所以:

ID码为: 0000 0110 0010 1000 - 0x628
掩码为: 1111 1111 1111 1000 - 0xff8

设置为掩码模式时:一般我们称R1寄存器为ID寄存器(或者验证码寄存器),R2为掩码寄存器。

在这里插入图片描述

看上图寄存器每一个位的映射关系可看出高11位存的是STID,所以要把掩码和ID移位到对应的位上;

can_filter.filter_list_high  = (uint16_t)(0x628<<5);	//设置接受地址为0x628-0x62f的数据
can_filter.filter_mask_high  = (uint16_t)(0xfff8<<5);	//

同样的,过滤0x64a-0x64c的设置为:

can_filter.filter_list_low   = (uint16_t)(0x648<<5);	//设置接受地址为0x648-0x64f的数据
can_filter.filter_mask_low   = (uint16_t)(0xfff8<<5);	//

由此可见,掩码模式可以过滤掉大部分不想要的ID,但是也会有一些不想要的ID会通过。所以掩码模式的优势和缺点显而易见。
在这里插入图片描述

典例2:试试看!

在这里插入图片描述

典例3:AT32过滤器配置例程

/* extended identifier */
#define FILTER_EXT_ID1                   ((uint32_t)0x18F5F100)
#define FILTER_EXT_ID2                   ((uint32_t)0x18F5F200)
#define FILTER_EXT_ID3                   ((uint32_t)0x18F5F300)/* standard identifier */
#define FILTER_STD_ID1                   ((uint16_t)0x04F6)
#define FILTER_STD_ID2                   ((uint16_t)0x04F7)
#define FILTER_STD_ID3                   ((uint16_t)0x04F8)
/* can filter 0 config:对拓展帧的处理 */can_filter_init_struct.filter_activate_enable = TRUE;				//激活/失能can_filter_init_struct.filter_mode = CAN_FILTER_MODE_ID_LIST;		//列表/掩码ID模式can_filter_init_struct.filter_fifo = CAN_FILTER_FIFO0;			//FIFOcan_filter_init_struct.filter_number = 0;							//编号can_filter_init_struct.filter_bit = CAN_FILTER_32BIT;				//位宽can_filter_init_struct.filter_id_high = (((FILTER_EXT_ID1 << 3) >> 16) & 0xFFFF);   /* extended identifier is 29 bit */can_filter_init_struct.filter_id_low = ((FILTER_EXT_ID1 << 3) & 0xFFFF) | 0x04;can_filter_init_struct.filter_mask_high = ((FILTER_EXT_ID2 << 3) >> 16) & 0xFFFF; /* extended identifier is 29 bit */can_filter_init_struct.filter_mask_low = ((FILTER_EXT_ID2 << 3) & 0xFFFF) | 0x04;can_filter_init(CAN1, &can_filter_init_struct);/* can filter 1 config:对标准帧的处理 */can_filter_init_struct.filter_activate_enable = TRUE;can_filter_init_struct.filter_mode = CAN_FILTER_MODE_ID_LIST;can_filter_init_struct.filter_fifo = CAN_FILTER_FIFO0;can_filter_init_struct.filter_number = 1;can_filter_init_struct.filter_bit = CAN_FILTER_32BIT;can_filter_init_struct.filter_id_high = FILTER_STD_ID1 << 5;  /* standard identifier is 11 bit */can_filter_init_struct.filter_id_low = 0;can_filter_init_struct.filter_mask_high = FILTER_STD_ID2 << 5;/* standard identifier is 11 bit */can_filter_init_struct.filter_mask_low = 0;can_filter_init(CAN1, &can_filter_init_struct);
3. AT32收发邮箱(FIFO)

AT32只有发送邮箱有优先级配置,接收邮箱主要起一个缓存存储的作用,后续以发送邮箱为主介绍。

详细见:【雅特力AT32 CAN】 MCU CAN入门使用指南(超详细)-CSDN博客

在这里插入图片描述

CAN 发送流程见下图 10 和以下的步骤:

在这里插入图片描述

下图 10 中标志位和操作位说明如下:

在这里插入图片描述

★★★其他优秀讲解推荐★★★

真正让我搞清楚过滤器high/low规则:

☆CAN的过滤器设置☆、[关于CAN过滤器的一些设置方法 - WCH_CH32 - 博客园 (cnblogs.com)](https://www.cnblogs.com/wchmcu/p/17170782.html#:~:text=可过滤出一个标识。,此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。 注意:CAN_FilterIdHigh是指高16位CAN_FilterIdLow是低16位应该将需要得到的帧的和过滤器的设置值左对齐。)

CAN收发及波特率配置、过滤器与邮箱的配置与使用:

工业协议 专栏: CAN总线(二) 、 CAN总线的过滤器与邮箱(四)

e=blogcolumn&sharetype=blogcolumn&sharerId=11201295&sharerefer=PC&sharesource=Thmos_vader&sharefrom=from_link) 专栏: CAN总线(二) 、 CAN总线的过滤器与邮箱(四)

CAN小知识 专栏: STM32 CAN过滤器详解 、 RMer:CAN通信配置过滤器和使用三个邮箱发送

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/452225.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从一个事故中理解 Redis(几乎)所有知识点

作者&#xff1a;看破 一、简单回顾 事故回溯总结一句话&#xff1a; &#xff08;1&#xff09;因为大 KEY 调用量&#xff0c;随着白天自然流量趋势增长而增长&#xff0c;最终在业务高峰最高点期占满带宽使用 100%。 &#xfeff; &#xfeff; &#xff08;2&#xff…

mysql5.7版本用户管理(user表列信息介绍,本质,管理操作),数据库的权限管理(权限列表,权限操作)

目录 用户管理 介绍 user表 介绍 列信息 Host User *_priv authentication_string 用户管理的本质 操作 创建用户 删除用户 修改用户信息 修改密码 自己修改 root用户修改指定用户的密码 数据库的权限 权限列表 给用户授权 查看权限 回收权限 刷新权限 …

GDAL+C#实现矢量多边形转栅格

1. 开发环境测试 参考C#配置GDAL环境&#xff0c;确保GDAL能使用&#xff0c;步骤简述如下&#xff1a; 创建.NET Framework 4.7.2的控制台应用 注意&#xff1a; 项目路径中不要有中文&#xff0c;否则可能报错&#xff1a;can not find proj.db 在NuGet中安装GDAL 3.9.1和G…

【ARM】ARM中断系统详解——以Cortex-A7为例

一、Cortext-A7中断系统简介 Cortex-A7 也有中断向量表&#xff0c;内核有 8 个异常中断&#xff0c;中断向量表也是在代码的最前面。 看起来A7的中断向量表比STM32F103少很多&#xff0c;这是因为STM32F103使用的Cortex-M系列芯片&#xff0c;中断向量表列举出了一款芯片所有…

React Strict DOM:React Native 通用应用程序的未来

Meta宣布发布了 react-strict-dom。从根本上讲&#xff0c;这将改变我们使用 React Native&#xff08;以及在网页上使用 React&#xff09;的方式。它提供了一套统一的 UI 原语&#xff0c;带有样式&#xff0c;可以在网页和移动设备上通用使用&#xff01;现在&#xff0c;“…

package.json 里的 dependencies和devDependencies区别

dependencies&#xff08;依赖的意思&#xff09;&#xff1a; 通过 --save 安装&#xff0c;是需要发布到生产环境的。 比如项目中使用react&#xff0c;那么没有这个包的依赖就会报错&#xff0c;因此把依赖写入dependencies npm install <package-name>// 缩写 np…

【含文档】基于Springboot+Vue的点餐系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

基于直播美颜SDK的实时美颜平台开发指南

随着直播平台的快速发展&#xff0c;用户对视频质量的要求越来越高&#xff0c;尤其是对于美颜效果的需求。为满足这一市场需求&#xff0c;基于直播美颜SDK的实时美颜平台应运而生。本文将探讨如何开发这样一个平台&#xff0c;助力开发者在激烈的竞争中脱颖而出。 一、理解美…

Dorado7 全局缓存当前登录人信息 localStorage

登录成功时赋值 com.gs.mcf.view/index.js // like12 add,20240906,全局缓存当前登录人信息var currentName view.get(#userNameLb).get(tip);if(window.localStorage){localStorage.setItem("currentName", currentName);} 使用 // like12 add,20240906,全局缓存…

软考(网工)——网络安全

文章目录 &#x1f550;网络安全基础1️⃣网络安全威胁类型2️⃣网络攻击类型 &#x1f551;现代加密技术1️⃣私钥密码/对称密码体制2️⃣对称加密算法总结3️⃣公钥密码/非对称密码4️⃣混合密码5️⃣国产加密算法 - SM 系列6️⃣认证7️⃣基于公钥的认证 &#x1f552;Hash …

Java 入门基础篇15 - java构造方法以及认识新的关键字

一 今日目标 构造方法static关键字代码块math类package关键字import关键字 二 构造方法概述 2.1 构造方法描述 构造方法是一个特殊方法&#xff0c;作用是创建对象&#xff0c;对对象进行初始化。 ​ 如&#xff1a; 对对象中的成员进行初始化值 2.1 构造方法的特征 1、方…

集群与分布式

Cluster(集群)概述 当单独一台主机无法承载现有的用户请求量&#xff1b;或者一台主机因为单一故障导致业务中断的时候&#xff0c;就可以增加服务主机数&#xff0c;这些主机在一起提供服务&#xff0c;就叫集群&#xff0c;而用户所看到的依然是单个的主机&#xff0c;用户并…

DFS算法经典题目: Leetcode 51.N皇后

DFS算法经典题目&#xff1a; Leetcode 51.N皇后 题目详情如下 这道题如果使用暴力解法的话&#xff0c;需要对N个皇后放在每个地方都进行枚举并判断是否可行&#xff0c;时间复杂度非常之高&#xff0c;肯定是过不了的&#xff0c;所以需要使用其他解法。 根据题目可以知道每…

windows 自定义scheme协议。

浏览器打开自定义scheme参考上一篇&#xff1a;Chromium 自定义scheme协议启动过程分析c 1、注册表里面按照如下格式填写自定义scheme协议导入&#xff1a; Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\jdtest] "URL:jdtest Protocol" "URL Proto…

敏捷框架知多少?(上)

前言 在本系列上一篇博文 《敏捷Agile概述&#xff0c;何为敏捷&#xff1f;》 中&#xff0c;我们初步介绍了何为敏捷&#xff0c;敏捷提出的背景和为什么目前得到了广泛的应用。 但敏捷本身&#xff0c;更多只是一种价值观&#xff0c;是一个思想层面的指引。在组织中实际应…

JS | JS之元素偏移量 offset 系列属性详解

目录 一、offset 概述 定位父级 offsetParent 偏移量 offsetWidth offsetHeight offsetLeft offsetTop 计算页面偏移 注意事项 二、offset 与 style 区别 偏移offset 样式style 三、案例 ★ 案例&#xff1a;获取鼠标在盒子内的坐标 ★ 案例&#xff1a;模态框…

工信部绿色工厂、绿色设计产品、绿色供应链企业、绿色园区名单(2017-2022年)

我国工信部积极推动制造业的绿色转型&#xff0c;为了表彰在绿色制造领域取得显著成绩的企业和园区&#xff0c;发布了包括绿色工厂、绿色设计产品、绿色供应链企业、绿色园区在内的一系列公示名单。 2017年-2022年工信部绿色工厂、绿色设计产品、绿色供应链企业、绿色园区名单…

UDP协议讲解

预备知识&#xff1a; 端口号port&#xff1a; 我们在正常网络通信时&#xff0c;实际上是进程在互相通信。 我们所有的网络通信的行为&#xff0c;本质上都是进程间通信。 对双方而言&#xff0c;1.先保证数据能到达自己的机器 ip解决 2.找到指定的进程 端口号 ip地址用来…

Linux部署redis保姆级教程

一、版本说明 Redis版本号&#xff08;本文的版本号是6.2.12&#xff09;的第二位如果是偶数&#xff0c;代表稳定版本&#xff0c;如果是奇数&#xff0c;代表非稳定版本。 所有历史版本下载地址&#xff1a;Index of /releases/ 二、基于压缩包安装&#xff08;推荐&#xff…

【中危】Oracle TNS Listener SID 可以被猜测

一、漏洞详情 Oracle 打补丁后&#xff0c;复测出一处中危漏洞&#xff1a;Oracle TNS Listener SID 可以被猜测。 可以通过暴力猜测的方法探测出Oracle TNS Listener SID&#xff0c;探测出的SID可以用于进一步探测Oracle 数据库的口令。 建议解决办法&#xff1a; 1. 不应该使…