CAN通信滤波设置

在CAN通信中,有时候我们只想接收需要的ID,而滤出掉不需要的消息,这时候我们就需要添加滤波配置,本次以STM32F103RC为例来说明,首先来看什么是有效报文

01

有效报文

根据CAN协议,当报文被正确接收,这里指的是直到最后一位都没有报错,且通过了标识符过滤,那么该报文被认为是有效报文,是我们需要的报文。那么什么是标识符过滤呢?

02

标识符过滤

你可以简单的把他理解成和我们日常生活中的过滤一样,就是滤掉不需要的,剩下我们需要的,在CAN协议里,报文的标识符是跟报文的内容相关的,过滤是配置后,硬件完成,无需CPU开销,在F103中有14个位宽可变的可配置的过滤器组,每个过滤器组由两个32位寄存器组成。每个过滤器的位宽都可以独立配置,以满足应用程序的不同需求。可配置为屏蔽位模式和标识符列表模式。

屏蔽位模式:

在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照
“必须匹配”或“不用关心”处理。

标识符列表模式:

在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一
个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符
相同。

为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。应用程序不用的过滤器组,应该保持在禁用状态。过滤器组中的每个过滤器,都被编号为(叫做过滤器号)从0开始,到某个最大数值-取决于过滤器组的模式和位宽的设置。 更多详细的描述大家可以参考官方手册,这里不在赘述,主要给大家来说明下软件上如何设置

03

软件实现

软件实现上,按照手册描述,我们以配置标识符列表模式为例来说明,假设在我的软件里,我想过滤的标识符为

那么在CAN的初始化程序里面,我们就要加上过滤

然后在启动CAN使能中断,初始化就完成了。

04

添加多条过滤

上一节我们添加了一个过滤,那么只会过滤出一个ID,可是如果我想要另一个ID也进来呢,那么我们可以在上图代码中第一个过滤后继续添加

注意到两组中的不同,一个是sFilterConfig.FilterBank的不同,另一个就是要过滤的ID标识符不同。至此基于标识符列表的过滤模式就算完成,屏蔽位模式大家下去可以自己对照手册研究下。

温馨提示

如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是兆易创新单片机CAN列表滤波的例程,供参考: ```c #include "gd32f30x.h" #include <stdio.h> void can_filter_config(void); void can_receive_config(void); uint8_t can0_receive_flag = RESET; can_receive_message_struct receive_message; int main() { /* 系统时钟初始化 */ rcu_sysclk_init(); /* 配置CAN过滤器 */ can_filter_config(); /* 配置CAN接收 */ can_receive_config(); while(1){ /* 如果CAN接收到了数据帧 */ if(can0_receive_flag == SET){ /* 打印接收到的CAN数据帧的ID和数据 */ printf("CAN ID: 0x%x, Data: %x %x %x %x %x %x %x %x\n", receive_message.rx_sfid, receive_message.rx_data[0], receive_message.rx_data[1], receive_message.rx_data[2], receive_message.rx_data[3], receive_message.rx_data[4], receive_message.rx_data[5], receive_message.rx_data[6], receive_message.rx_data[7]); /* 清除接收标志位 */ can0_receive_flag = RESET; } } } /* 配置CAN过滤器 */ void can_filter_config(void) { can_filter_parameter_struct filter_parameter; /* CAN过滤器初始化 */ can_deinit(CAN0); can_struct_para_init(CAN_FILTER_INIT_STRUCT, &filter_parameter); /* 设置过滤器编号为0 */ filter_parameter.filter_number = 0; /* 设置为列表模式 */ filter_parameter.filter_mode = CAN_FILTERMODE_IDLIST; /* 定义过滤器的ID为0x123 */ filter_parameter.filter_list_high = 0x123 << 5; /* 开启过滤器 */ filter_parameter.filter_enable = ENABLE; can_filter_init(CAN0, &filter_parameter); } /* 配置CAN接收 */ void can_receive_config(void) { can_parameter_struct can_parameter; can_parameter_struct init_parameter; /* CAN单元初始化 */ can_struct_para_init(CAN_INIT_STRUCT, &init_parameter); init_parameter.time_triggered_mode = DISABLE; init_parameter.auto_bus_off_recovery = ENABLE; can_deinit(CAN0); /* deinit CAN */ can_init(CAN0, &init_parameter); /* init CAN */ /* CAN单元参数配置 */ can_struct_para_init(CAN_PARAMETER_STRUCT, &can_parameter); can_parameter.working_mode = CAN_NORMAL_MODE; /* normal mode */ can_parameter.resync_jump_width = CAN_BT_SJW_1TQ; /* 1 time quantum */ can_parameter.time_segment_1 = CAN_BT_BS1_6TQ; /* 6 time quantum */ can_parameter.time_segment_2 = CAN_BT_BS2_7TQ; /* 7 time quantum */ can_parameter.prescaler = 3; /* baudrate 500Kbps */ can_parameter.ttc_mode = DISABLE; can_parameter.abom = DISABLE; can_parameter.awu = DISABLE; can_parameter.nart = ENABLE; can_parameter.rflm = DISABLE; can_parameter.ttcm = DISABLE; can_parameter.reset_cancel = DISABLE; can_init(CAN0, &can_parameter); /* initialize CAN */ /* CAN接收中断使能 */ can_interrupt_enable(CAN0, CAN_INTEN_RFNEIE0); eclic_irq_enable(CAN0_RX0_IRQn, 1, 0); } /* CAN接收中断处理函数 */ void CAN0_RX0_IRQHandler(void) { if(can_interrupt_flag_get(CAN0, CAN_INT_FLAG_RFNE0)){ /* 读取接收到的CAN数据帧 */ can_receive(CAN0, CAN_FIFO0, &receive_message); /* 设置接收标志位 */ can0_receive_flag = SET; /* 清除中断标志位 */ can_interrupt_flag_clear(CAN0, CAN_INT_FLAG_RFNE0); } } ``` 在这个例程中,过滤器的ID被设置为0x123,只有接收到ID为0x123的CAN数据帧才会被接收。可以根据实际需求修改过滤器的设置。如果有多个过滤器,可以增加过滤器编号,如filter_parameter.filter_number = 1;。 此外,还需要注意CAN的时序配置和波特率配置,以保证CAN通信正常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值