详解CAN通信的标识符掩码和标识符列表两种过滤机制

news2024/9/30 13:21:08

CAN 通信的应用非常广泛,本文不涉及CAN通信的基础配置,重点分析一下STM32和GD32的CAN通信两种ID过滤方式。

首先,不管是STM32还是GD32,实现CAN通信ID过滤的机制和原理一定是一样的,只是用到的寄存器有差别。

1. ID过滤原理:
在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据标识符的值决定软件是否需要该报文。
为满足这一需求,在互联型产品中,bxCAN控制器为应用程序提供了28个位宽可变的、可配置的过滤器组(270);在其它产品中,bxCAN控制器为应用程序提供了14个位宽可变的、可配置的过滤器组(130),以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。

每个过滤器组x由2个32位寄存器,在STM32中是由CAN_FxR0和CAN_FxR1组成。在GD32中是由器CAN_FxDATA0和CAN_ FxDATA1组成。

2. ID过滤方式:
掩码模式、列表模式。
不管是掩码模式还是列表模式,目的肯定都是为了让数据接收方接收特定ID的数据,但是既然分了两种模式,肯定有他们的不同的目的。

3.ID过滤方式1——掩码模式:
在掩码模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。
举个例子:
假如是标准帧模式,以16位宽度为例,预设的ID=0x0001,当期望接收所有ID尾号为1的数据,那么设置对应的掩码为MASK=0x0001即可。
为什么呢?将ID的0x0001和MASK的0x0001解析成2进制:
预设ID:0000 0000 0000 0001;
MASK:0000 0000 0000 0001;
MSAK值的1的位表示:接收的ID必须与预设ID的位一致;
MASK值为0的位表示:接收的ID可以不与预设ID的位一致;
因此示例的MASK仅限制了ID的最后1位与预设ID的最后1为一致即可,其余的位不做限制,只要满足这样形式的ID数据,都能通过示例的过滤机制,从而被接收方正确接收,此处可知,掩码的作用就是要以预设ID为模板,决定过滤掉哪些类型的ID;

也就是说:
为了过滤出一组标识符,应该设置过滤器组工作在掩码模式。

注意,示例选用了标准帧模式,以16位宽度进行过滤,因此原本一个过滤器组的2个32位寄存器就分成了4个16位的空间,分别去保存预设的ID和相应的掩码:
格式如下:
预设ID1:【占用寄存器1的低16位】;
ID1的掩码:【占用寄存器1的高16位】;
同理:
预设ID2:【占用寄存器2的低16位】;
ID2的掩码:【占用寄存器2的高16位】;

由此可知,此种方式下,最多可预设2种ID,可过滤出多个ID;
STM32与GD32的过滤器机制一模一样:
(1)STM32参考手册的16位掩码模式过滤器如下:
在这里插入图片描述
(2)GD32参考手册的16位掩码模式过滤器如下:
在这里插入图片描述

注意,此种模式下,在配置时需要将对应的ID和掩码数据分别写进寄存器的STID区域,如上图所示,在16位空间中,STID区域处于高11位,因此需要将预设ID和掩码数据左移5位后写进寄存器。代码如下:

/**
 * @brief    can外设配置
 * @param    None
 * @retval   返回值
 */
void can_config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	CAN_InitTypeDef CAN_InitStructure;
	CAN_FilterInitTypeDef CAN_FilterInitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

	/*
    CAN1_RX -- PA11
    CAN1_TX -- PA12
    */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	CAN_DeInit(CAN1);
	CAN_StructInit(&CAN_InitStructure);
	CAN_InitStructure.CAN_TTCM = DISABLE; //不生成时间戳
	CAN_InitStructure.CAN_ABOM = ENABLE;  //自动总线关闭管理
	CAN_InitStructure.CAN_AWUM = DISABLE; //自动唤醒模式
	CAN_InitStructure.CAN_NART = DISABLE; //仲裁丢失或出错后的自动重传功能
	CAN_InitStructure.CAN_RFLM = DISABLE; //接收FIFO加锁模式
	CAN_InitStructure.CAN_TXFP = ENABLE;  //传输FIFO优先级
	CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;

	CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
	CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;
	CAN_InitStructure.CAN_BS2 = CAN_BS1_8tq;
	CAN_InitStructure.CAN_Prescaler = 40; // 波特率36000000/18/40 = 50KHz
	CAN_Init(CAN1, &CAN_InitStructure);

	CAN_FilterInit(&CAN_FilterInitStructure);
	CAN_FilterInitStructure.CAN_FilterNumber = 0;
	CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
	CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;
	if (can.device_mode == DEVICE_MASTER) //识别所有0x0xx类型的从设备地址
	{
		CAN_FilterInitStructure.CAN_FilterIdHigh = CAN_ID_BASE_SLAVE << 5; //ID1
		CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x700 << 5;		   //ID1_MASK
		CAN_FilterInitStructure.CAN_FilterIdLow = CAN_ID_DEFAULT << 5;	   //ID2
		CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x7FF << 5;		   //ID2_MASK
	}
	else //仅识别与本设备地址匹配的地址,保证主设备对从设备实现一对一通讯,也识别0x0000广播
	{
		CAN_FilterInitStructure.CAN_FilterIdHigh = can.std_id << 5; //ID1
		CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x7FF << 5;	//ID1_MASK
		CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000 << 5;		//ID2
		CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x7FF << 5;	//ID2_MASK
	}

	CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
	CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
	CAN_FilterInit(&CAN_FilterInitStructure);

	CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); //FIFO0消息挂号中断
	nvic_set(USB_LP_CAN1_RX0_IRQn, IRQ_PRIO_CAN1);
}

4. ID过滤方式2——列表模式:
在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。通俗一点讲就是:接收的ID必须与预设的ID一模一样才能通过过滤,最终被接收到。

举个例子:
假如是标准帧模式,以16位宽度为例,预设的ID=0x0001,当期望仅接收与预设ID一致的数据,那么只要发送的ID与预设ID一样就可以被接收到,其余类型的ID数据都被过滤掉,接收方将接收不到此类数据。

也就是说:
为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。

注意,示例选用了标准帧模式,以16位宽度进行过滤,因此原本一个过滤器组的2个32位寄存器就分成了4个16位的空间,分别去保存预设的ID:
格式如下:
预设ID1:【占用寄存器1的低16位】;
预设ID2:【占用寄存器1的高16位】;
预设ID3:【占用寄存器2的低16位】;
预设ID4:【占用寄存器2的高16位】;

由此可知,此种方式下,最多可预设4种ID,可过滤出4个ID;
STM32与GD32的过滤器机制一模一样:
(1)STM32参考手册的16位列表模式过滤器如下:
在这里插入图片描述
(2)GD32参考手册的16位列表模式过滤器如下:
在这里插入图片描述

注意,此种模式下,在配置时需要将对应的4个ID分别写进寄存器的STID区域,如上图所示,在16位空间中,STID区域处于高11位,因此需要将预设ID数据左移5位后写进寄存器。示例代码如下:

CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;     //??????  
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;    //?????16?  
  CAN_FilterInitStructure.CAN_FilterIdHigh = std_id<<5;  //4???CAN ID?????4????  
  CAN_FilterInitStructure.CAN_FilterIdLow = std_id1<<5;  
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = std_id<<5;  
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = std_id1<<5;  
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;           //?????????FIFO0?  
	CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;//激活过滤器0	

5. 总结一下:
两种过滤方式各有千秋,需要过滤出一组ID,使用掩码模式;
需要过滤出特定的几个ID,使用列表模式。
实际使用中可巧妙地调整预设ID和掩码,甚至组合使用掩码模式和列表模式实现自己想要的过滤效果。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TensorFlow入门(十四、数据读取机制(1))

TensorFlow的数据读取方式 TensorFlow的数据读取方式共有三种,分别是: ①预加载数据(Preloaded data) 预加载数据的方式,其实就是静态图(Graph)的模式。即将数据直接内嵌到Graph中,再把Graph传入Session中运行。 示例代码如下: import tensorflow.compat.v1 as tf tf.disabl…

超好用的IDEA插件推荐!

大家好&#xff0c;Apipost 最新推出IDEA插件V2版本&#xff01;V2版本主要是Apipost 符合更多用户的需求而推出&#xff0c;支持在插件中获取 token、支持代码完成后在插件中进行 API调试 &#xff0c;同时也保留了1.0版本部分功能如上传选择目录功能等。 V1版本还会继续保留…

韦东山D1S板子——xfel工具无法烧写bin文件到spi norFlash问题解决

1、早期问题排查 &#xff08;1&#xff09;参考博客&#xff1a;《韦东山D1S板子——烧录spi norFlash失败问题排查过程》&#xff1b; &#xff08;2&#xff09;早期排查到xfel工具烧写spi norFlash显示成功&#xff0c;但是实际没有烧写进bin文件&#xff0c;怀疑是norFlas…

“揭秘淘宝店铺所有商品接口:一键获取海量热销宝贝信息!“

淘宝店铺所有商品接口可以通过shop id或店铺主链接获取到整店商品&#xff0c;数据包括&#xff1a;商品ID&#xff0c;图片地址&#xff0c;店铺标题&#xff0c;优惠价&#xff0c;价格&#xff0c;销量&#xff0c;宝贝链接等整个店铺的商品。 要使用这个接口&#xff0c;需…

Linux 系统性能瓶颈分析(超详细)

Author&#xff1a;rab 目录 前言一、性能指标1.1 进程1.1.1 进程定义1.1.2 进程状态1.1.3 进程优先级1.1.4 进程与程序间的关系1.1.5 进程与进程间的关系1.1.6 进程与线程的关系 1.2 内存1.2.1 物理内存与虚拟内存1.2.2 页高速缓存与页写回机制1.2.3 Swap Space 1.3 文件系统1…

9个最常用的人体姿态估计模型

“姿态估计&#xff1f;”……“姿态”一词对于不同的人来说可能有不同的含义&#xff0c;但我们不是在讨论阿诺德经典、奥林匹亚或选美表演。 那么&#xff0c;姿态估计到底是什么&#xff1f; 那么&#xff0c;让我们深入探讨这个话题。 推荐&#xff1a;用 NSDT编辑器 快速搭…

【git】git命令行

首先要了解git整个流程的一个分类&#xff1a; workspace&#xff1a;工作区staging area&#xff1a;暂存区/缓存区local repository&#xff1a;版本库或本地仓库remote repository&#xff1a;远程仓库 创建仓库 git clone gitgithub.comxxxxxxxxxxxx//拷贝一份远程仓库 …

笔记34:转置卷积 Transposed Convolution 的由来

注&#xff1a;该文章为视频课的笔记补充 视频课&#xff1a;转置卷积&#xff08;transposed convolution&#xff09;_哔哩哔哩_bilibili 更详细的推导在&#xff1a;抽丝剥茧&#xff0c;带你理解转置卷积&#xff08;反卷积&#xff09;_逆卷积-CSDN博客 a a a 补充1…

3D模型轻量化工具HOOPS Communicator在3D打印行业中的应用分析

3D打印技术自问世以来&#xff0c;已经在制造业、医疗领域、航空航天和建筑等行业中产生了革命性的影响。随着3D打印技术的不断发展&#xff0c;对3D模型的需求也在不断增加。 随着3D模型复杂性的增加&#xff0c;模型文件的体积也不断膨胀&#xff0c;这对计算资源和数据传输提…

当zk某个节点坏掉如何修复

2.1 当zk某个节点坏掉如何修复 当发生zk数据文件丢失(误删或者磁盘损坏节点损坏都可能出现)时&#xff0c;cdh会出现如下告警

CoreData + CloudKit 在初始化 Schema 时报错 A Core Data error occurred 的解决

问题现象 如果希望为 CoreData 支持的 App 增加云数据备份和同步功能,那么 CloudKit 是绝佳的选择。CloudKit 会帮我们默默处理好一切,我们基本不用为升级而操心。 不过,有时在用本地 CoreData NSManagedObjectModel 初始化 iCloud 中的 Schema 时会发生如下错误: Error …

产品工程师工作的职责十篇

一、岗位职责的作用意义 1.可以最大限度地实现劳动用工的科学配置; 2.有效地防止因职务重叠而发生的工作扯皮现象; 3.提高内部竞争活力&#xff0c;更好地发现和使用人才; 4.组织考核的依据; 5.提高工作效率和工作质量; 6.规范操作行为; 7.减少违章行为和违章事故的发生…

菜单子节点的写法

菜单子节点的写法 1.测试数据2.实现代码3.获取父ID层级 1.测试数据 1.表结构SQL CREATE TABLE test (id int DEFAULT NULL,u_id int DEFAULT NULL,p_u_id int DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci;2.数据SQL INSERT INTO test (i…

解决maven骨架加载慢问题(亲测解决)

1、下载archetype-catalog.xml 网站 &#xff1a; https://repo.maven.apache.org/maven2/ 2、放在这个文件夹下面 3、setting–>build–>Runner : -DarchetypeCataloglocal

访问Apache Tomcat的manager页面

配置访问Tomcat manager页面的用户名、密码、角色 Tomcat安装完成后&#xff0c;包含了一个管理应用&#xff0c;默认安装在 <Tomcat安装目录>/webapps/manager 例如&#xff1a; 要使用管理页面的功能&#xff0c;需要在conf/tomcat-users.xml文件中配置用户、密码及…

学习Consul中踩过的坑

一、杀不死的consul 通过mac的homebrew安装了consul以后&#xff0c;手动启动consul报8300端口已被占用&#xff0c;通过lsof -i:8300和lsof -i:8500查看端口占用情况&#xff0c;发现consul已经启动了。然后手动kill -9对应的进程id&#xff0c;再启动consul&#xff0c;还是…

springboot 如何更新json串里面的内容

我的需求是这样的 如果新字符串中的key在原字符串中存在&#xff0c;则更新原字符串的对应key的value。如果新字符串中的key在原字符串中不存在&#xff0c;则将新字符串中的key和value添加到原字符串中。如果原字符串中存在&#xff0c;新字符串中不存在的key&#xff0c;则不…

亚马逊买家号怎么评论?快速留评软件有哪些?

对于亚马逊买家留评&#xff0c;其实是很简单的&#xff0c;首先亚马逊买家号账号上找到你购买该产品的订单。可以点击页面上的“我的账户”或类似的链接&#xff0c;然后选择“我的订单”或“订单历史记录”。然后选择要评论的订单&#xff1a;在订单历史记录中&#xff0c;找…

CS5801电路设计|HDMI转EDP转接板方案|HDMI2.0转EDP数据采集卡方案

CS5801国产(北京集睿致远&#xff09;研发HDMI转DP/EDP(4K60)转换器方案芯片,其设计HDMI转EDP转接板方案电路&#xff1a; CS5801输入端可以是1080P、4K30、4K60HZ这三种规格,输出的接口可以是DP信号接口,或者是EDP信号接口,输入端HDMI由4路信号组成&#xff0c;支持1.62Gbps、…

openwrt rm500u ncm方式拨号步骤记录

1.进入设备页面 用户名&#xff1a;root 2.创建接口 3.配置接口 国内APN 信息 中国移动APN&#xff1a;CMNET 中国联通APN&#xff1a;3GNET 中国电信APN&#xff1a;CTNET 4.防火墙配置 5.点击Save&Apply 6.配置完成后重启设备。重新进入设备页面&#xff0c;可以看…