CAN 六:CAN过滤器编程举例

1、开发环境

(1)KeilMDK:V5.38.0.0

(2)STM32CubeMX:V6.8.1

(3)MCU:STM32F407ZGT6

2、实现目的

(1)MCU的CAN通过CAN盒连接电脑,接收上位机发送的扩展数据帧。

(2)MCU过滤接收的扩展数据帧,通过串口打印出来作为验证。

3、原理图

(1)CAN芯片选择TJA1040。

(2)CAN_TX接PA12,CAN_RX接PA11。

4、过滤器相关介绍

(1)此实验以屏蔽位模式、32位位宽、扩展数据帧的接收过滤举例。

(2)过滤器映射图。

(3)筛选出的扩展ID为:xxx1 10xx 01xx 11xx 10xx 10xx 00xx 11xx (x为无关位)

5、主要程序

5.1、过滤器函数

/*
**功能:CAN过滤器配置
**参数:无
**返回值:无
**注:
**    (1)屏蔽位模式、32位位宽、扩展数据帧的接收过滤举例
**    (2)筛选出的扩展ID为:        xxx1 10xx 01xx 11xx 10xx 10xx 00xx 11xx (x为无关位)
**    (3)无关位填充零,相关位不变:  0001 1000 0100 1100 1000 1000 0000 1100 = 0x184C880C
**    (4)无关位填充零,相关位为1:    0001 1100 1100 1100 1100 1100 1100 1100 = 0x1CCCCCCC
*/
void can_filter_config(void)
{
    CAN_FilterTypeDef can_filterconfig;
    // 过滤器模式:标识符掩码模式(屏蔽位模式)
    can_filterconfig.FilterMode = CAN_FILTERMODE_IDMASK; 
    // 过滤器位宽:32位位宽 
    can_filterconfig.FilterScale = CAN_FILTERSCALE_32BIT;  
   
	//STID[10:3] STID[2:0] EXID[17:13]         EXID[12:5] EXID[4:0] IDE RTR 0
    
    // 扩展标识符位:决定是标准数据帧还是扩展数据帧;置1为扩展帧。
	uint16_t IDE = 0x01;        
	// 远程发送请求位:0数据帧、1遥控帧(遥控帧没有后面的数据段);清零为数据帧
	uint16_t RTR = 0x01;  
	
    // ID高字节 
	can_filterconfig.FilterIdHigh = (0x184C880C >> 13) & 0xffff;          
	// ID低字节
    can_filterconfig.FilterIdLow =  ((0x184C880C & 0x1FFF) << 3)  \
                                    | (IDE << 2) & (~(RTR << 1))  \
                                    & (~ 0x01 );       
	printf("%.4x %.4x\r\n", can_filterconfig.FilterIdHigh, can_filterconfig.FilterIdLow);


	// 掩码高字节 
	can_filterconfig.FilterMaskIdHigh = (0x1CCCCCCC >> 13) & 0xffff;   
    // 掩码低字节    
    can_filterconfig.FilterMaskIdLow = ((0x1CCCCCCC  & 0x1FFF) << 3) \
                                      | (IDE << 2) & (~(RTR << 1))   \
                                      & (~ 0x01 );      
	printf("%.4x %.4x\r\n", can_filterconfig.FilterMaskIdHigh,  \
                            can_filterconfig.FilterMaskIdLow);

    can_filterconfig.FilterBank = 0;                         /* 选择过滤器组 */
    can_filterconfig.FilterFIFOAssignment = CAN_FilterFIFO0; /* 过滤器关联FIFO */
    can_filterconfig.FilterActivation = CAN_FILTER_ENABLE;   /* 过滤器使能 */
    can_filterconfig.SlaveStartFilterBank = 14;
    HAL_CAN_ConfigFilter(&hcan1, &can_filterconfig);
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码织梦师小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值