STM32学海无涯之CAN ID匹配、屏蔽与过滤 您所在的位置:网站首页 candump怎么id过滤 STM32学海无涯之CAN ID匹配、屏蔽与过滤

STM32学海无涯之CAN ID匹配、屏蔽与过滤

2024-06-03 14:49| 来源: 网络整理| 查看: 265

//配置过滤器 CAN_FilterInitStructure.CAN_FilterNumber=0; //过滤器0 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位 CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;32位ID CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0 CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0 CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化

CAN的过滤器是硬件设置接受指定地址数据用的。 假如说1号机设置FilterID为0x01010101,FilterMask设置为0xFFFFFFFF,那么他只能接受CAN通讯数据ID为0x01010101的数据,其他的硬件就会被屏蔽掉。如果FilterMask设置为0,那么就是所有ID的数据都可以接受。 FilterID为过滤的地址,FilterMask与FilterID对应每一位表示是否需要匹配当前位。还是上面的例子,mask设置为全1,表示所有为必须匹配,也就是只接受和FilterID一样的数据;mask设置为全0,就是任何一位都不需要匹配;mask设置为1,就是最低位匹配即可。就是这么个道理

CAN总线传送到数据是基于消息而不是地址的,每个消息用不同的编号表达(2.0A用11位、2.0B用29位)。在CAN上进行简单传送而自定义传送协议时,要把所有需要传送的命令列出,然后根据传送的紧急程度(优先级)从高到低进行排序,然后把最高优先级的设定一个最低的编号、以此类推…最低优先级的设定最高的编号。因为CAN物理上是不分主从,所以当有几个站点同时发送而发生碰撞时,编号最低的将优先传送。 从总线上接收消息:每个站点可能只对所有协议中的几个消息感兴趣,CAN初始化时,在过滤器中设置本站点需要接收的消息编号,这样一旦总线上有需要的消息将会自动接收,并产生中断,通知CPU收到新消息,CPU在中断程序中接收、处理。 发送消息到总线上:CAN初始化时设置本站点将来需要发送的消息编号,当运行过程中需要发送消息时,填入相关数据,设置相关消息对象发送。 CAN控制器内部一般设有32个消息对象,分成2组,分别各用一组寄存器来操作。一般一组用来接收过滤,另一组用来发送。

当将FilterMode 设置为列表模式的时候,屏蔽寄存器FiterMask也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符FilterId相同, 所以列表模式下是过滤特定的ID模式,列表的方式受到列表容量大小的限制,bxCAN的一个过滤器若工作在列表模式下,scale为32时,每个过滤器的列表只能写入两个报文ID,若scale为16时,每个过滤器的列表最多可写入4个CAN ID。

如果将FilterMode设置为CAN_FILTERMODE_IDMASK模式,FilterMaskId设置为0时,表示不过滤,可以接收任意的canid数据,

当filterMaskId不为0时,则表示过滤 对应MaskID 为1的bit必须与FilterID中的bit位相同的canid才能接收过来。

比如filterid=0x10101010, maskid=0x0000ffff, 则只有id=0x xxxx 1010的数据才能接收,xxxx可以不用与filterid的高2字节相同,可以任意。

STM32之CAN通讯接收过滤器过滤分析

再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结

1、在工程文件夹下,新建CAN目录,copy can.h can.c到该目录。 2、keil 项目栏中增加CAN目录,把can.c加入到 CAN目录 在这里插入图片描述

3、编译报错 报错 …\OBJ\Template.axf: Error: L6218E: Undefined symbol CAN_FilterInit (referred from can.o). …

解决:加入外设库文件 keil 项目栏FWLIB目录中加入**\FWLIB\STM32F4xx_StdPeriph_Driver\src、stm32f4xx_can.c 在这里插入图片描述 感谢:

stm32OBJ\template.axf: Error: L6218E: Undefined symbol

//从卡使用标准帧(TxMessage.IDE=CAN_Id_Standard)发送,ExtId无效,目标(主卡)ID为 TargetAddr,从卡本机ID为SourceAddr u8 E6432_CAN1_Send(u8 TargetAddr,u8 SourceAddr, u8* msg,u8 len) { u8 mbox; u16 i=0; CanTxMsg TxMessage; TxMessage.StdId=((SourceAddr CAN_FilterInitStructure.CAN_FilterIdHigh=can_master_id


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有