在控制器区域网络(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过滤器类型都有其独特的应用场景和优势。在选择合适的过滤策略时,重要的是要考虑您的网络需求和消息流量特点。通过理解这些过滤器类型的工作原理,您可以更有效地配置您的CAN网络,确保数据传输的高效和准确。
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匹配。
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到。这个的数量在配置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
/** @defgroup FDCAN_Reject_Remote_Frames FDCAN reject remote frames
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- haog.cn 版权所有 赣ICP备2024042798号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务