【STM32】STM32 CANFD外设的几种消息接收过滤模式

在控制器区域网络(CAN)系统中,正确配置消息过滤器对于有效管理网络通信至关重要。特别是在使用Flexible Data-rate Controller Area Network(FDCAN)时,选择合适的过滤器类型可以大大提高网络效率和消息处理速度。

STM32G47x芯片的CAN外设有如下几种接收消息过滤方法:

/** @defgroup FDCAN_filter_type FDCAN Filter Type
  * @{
  */
#define FDCAN_FILTER_RANGE         ((uint32_t)0x00000000U) /*!< Range filter from FilterID1 to FilterID2                        */
#define FDCAN_FILTER_DUAL          ((uint32_t)0x00000001U) /*!< Dual ID filter for FilterID1 or FilterID2                       */
#define FDCAN_FILTER_MASK          ((uint32_t)0x00000002U) /*!< Classic filter: FilterID1 = filter, FilterID2 = mask            */
#define FDCAN_FILTER_RANGE_NO_EIDM ((uint32_t)0x00000003U) /*!< Range filter from FilterID1 to FilterID2, EIDM mask not applied */

FDCAN_FILTER_RANGE (0x00000000U):

  • 这是一种范围过滤模式。
  • 在这种模式下,使用两个ID值(FilterID1FilterID2)来定义一个被接受的消息ID范围。
  • 任何在这个范围内(包括边界值)的消息ID都将通过过滤器。
  • 例如:如果 FilterID1 设置为 100FilterID2 设置为 200,那么任何ID在 100 到 200 之间(包括 100 和 200)的消息都会被接受。

FDCAN_FILTER_DUAL (0x00000001U):

  • 这种模式实现了双ID过滤。
  • 它使用两个特定的ID(FilterID1FilterID2),任何与这两个ID中的任何一个匹配的消息都会被接受。
  • 例如:如果 FilterID1 是 123,FilterID2 是 456,那么任何ID为 123 或 456 的消息都将通过过滤器。

FDCAN_FILTER_MASK (0x00000002U):

  • 这是一种经典的过滤方式,称为掩码过滤。
  • 在这种模式下,FilterID1 是过滤ID,FilterID2 是掩码。
  • 控制器使用掩码来确定哪些位在过滤ID中是必须匹配的。
  • 例如:如果 FilterID1 设置为 100,FilterID2(掩码)设置为 0xF0,则只有那些ID的高4位与 100 的高4位匹配的消息才会被接受。
  • 即满足如下条件:
    F i l t e r I D 2 & R e c e i v e M s g I D = = F i l t e r I D 2 & F i l t e r I D 1 FilterID2 \& ReceiveMsgID == FilterID2 \& FilterID1 FilterID2&ReceiveMsgID==FilterID2&FilterID1

FDCAN_FILTER_RANGE_NO_EIDM (0x00000003U):

  • 这也是一种范围过滤模式,但在这种模式下,EIDM(扩展ID掩码)不会被应用。
  • 与标准的范围过滤类似,它接受在 FilterID1FilterID2 之间的所有消息ID。
  • 但与标准范围过滤不同的是,它不使用额外的掩码来进一步限制接受的消息ID。
  • 每种过滤模式都有其特定的用途和应用场景,选择合适的过滤模式取决于CAN网络中的特定需求和消息流量。

每种FDCAN过滤器类型都有其独特的应用场景和优势。在选择合适的过滤策略时,重要的是要考虑您的网络需求和消息流量特点。通过理解这些过滤器类型的工作原理,您可以更有效地配置您的CAN网络,确保数据传输的高效和准确。

关于EIDM

EIDM(Extended Identifier Mask)在FDCAN(Flexible Data-rate Controller Area Network)系统中用于过滤消息时起着重要作用。EIDM主要用于在掩码过滤中细化对扩展标识符(Extended Identifier)的匹配。在CAN通信中,标识符用于区分不同的消息,而扩展标识符允许更多的消息ID。

EIDM的作用是为扩展标识符提供一个额外的掩码层,使得过滤器可以更精确地匹配特定的消息ID。通过EIDM,您可以指定哪些位必须匹配才能让消息通过过滤器,从而提供了更高的灵活性和精确控制。

例子
假设您有一个扩展ID为 0x1F345678 的消息,您希望只接收具有特定模式的ID。您可以使用掩码过滤器和EIDM来实现这一点:

设置过滤ID:假设您设置过滤ID为 0x1F345678
应用EIDM:您可以设置EIDM0xFFF00000。这个掩码指定了只有ID的高12位需要匹配,而低20位可以是任何值。
在这种情况下,任何高12位与 0x1F3 匹配的扩展ID都会通过过滤器。这意味着ID如 0x1F300000、0x1F3FFFFF 等都会被接受,因为它们在掩码指定的位上与过滤ID匹配。

  • 即满足如下条件:
    E I D M & R e c e i v e M s g I D = = E I D M & S e t I D EIDM \& ReceiveMsgID == EIDM \&SetID EIDM&ReceiveMsgID==EIDM&SetID

EIDM在需要对大量消息进行精确控制时非常有用,尤其是在复杂的CAN网络环境中,例如汽车或工业自动化系统,这种精确的消息过滤能够确保只有相关和必要的信息被处理。

FDCAN_RxHeaderTypeDef RxHeader;
uint8_t RxData[8];
void FDCAN1_Config(void)
{
  FDCAN_FilterTypeDef sFilterConfig;
  /* Configure Rx filter */
  sFilterConfig1.IdType = FDCAN_EXTENDED_ID;             /* 设置标准ID或者扩展ID */
  sFilterConfig1.FilterIndex = 0;                        /* 用于过滤索引,如果是标准ID,范围0到127。如果是扩展ID,范围0到64。这个的数量在配置CAN过滤器外设的时候配置了。就是这个个CAN外设,你配置了几个过滤器,然后这个这个FilterIndex  */
  sFilterConfig1.FilterType = FDCAN_FILTER_MASK;         /* 过滤器采样屏蔽位模式 */
  sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; /* 如果过滤匹配,将数据保存到Rx FIFO 0 */
  sFilterConfig1.FilterID1 = 0x111;                      /* 屏蔽位模式下,FilterID1是消息ID */
  sFilterConfig1.FilterID2 = 0x7FF;                      /* 屏蔽位模式下,FilterID2是消息屏蔽位 */

  if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1) != HAL_OK) /* 配置过滤器 */
  {
    Error_Handler();
  }


  /* Configure global filter:
     Filter all remote frames with STD and EXT ID
     Reject non matching frames with STD ID and EXT ID */
  if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
  {
    Error_Handler();
  }

  if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
  {
    Error_Handler();
  }

  /* Start the FDCAN module */
  if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
  {
    Error_Handler();
  }
}

void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
  if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)
  {
    /* Retrieve Rx messages from RX FIFO0 */
    if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
    {
      Error_Handler();
    }
  }
}

HAL_FDCAN_ConfigGlobalFilter
@brief 配置FDCAN全局过滤器。
@param hfdcan 指向包含指定FDCAN配置信息的FDCAN_HandleTypeDef结构体的指针。
@param NonMatchingStd 定义了如何处理接收到的具有11位ID且不匹配过滤器列表中任何元素的消息。
此参数可以取值 @arg FDCAN_Non_Matching_Frames。
@param NonMatchingExt 定义了如何处理接收到的具有29位ID且不匹配过滤器列表中任何元素的消息。
此参数可以取值 @arg FDCAN_Non_Matching_Frames。
@param RejectRemoteStd 过滤或拒绝所有远程11位ID帧。
此参数可以取值 @arg FDCAN_Reject_Remote_Frames。
@param RejectRemoteExt 过滤或拒绝所有远程29位ID帧。
此参数可以取值 @arg FDCAN_Reject_Remote_Frames。
@retval HAL状态

/** @defgroup FDCAN_Non_Matching_Frames FDCAN non-matching frames

  • @{
    /
    #define FDCAN_ACCEPT_IN_RX_FIFO0 ((uint32_t)0x00000000U) /
    !< Accept in Rx FIFO 0 /
    #define FDCAN_ACCEPT_IN_RX_FIFO1 ((uint32_t)0x00000001U) /
    !< Accept in Rx FIFO 1 /
    #define FDCAN_REJECT ((uint32_t)0x00000002U) /
    !< Reject /
    /
    *
  • @}
    */

/** @defgroup FDCAN_Reject_Remote_Frames FDCAN reject remote frames

  • @{
    /
    #define FDCAN_FILTER_REMOTE ((uint32_t)0x00000000U) /
    !< Filter remote frames /
    #define FDCAN_REJECT_REMOTE ((uint32_t)0x00000001U) /
    !< Reject all remote frames */
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值