在控制器区域网络(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值(FilterID1 和 FilterID2)来定义一个被接受的消息ID范围。
- 任何在这个范围内(包括边界值)的消息ID都将通过过滤器。
- 例如:如果 FilterID1 设置为 100,FilterID2 设置为 200,那么任何ID在 100 到 200 之间(包括 100 和 200)的消息都会被接受。
FDCAN_FILTER_DUAL (0x00000001U):
- 这种模式实现了双ID过滤。
- 它使用两个特定的ID(FilterID1 和 FilterID2),任何与这两个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掩码)不会被应用。
- 与标准的范围过滤类似,它接受在 FilterID1 和 FilterID2 之间的所有消息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:您可以设置EIDM为 0xFFF00000。这个掩码指定了只有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过滤器外设的时候配置了。 */
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文章来源:https://www.toymoban.com/news/detail-800780.html
- @{
/
#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文章来源地址https://www.toymoban.com/news/detail-800780.html
- @{
/
#define FDCAN_FILTER_REMOTE ((uint32_t)0x00000000U) /!< Filter remote frames /
#define FDCAN_REJECT_REMOTE ((uint32_t)0x00000001U) /!< Reject all remote frames */
到了这里,关于【STM32】STM32 CANFD外设的几种消息接收过滤模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!