STM32 CAN 设置多个过滤器接收多ID方法

1.标识符列表模式 ,32位模式下

void MX_CAN_Init(void)
{
    //这里是实现了两个地址的接收  一个是用来接收广播信息 一个用来接收私有地址
    //如果想实现多个地址可以添加多个过滤器组
    //stm32103 有0-13  共14个过滤器 在32位模式下可以过滤14个地址
    //16为模式下可以过滤28个地址
    // 如果需要更多 那就要用屏蔽位模式,用屏蔽位模式就需要通过软件来判断一下地址
    CAN_FilterTypeDef  sFilterConfig_boarcast;c//广播
    CAN_FilterTypeDef  sFilterConfig_pravite;//私有
    uint32_t boardcast_addr =0x00000012&0x07ffffff;//can广播接收地址
    uint32_t private_addr =0x00000013&0x07ffffff;//can私有地址
    hcan.Instance = CAN;
    hcan.Init.Prescaler = 8;
    hcan.Init.Mode = CAN_MODE_NORMAL;
    hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
    hcan.Init.TimeSeg1 = CAN_BS1_6TQ;
    hcan.Init.TimeSeg2 = CAN_BS2_2TQ;
    hcan.Init.TimeTriggeredMode = DISABLE;
    hcan.Init.AutoBusOff = DISABLE;
    hcan.Init.AutoWakeUp = DISABLE;
    hcan.Init.AutoRetransmission = DISABLE;
    hcan.Init.ReceiveFifoLocked = ENABLE;
    hcan.Init.TransmitFifoPriority = ENABLE;
    if (HAL_CAN_Init(&hcan) != HAL_OK)
    {
    //Error_Handler();
    rt_kprintf("can init error\r\n");
    }
/* Configure the CAN Filter */
    sFilterConfig_boarcast.FilterBank = 0;//过滤器0
    sFilterConfig_boarcast.FilterMode = CAN_FILTERMODE_IDLIST;
    sFilterConfig_boarcast.FilterScale = CAN_FILTERSCALE_32BIT;

    sFilterConfig_boarcast.FilterIdHigh =  
     ((boardcast_addr<<21)&0xffff0000)>>16;//can广播地址
    sFilterConfig_boarcast.FilterIdLow =  0x00000000;
    sFilterConfig_boarcast.FilterMaskIdHigh =  ((boardcast_addr<<21)&0xffff0000)>>16;
    sFilterConfig_boarcast.FilterMaskIdLow =   0x00000000;
    sFilterConfig_boarcast.FilterFIFOAssignment = CAN_RX_FIFO0;
    sFilterConfig_boarcast.FilterActivation = ENABLE;
    sFilterConfig_boarcast.SlaveStartFilterBank = 14;

    sFilterConfig_pravite=sFilterConfig_boarcast;
    sFilterConfig_pravite.FilterBank = 1;//过滤器1
    sFilterConfig_pravite.FilterIdHigh = ((private_addr<<21)&0xffff0000)>>16;//can私有地址
    sFilterConfig_pravite.FilterIdLow =   0x00000000;
    sFilterConfig_pravite.FilterMaskIdHigh =  ((private_addr<<21)&0xffff0000)>>16;
    sFilterConfig_pravite.FilterMaskIdLow =  0x00000000;
	
    if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig_boarcast) != HAL_OK)
      {
    		rt_kprintf("can filter boarcast init error\r\n");
      }
    if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig_pravite) != HAL_OK)
      {
    		rt_kprintf("can filter pravite init error\r\n");
      }
     
      /* Start the CAN peripheral */
      if (HAL_CAN_Start(&hcan) != HAL_OK)
      {
    		rt_kprintf("can start error\r\n");
      }
     
      /* Activate CAN RX notification */
      if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
      {
    		rt_kprintf("can notification rx error\r\n");
      }
}
	

2.1.标识符列表模式 ,16位模式下

void MX_CAN_Init(void)
{
    //这里是实现了8个地址的接收 
    CAN_FilterTypeDef sFilterConfig;
    CAN_FilterTypeDef sFilterConfig1;
     
    hcan.Instance = CAN;
    hcan.Init.Prescaler = 8;
    hcan.Init.Mode = CAN_MODE_NORMAL;
    hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
    hcan.Init.TimeSeg1 = CAN_BS1_6TQ;
    hcan.Init.TimeSeg2 = CAN_BS2_2TQ;
    hcan.Init.TimeTriggeredMode = DISABLE;
    hcan.Init.AutoBusOff = DISABLE;
    hcan.Init.AutoWakeUp = DISABLE;
    hcan.Init.AutoRetransmission = DISABLE;
    hcan.Init.ReceiveFifoLocked = ENABLE;
    hcan.Init.TransmitFifoPriority = ENABLE;
    if (HAL_CAN_Init(&hcan) != HAL_OK)
    {
    //Error_Handler();
    rt_kprintf("can init error\r\n");
    }
/* Configure the CAN Filter */
  sFilterConfig_boarcast.FilterBank = 0;
  sFilterConfig_boarcast.FilterMode = CAN_FILTERMODE_IDLIST;
  sFilterConfig_boarcast.FilterScale = CAN_FILTERSCALE_16BIT;

      /* Configure the CAN Filter */
  sFilterConfig.FilterBank = 0;//过滤器0
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST;
  sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT;
  sFilterConfig.FilterIdHigh =   (((uint32_t)0x07A0<<21)&0xffff0000)>>16;//地址1
  sFilterConfig.FilterIdLow =    (((uint32_t)0x07B0<<21)&0xffff0000)>>16;//地址2
  sFilterConfig.FilterMaskIdHigh = (((uint32_t)0x07C0<<21)&0xffff0000)>>16;//地址3
  sFilterConfig.FilterMaskIdLow =  (((uint32_t)0x07D0<<21)&0xffff0000)>>16;//地址4
  sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
  sFilterConfig.FilterActivation = ENABLE;
  sFilterConfig.SlaveStartFilterBank = 14;
  
  sFilterConfig1=sFilterConfig;
 
  sFilterConfig.FilterBank = 1;//过滤器1
  sFilterConfig.FilterIdHigh =   (((uint32_t)0x07A1<<21)&0xffff0000)>>16;//地址5
  sFilterConfig.FilterIdLow =   (((uint32_t)0x07B1<<21)&0xffff0000)>>16;//地址6
  sFilterConfig.FilterMaskIdHigh = (((uint32_t)0x07C1<<21)&0xffff0000)>>16;//地址7
  sFilterConfig.FilterMaskIdLow =  (((uint32_t)0x07D1<<21)&0xffff0000)>>16;//地址8
	
if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
  {
    /* Filter configuration Error */
   //Error_Handler();
		rt_kprintf("can filter init error\r\n");
  }
if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig1) != HAL_OK)
  {
    /* Filter configuration Error */
   //Error_Handler();
		rt_rt_kprintf("can filter init error\r\n");
  }
}

 

  • 7
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值