stm32中的CAN通讯列表模式配置解析与源码

11 篇文章 5 订阅
1 篇文章 0 订阅

在这里插入图片描述
选择两个32位筛选器,列表模式的话就是14*2=28个CAN帧。
假如我想要筛选一个0x10f46601的帧,它的二进制为:
0001 0000 1111 0100 0110 0110 0000 0001
而筛选器为:
xxxx xxxx xxxx xxxx xxxx xxxx xxxx x100 ,后面的100是因为扩展数据帧
也就是说把上面要筛选的帧弄到这个筛选的X中,即:
1 0000 1111 0100 0110 0110 0000 0001 100 ,整理一下有:
1000 0111 1010 0011 0011 0000 0000 1100 ==0x87a3 300c
整到结构体中就是

CAN_FilterInitStructure.CAN_FilterIdHigh= 0x87a3;		//授时帧0x10f46601//要过滤的ID高位 
    CAN_FilterInitStructure.CAN_FilterIdLow= 0x300c;

观察上面可知:0001 0000 1111 0100 011 // 0 0110 0000 0001
所以CAN_FilterIdHigh=(0x10f46601>>13) & 0xffff
CAN_FilterIdLow= ((0x10f46601<<3) | 0x04) & 0xffff
完整配置如下,筛选3*2=6个帧

static void CAN_Filter_Config()
{
	CAN_FilterInitTypeDef  CAN_FilterInitStructure;

	/*CAN过滤器初始化*/
	  CAN_FilterInitStructure.CAN_FilterNumber=0;						//过滤器组0
    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;	   //工作在列表模式//工作在标识符屏蔽位模式
	  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;	//过滤器位宽为单个32位。
	/* 使能报文标示符过滤器按照标示符的内容进行比对过滤,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0。 */

    CAN_FilterInitStructure.CAN_FilterIdHigh= 0x87a3;		//授时帧0x10f46601//要过滤的ID高位 
    CAN_FilterInitStructure.CAN_FilterIdLow= 0x300c;	 
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (((0x10f46602)>>13)&0xffff);    //授时帧0x10f46602
    CAN_FilterInitStructure.CAN_FilterMaskIdLow= (((((uint32_t)0x10f46602)<<3)|(0x00000004))&0xffff);
	  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;							//过滤器被关联到FIFO0
	  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;										//使能过滤器
	  CAN_FilterInit(&CAN_FilterInitStructure);
	
	  CAN_FilterInitStructure.CAN_FilterNumber=1;						//过滤器组1
	  CAN_FilterInitStructure.CAN_FilterIdHigh=((((0x08840001|(Derailment_Addr<<8) ))>>13)&0xffff);     //收到主机1给予的控制帧
	  CAN_FilterInitStructure.CAN_FilterIdLow=(((((uint32_t)(0x08840001|(Derailment_Addr<<8) ))<<3)|(0x00000004))&0xffff);
	  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=((((0x08840002|(Derailment_Addr<<8) ))>>13)&0xffff);     //收到主机2给予的控制帧
	  CAN_FilterInitStructure.CAN_FilterMaskIdLow=(((((uint32_t)(0x08840002|(Derailment_Addr<<8) ))<<3)|(0x00000004))&0xffff);
	  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;							//过滤器被关联到FIFO0
	  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;										//使能过滤器
	  CAN_FilterInit(&CAN_FilterInitStructure);
	
	  CAN_FilterInitStructure.CAN_FilterNumber=2;						//过滤器组2
	  CAN_FilterInitStructure.CAN_FilterIdHigh= (((( 0x04780001|(Derailment_Addr<<8) ))>>13)&0xffff);     //收到主机1关于报警帧的响应
	  CAN_FilterInitStructure.CAN_FilterIdLow= (((((uint32_t)( 0x04780001|(Derailment_Addr<<8) ))<<3)|(0x00000004))&0xffff);
	  CAN_FilterInitStructure.CAN_FilterMaskIdHigh= (((( 0x04780002|(Derailment_Addr<<8) ))>>13)&0xffff);    //收到主机2关于报警帧的响应
    CAN_FilterInitStructure.CAN_FilterMaskIdLow= (((((uint32_t)( 0x04780002|(Derailment_Addr<<8) ))<<3)|(0x00000004))&0xffff);
	  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;							//过滤器被关联到FIFO0
	  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;										//使能过滤器
	  CAN_FilterInit(&CAN_FilterInitStructure);
	
  	CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);     /*CAN通信中断使能*/
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大文梅

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

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

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

打赏作者

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

抵扣说明:

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

余额充值