云途MCU FlexCAN ID过滤方法介绍
GaoSheng Lv4

YTM32系列MCU FlexCAN ID过滤应用指南

1. 概述

YTM32系列MCU集成的CAN控制器支持标准帧和扩展帧。并提供了多个邮件箱和接收FIFO,以及ID过滤功能。本文以YTM32B1ME0为例从应用的角度简明介绍如何使用YTM32的CAN外设进行ID过滤。

2. ID过滤原理

接收滤波器由滤波器掩码(Mask Code)和接受码(Acceptance Code)组成,当 FlexCAN 在不同的配置情况下接收滤波器的掩码和接受码组合是不同的。

  • acceptedId:接收邮箱滤波器接受码
  • – 当被用作标准帧 (Standard Frame) 接收邮箱时,范围为 0-0x7FF;
    – 当被用作扩展帧 (Extended Frame) 接收邮箱时,范围为 0-0x1FFFFFFF;

通过滤波器,节点可以对接收的报文进行过滤,如果报文相关就进行接收

1743690559258

3. 代码示例

下面是一个CAN ID过滤代码示例:

  1. 初始化CAN 使能 FIFO
1
2
3
4
can_instance_t can_pal_instance = {
.instType = CAN_INST_TYPE_FLEXCAN,//CAN逻辑实例类型为Flexcan
.instIdx = 0UL, //使用CAN0
};
  • instType             识别具体是哪种CAN外设

  • instIdx                定位到设备树中的外设实例地址

1
2
3
4
5
6
7
8
9
10
const extension_flexcan_rx_fifo_t enhanceFifoCfg = {
// .numIdFilters = FLEXCAN_RX_FIFO_ID_FILTERS_16,
.isEnhanceRxFifoEnable = true,
.minNumOfRxMessages = 10U,
.numEnhanceRxFifoStandardIdFilters = 2U,//标准ID过滤器数量
.numEnhanceRxFifoExtendedIdFilters = 3U,//扩展ID过滤器数量
.enhanceRxFifoIdfilterTable =
(flexcan_enhance_rx_fifo_filter_table_t *)&enhanceFifoFilterTable[0],

};
  • numIdFilters                            过滤器规则数量

  • isEnhanceRxFifoEnable                           是否接收FIFO增强模式

  • minNumOfRxMessages                            FIFO中最小接收消息数量

  • numEnhanceRxFifoStandardIdFilters 标准ID过滤器数量

  • numEnhanceRxFifoExtendedIdFilters 扩展ID过滤器数量

  • enhanceRxFifoIdfilterTable                  指向ID过滤器表首地址

  1. 具体的过滤器表的配置,标准帧和扩展帧的过滤规则可以写在一个表里
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const flexcan_enhance_rx_fifo_filter_table_t enhanceFifoFilterTable[] =
{
{
.isRemoteFrame = false,
.isExtendedFrame = true,
.filterScheme = FLEXCAN_ENAHNCE_RXFIFO_FSCH_FILTER_MASK,
.filter_table.scheme_filter_mask =
{
.filter = 0x0CF004FEU,
.mask = 0x1FFFFFFEU,
},
},
{
.isRemoteFrame = false,
.isExtendedFrame = false,
.filterScheme = FLEXCAN_ENAHNCE_RXFIFO_FSCH_FILTER_MASK,
.filter_table.scheme_filter_mask =
{
.filter = 0x4FEU,
.mask = 0x7FFU,
},
},
};

以第一个过滤规则为例

掩码值mask为0x1FFFFFFE,所以除最后一位,其余位必须与0x0CF004FE相同

即只能接收0x0CF004FE和0x0CF004FF,最后一个可为0可为1。

这样,只有ID落在配置范围内的CAN消息才能进入接收FIFO。

1
CAN_Receive(&can_pal_instance, (uint32_t)FLEXCAN_MB_HANDLE_ENHANCE_RXFIFO, &rxMsg);

如只想接收ID为0x02的CAN消息,可以通过如下配置

1
2
3
4
#define RX_STD_MSG_ID (0x02UL)
#define RX_STD_MAILBOX (0x00UL)
#define RX_EXTMSG_ID (0x70012UL)
#define RX_EXT_MAILBOX (0x02UL)

这几个宏定义规定了CAN消息的接收设置:

#define RX_STD_MSG_ID (0x02UL)

  • RX_STD_MSG_ID 定义了标准ID值为0x02的消息

#define RX_STD_MAILBOX (0x00UL)

  • RX_STD_MAILBOX 定义mailbox 0作为标准ID消息的接收缓冲区

#define RX_EXTMSG_ID (0x70012UL)

  • RX_EXTMSG_ID 定义扩展ID值为0x70012的消息

#define RX_EXT_MAILBOX (0x02UL)

  • RX_EXT_MAILBOX 定义mailbox 2作为扩展ID消息的接收缓冲区

之后在配置接收时就可以直接使用这些符号来设置消息ID和mailbox:

1
2
FLEXCAN_DRV_Receive(CAN_INST, RX_STD_MAILBOX, &rxStdMsg);
FLEXCAN_DRV_Receive(CAN_INST, RX_EXT_MAILBOX, &rxExtMsg);
本站由 提供部署服务