CAN 过滤器配置:双滤波模式实现
if (CAN_InitStruct->Filter == CLOSE) { *(uint32_t *)&MSCAN->CANIDAR_BANK_1[0] = 0xFFFFFFFF; *(uint32_t *)&MSCAN->CANIDMR_BANK_1[0] = 0xFFFFFFFF; *(uint32_t *)&MSCAN->CANIDAR_BANK_2[0] = 0xFFFFFFFF; *(uint32_t *)&MSCAN->CANIDMR_BANK_2[0] = 0xFFFFFFFF; } else { MSCAN->CANIDAC = 0x00; // 双滤波 // 第一组 MSCAN->CANIDAR_BANK_1[0] = CAN_InitStruct->RID >> 3; MSCAN->CANIDAR_BANK_1[1] = CAN_InitStruct->RID << 5; MSCAN->CANIDAR_BANK_1[2] = 0xFF; MSCAN->CANIDAR_BANK_1[3] = 0xFF; MSCAN->CANIDMR_BANK_1[0] = 0x00; MSCAN->CANIDMR_BANK_1[1] = 0x1F; MSCAN->CANIDMR_BANK_1[2] = 0xFF; MSCAN->CANIDMR_BANK_1[3] = 0xFF; // 第二组 MSCAN->CANIDAR_BANK_2[0] = CAN_InitStruct->RID >> 3; MSCAN->CANIDAR_BANK_2[1] = CAN_InitStruct->RID << 5; MSCAN->CANIDAR_BANK_2[2] = 0xFF; MSCAN->CANIDAR_BANK_2[3] = 0xFF; MSCAN->CANIDMR_BANK_2[0] = 0x00; MSCAN->CANIDMR_BANK_2[1] = 0x1F; MSCAN->CANIDMR_BANK_2[2] = 0xFF; MSCAN->CANIDMR_BANK_2[3] = 0xFF; } 这段程序是用来配置 CAN 过滤器的。根据传入的 CAN_InitStruct->Filter 值,进行不同的配置。 如果 CAN_InitStruct->Filter 等于 CLOSE,则关闭过滤器,将 MSCAN 寄存器的 CANIDAR_BANK_1、CANIDMR_BANK_1、CANIDAR_BANK_2 和 CANIDMR_BANK_2 都设置为 0xFFFFFFFF。 否则,说明需要开启过滤器,首先将 MSCAN 寄存器的 CANIDAC 设置为 0x00,表示双滤波模式。 然后,根据传入的 CAN_InitStruct->RID 来配置过滤器。 第一组过滤器的设置为: - CANIDAR_BANK_1[0] 和 CANIDAR_BANK_1[1] 分别为 CAN_InitStruct->RID 右移 3 位和左移 5 位的结果,用来设置过滤器的标识符。 - CANIDAR_BANK_1[2] 和 CANIDAR_BANK_1[3] 设置为 0xFF,表示不对标识符的扩展位进行过滤。 - CANIDMR_BANK_1[0] 设置为 0x00,表示不对标识符的位 0 进行过滤。 - CANIDMR_BANK_1[1] 设置为 0x1F,表示对标识符的位 1-5 进行过滤。 - CANIDMR_BANK_1[2] 和 CANIDMR_BANK_1[3] 设置为 0xFF,表示不对标识符的位 6-31 进行过滤。 第二组过滤器的设置与第一组类似。 总的来说,这段程序通过修改 MSCAN 寄存器的相应位来配置 CAN 过滤器,从而过滤出需要的 CAN 消息。
原文地址: https://www.cveoy.top/t/topic/p1cS 著作权归作者所有。请勿转载和采集!