在 KEA128 控制器中,可以使用以下代码初始化 CAN 并设置过滤功能:

#include "kea128_mscan.h"

void CAN_Init(void) {
    // 初始化 MSCAN 控制器
    MSCAN->CANCTL0 = MSCAN_CANCTL0_INITRQ_MASK;
    while (!(MSCAN->CANCTL1 & MSCAN_CANCTL1_INITAK_MASK)) {}
    
    // 设置 MSCAN 控制器为环回模式
    MSCAN->CANCTL1 = MSCAN_CANCTL1_CANE_MASK | MSCAN_CANCTL1_CLKSRC_MASK | MSCAN_CANCTL1_LOOPB_MASK;
    
    // 设置过滤功能
    MSCAN->CANIDAR_BANK_0 = (0x18FF5018 >> 3) & 0xFF;
    MSCAN->CANIDAR_BANK_1 = ((0x18FF5018 << 5) & 0xE0) | MSCAN_CANIDAR_BANK_IDE_MASK;
    MSCAN->CANIDMR_BANK_0 = 0xFF;
    MSCAN->CANIDMR_BANK_1 = 0xFF;
    
    MSCAN->CANIDAR_BANK_2 = (0x18FEE23A >> 3) & 0xFF;
    MSCAN->CANIDAR_BANK_3 = ((0x18FEE23A << 5) & 0xE0) | MSCAN_CANIDAR_BANK_IDE_MASK;
    MSCAN->CANIDMR_BANK_2 = 0xFF;
    MSCAN->CANIDMR_BANK_3 = 0xFF;
    
    // 退出初始化模式,开始正常工作
    MSCAN->CANCTL0 = MSCAN_CANCTL0_SYNCH_MASK;
    while (MSCAN->CANCTL1 & MSCAN_CANCTL1_INITAK_MASK) {}
}

在以上代码中,我们首先将 MSCAN 控制器设置为初始化模式,然后设置 CAN 控制器为环回模式,这样我们可以在不连接 CAN 总线的情况下测试 CAN 功能。

接下来,我们设置过滤功能。MSCAN 控制器的过滤功能是通过 CANIDAR_BANK 和 CANIDMR_BANK 寄存器来设置的。我们将 CAN ID 右移 3 位得到的值写入 CANIDAR_BANK_0 和 CANIDAR_BANK_2 寄存器,将 CAN ID 左移 5 位并与 0xE0 进行按位或运算,然后再加上 MSCAN_CANIDAR_BANK_IDE_MASK(表示扩展帧)后的值写入 CANIDAR_BANK_1 和 CANIDAR_BANK_3 寄存器。CANIDMR_BANK_0 和 CANIDMR_BANK_2 寄存器则设置为 0xFF,表示不对对应位进行匹配。

最后,我们退出初始化模式,开始正常工作。

请注意,以上代码中的 MSCAN_CANIDAR_BANK_IDE_MASK 是一个宏定义,表示扩展帧的标志位。具体的宏定义可能会因不同的 MCU 型号而有所不同,请根据您所使用的 MCU 型号进行相应的修改。

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

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

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