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

一、前言

学习了CAN通讯,底层的东东CAN控制器已经帮你处理完成,也就是CAN通讯协议已经做好,你按协议格式往对应的位扔数据发送就好,所以使用CAN通讯,我们只需要去关心制定发送的数据间的协议,也就是给每个数据加上有标识符的协议。如下图所示的CAN通讯发送数据的数据帧,Arbitration Field即是具有优先级的标识ID,Data Field即是要发送的数据,Arbitration FieldData Field就是我们关注的重点,因为CAN通讯协议里边这些发送出来的标识ID并不代表节点的地址,数据是以广播形式发送出来,每个节点都是可以接收,至于接收到的数据是不是想要的?就需要对这些标识的ID进行筛选和过滤,再去提取数据。
1100486-20170303180750376-74083783.png

二、CAN 通讯接收过滤器的分析

首先我们看下要配置发送数据的结构,如下所示。我们发送的Arbitration Field标识即是CanTxMsg.StdId,接收则会先过滤标识ID过滤处理后,再去提取发送的的CanTxMsg.Data。如果不是设定的标识ID,接收则不会去读取数据,到底接收方是怎样去过滤处理的。

typedef struct
{
  uint32_t StdId;    //11位 标准帧ID即Arbitration Field
  uint32_t ExtId;    //29位 扩展帧ID
  uint8_t IDE;       //1位  O:标准帧,1:扩展帧
  uint8_t RTR;       //1位  0:数据帧,1:远程帧
  uint8_t DLC;       //4位  发送的数据的长度
  uint8_t Data[8];   //8位  发送的数据即Data Field
} CanTxMsg;

因为STM32在非互联网型产品中CAN控制器提供了14个位宽可变、可配置的过滤器组(13~0),每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成,而1个过滤器组的位宽设置可以分成四种工作模式,工作模式取决于两个寄存器FBMxFSCx的设置,如下图所示:
1100486-20170306184647656-1740544022.png
看到过滤器的四种工作模式,工作模式中标识符屏蔽列表模式,如何去理解,举个例子,假如我们发送的标识IDCanTxMsg.StdId是0x000~0x00f,接收过滤先用标识符屏蔽模式来过滤标识的ID,如下所示:

 ID  :     000 0000 0000 xxxx              
 屏蔽 :     111 1111 1111 0000 
  

x代表0或者1都是可以通过,0000到1111的任意组合,这样就可以过滤出0x000~0x00f的数据的,所以屏蔽的意思就是让某个范围的标识符ID可以通过,目的是过滤出一组标志符。那么如果想过滤出一个数据0x003,用标识符屏蔽模式实现方式如下,

 ID  :     000 0000 0000 0011              
 屏蔽 :     111 1111 1111 1111 
  

如果接收过滤使用标识符列表模式来过滤标识ID,如下所示,

 ID  :    000 0000 0001 
 ID  :    000 0000 0010

这种模式只能过滤出两个ID,即0x001,0x002,所以列表的意思就是要去罗列想要的标识ID

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在STM32上实现CANopen协议的移植,你可以使用以下步骤: 1. 下载已经完成CAN底层驱动的工程代码,并准备好移植所需的文件,包括BSP(板级支持包)、Canfestival的源码和对象字典的文件。 2. 阅读广州硬石科技的教程,了解Canfestival的移植流程。然而,该教程中提供的定时器代码在实现上可能存在问题,导致定时不准确。因此,建议你使用我提供的方法来实现定时器,该方法经过测试证明是可行的。 3. 将你的BSP和Canfestival的源码与对象字典的文件添加到已完成CAN底层驱动的工程中。 4. 确保你的工程配置正确,包括正确配置CAN总线的参数,如波特率、滤波器和中断优先级等。 5. 根据Canfestival的规范和你的需求,配置对象字典。对象字典定义了CANopen协议中的对象和参数。 6. 实现必要的功能函数,例如发送和接收CAN帧的函数、处理CANopen协议的函数等。 7. 在主循环中调用处理CANopen协议的函数,以便处理接收到的CAN帧并执行相关操作。 通过以上步骤,你可以将CANopen协议成功移植到STM32上,并实现相应的功能。请参考提供的引用和引用中的链接获取更详细的代码和教程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [CANopen | 移植01 - STM32H743 + Canfestival的移植并让FDCAN1运行CANopen协议](https://blog.csdn.net/wallace89/article/details/119190363)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值