在 KEA128 控制器中,可以通过以下步骤初始化 CAN 并设置过滤功能:

  1. 打开 MSCAN 模块的时钟控制。
SIM->SCGC |= SIM_SCGC_MSCAN_MASK; // 打开 MSCAN 模块时钟
  1. 关闭 MSCAN 模块。
MSCAN->CANCTL0 &= ~MSCAN_CANCTL0_INITRQ_MASK; // 关闭 MSCAN 模块
while((MSCAN->CANCTL1 & MSCAN_CANCTL1_INITAK_MASK) != 0); // 等待 MSCAN 模块关闭
  1. 配置 MSCAN 模块的控制寄存器。
MSCAN->CANCTL1 = MSCAN_CANCTL1_CLKSRC_MASK; // 使用系统时钟
MSCAN->CANCTL0 |= MSCAN_CANCTL0_CSWAI_MASK; // 进入等待模式时继续工作
  1. 配置 MSCAN 模块的过滤器。
// 设置过滤器 1
MSCAN->CANIDAR_BANK_1[0] = 0x18FF5018; // 过滤 0x18FF5018 CAN ID
MSCAN->CANIDMR_BANK_1[0] = 0xFF; // 掩码设置为 0xFF,匹配所有位

// 设置过滤器 2
MSCAN->CANIDAR_BANK_1[1] = 0x18FEE23A; // 过滤 0x18FEE23A CAN ID
MSCAN->CANIDMR_BANK_1[1] = 0xFF; // 掩码设置为 0xFF,匹配所有位

// 启用过滤器 1 和 2
MSCAN->CANIDAC = MSCAN_CANIDAC_IDAM(0x01); // 使用 32 位过滤器
  1. 打开 MSCAN 模块。
MSCAN->CANCTL0 |= MSCAN_CANCTL0_INITRQ_MASK; // 打开 MSCAN 模块
while((MSCAN->CANCTL1 & MSCAN_CANCTL1_INITAK_MASK) == 0); // 等待 MSCAN 模块打开

完整的 CAN 初始化代码如下所示:

#include "SKEAZ1284.h"

void CAN_Init(void)
{
    SIM->SCGC |= SIM_SCGC_MSCAN_MASK; // 打开 MSCAN 模块时钟

    MSCAN->CANCTL0 &= ~MSCAN_CANCTL0_INITRQ_MASK; // 关闭 MSCAN 模块
    while((MSCAN->CANCTL1 & MSCAN_CANCTL1_INITAK_MASK) != 0); // 等待 MSCAN 模块关闭

    MSCAN->CANCTL1 = MSCAN_CANCTL1_CLKSRC_MASK; // 使用系统时钟
    MSCAN->CANCTL0 |= MSCAN_CANCTL0_CSWAI_MASK; // 进入等待模式时继续工作

    // 设置过滤器 1
    MSCAN->CANIDAR_BANK_1[0] = 0x18FF5018; // 过滤 0x18FF5018 CAN ID
    MSCAN->CANIDMR_BANK_1[0] = 0xFF; // 掩码设置为 0xFF,匹配所有位

    // 设置过滤器 2
    MSCAN->CANIDAR_BANK_1[1] = 0x18FEE23A; // 过滤 0x18FEE23A CAN ID
    MSCAN->CANIDMR_BANK_1[1] = 0xFF; // 掩码设置为 0xFF,匹配所有位

    // 启用过滤器 1 和 2
    MSCAN->CANIDAC = MSCAN_CANIDAC_IDAM(0x01); // 使用 32 位过滤器

    MSCAN->CANCTL0 |= MSCAN_CANCTL0_INITRQ_MASK; // 打开 MSCAN 模块
    while((MSCAN->CANCTL1 & MSCAN_CANCTL1_INITAK_MASK) == 0); // 等待 MSCAN 模块打开
}

这样,CAN 模块就被初始化并设置了过滤功能,可以接收到符合过滤条件的 CAN 消息。

KEA128 控制器 CAN 模块初始化及过滤功能设置

原文地址: https://www.cveoy.top/t/topic/pkj5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录