CAN筛选器之ID配置

本文详细介绍了CAN(Controller Area Network)通信中ID的配置,包括列表模式和掩码模式,以及这两种模式的16位和32位宽度。列表模式下,ID被具体设定,而掩码模式下通过掩码筛选符合条件的ID。文中通过实例展示了如何对标准ID和扩展ID进行位移、组合操作,并解释了不同位宽的含义和配置方法。同时,还提到了掩码模式中如何通过掩码筛选ID的范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

列表模式

16位列表模式

32位列表模式

掩码模式

16位掩码模式

32位掩码模式


       初次理解,如有错误,请多多指教,欢迎交流!

         CAN通信的ID有标准ID和扩展ID,其有四种模式,即列表模式和掩码模式(两种模式的区别网上资源较多,此处不做具体区别,其主要却别是列表模式下的ID较为具体(每一位都是明确的),而掩码ID),其中列表模式和掩码模式各有16位宽和32位宽。可能说的不够准确,如下图:

 下面说明下四种ID的寄存器的配置。

备注:1、标准ID有10位,扩展ID是29位。

2、位宽为16的ID,是没有扩展ID的。

列表模式

16位列表模式

比如,

StdId =0x6af;              


0x6af:            0110 1010 1111
0x6af<<5:    1101 0101 1110 0000   

32位列表模式

StdId =0x6af;              
ExtId =0x1803f601;


0x6af:            0110 1010 1111
0x6af<<5:    1101 0101 1110 0000    (高16)

             0000 0000 0000 0000
           | 0000 0000 0000 0000     (低16) 
其中低16位等价于 0 | CAN_Id_Standard
因为#define CAN_Id_Standard   ((uint32_t)0x00000000) 
----------------------------------------------------------------
0x1803f601:                    0001 1000 0000 0011 1111 0110 0000 0001
0x1803f601<<3:                 1100 0000 0001 1111 1011 0000 0000 1000 
(0x1803f601<<3)>>16:           0000 0000 0000 0000 1100 0000 0001 1111   
(0x1803f601<<3)>>16 & 0xffff:  0000 0000 0000 0000 1100 0000 0001 1111    (高16(取低16位))


0x1803f601<<3:                   1100 0000 0001 1111 1011 0000 0000 1000 

0x1803f601<<3 & 0xffff:          1100 0000 0001 1111 1011 0000 0000 1000   
(ExtId<<3)&0xffff | CAN_ID_EXT: 1100 0000 0001 1111 1011 0000 0000 1100  (低16(取低16位)
其中 #define CAN_Id_Extended   ((uint32_t)0x00000004) 

掩码模式

16位掩码模式

StdId =0x6af;              


0x6af:            0110 1010 1111
0x6af<<5:    1101 0101 1110 0000   

mask:         1111 1111 1111 1111
筛选后:      1101 0101 1110 0000 
  
mask中某一位为1时,必须一致,举例如下
验证码: 0110 0001 1100
掩码:   1100 0011 1010
则筛选后的ID为:01xx xx01 1x0x (其中x可以为1或者0),则ID在100 0001 1000 ~ 111 1101 1101范围内的ID都会被筛选。

32位掩码模式


参考博客:

 (4条消息) 再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结_bonson2004的博客-CSDN博客

### STM32 F103 CAN 筛选器配置教程 #### 配置CAN模块 为了使STM32F103能够通过CAN总线与其他设备通信,需先设置CAN的工作模式。对于普通收发情况,可将`CAN_InitStructure.CAN_Mode`设为`CAN_Mode_Normal`[^2]。 #### 初始化CAN滤波器 针对STM32系列微控制器中的CAN接口,特别是当涉及到多个CAN实例(如CAN1和CAN2)时,需要注意不同实例间资源分配的问题。如果仅启用CAN2,在初始化过程中还需开启CAN1的时钟供应以确保正常运作[^3]。 对于具体型号为STM32F103ZRT6而言,其具备两个独立的CAN通道,即CAN1与CAN2。由于该款MCU内部设计原因,即使只使用其中一个CAN端口,也需要遵循特定规则来设定相应的寄存器参数: - **选择合适的过滤器组**:依据官方文档说明,CAN1可以访问编号从0到13之间的任意一组过滤器;而CAN2则限定于第14至27号之间选取。这意味着在规划项目架构之初就要考虑到这一点,合理安排各节点间的ID映射关系以及消息优先级等问题。 - **定义接收队列**:每路CAN都支持两种类型的FIFO(先进先出),分别是FIFO0和FIFO1。假设选择了CAN2并决定采用后者作为数据缓存区,则对应的中断处理程序应当命名为`CAN2_RX1_IRQHandler()`以便及时响应新到来的消息帧。 下面给出一段用于初始化CAN外设及其关联过滤机制的基础C语言代码片段供参考: ```c // 定义全局变量存储CAN句柄结构体指针 extern CAN_HandleTypeDef hcan; void MX_CAN_Init(void){ /* ...其他必要的硬件层初始化操作... */ // 设置CAN工作模式为标准模式下的主动监听状态 hcan.Instance = CAN1; // 或者CAN2取决于实际需求 hcan.Init.Mode = CAN_MODE_NORMAL; HAL_CAN_Init(&hcan); // 创建新的筛选条件对象 CanFilterConf.FilterIdHigh = 0x0000; CanFilterConf.FilterIdLow = 0x0000; CanFilterConf.FilterMaskIdHigh = 0x0000; CanFilterConf.FilterMaskIdLow = 0x0000; CanFilterConf.FilterScale = CAN_FILTERSCALE_32BIT; CanFilterConf.FilterMode = CAN_FILTERMODE_IDMASK; CanFilterConf.FilterBank = 14; // 对于CAN2来说至少应该是14以上 CanFilterConf.SlaveStartFilterBank = 14; CanFilterConf.FilterFIFOAssignment = CAN_RX_FIFO1; CanFilterConf.FilterActivation = ENABLE; CanFilterConf.BankNumber = 14; // 应用上述配置完成最终注册过程 HAL_CAN_ConfigFilter(&hcan, &CanFilterConf); } ``` 此段示例展示了如何基于CubeMX框架下创建一个新的CAN过滤条目,并将其绑定给指定的接收缓冲池。值得注意的是,这里所使用的过滤器索引值必须严格遵守前述关于范围的规定,以免引起不必要的冲突或异常行为。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值