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;
通过滤波器,节点可以对接收的报文进行过滤,如果报文相关就进行接收
3. 代码示例
下面是一个CAN ID过滤代码示例:
- 初始化CAN 使能 FIFO
1 | can_instance_t can_pal_instance = { |
instType 识别具体是哪种CAN外设
instIdx 定位到设备树中的外设实例地址
1 | const extension_flexcan_rx_fifo_t enhanceFifoCfg = { |
numIdFilters 过滤器规则数量
isEnhanceRxFifoEnable 是否接收FIFO增强模式
minNumOfRxMessages FIFO中最小接收消息数量
numEnhanceRxFifoStandardIdFilters 标准ID过滤器数量
numEnhanceRxFifoExtendedIdFilters 扩展ID过滤器数量
enhanceRxFifoIdfilterTable 指向ID过滤器表首地址
- 具体的过滤器表的配置,标准帧和扩展帧的过滤规则可以写在一个表里
1 | const flexcan_enhance_rx_fifo_filter_table_t enhanceFifoFilterTable[] = |
以第一个过滤规则为例
掩码值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 |
这几个宏定义规定了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 | FLEXCAN_DRV_Receive(CAN_INST, RX_STD_MAILBOX, &rxStdMsg); |