有没有在像
STM32F777 这样的双 CAN MCU 中使用 CAN1 和 CAN2 的例子,特别是如何使用 ST HAL(立方体)配置滤波器组??
据我了解,过滤器组是共享的。FIFO0和FIFO1也是共享的吗?
为什么会有 CAN2_FMR 寄存器?CAN1_FMR 的 CAN2SB 用于指定用于 CAN1 的滤波器数量。其余 27 个过滤器分配给 CAN2。那么 CAN1_FMR 的 CAN2SB 有什么用?
如果我执行我的软件,CAN1_FMR.FINIT 的 FINIT 变为 0(过滤器激活),但 CAN2_FMR.FINIT 保持在 1(过滤器的初始化模式)。
这是我的代码:
//##-2- 配置 CAN 过滤器 ####################################### ####
filterCfg.FilterFIFOAssignment = CAN_RX_FIFO0;//CAN2 的 CAN_RX_FIFO1 ???
如果(hcan->实例== CAN1){
filterCfg.FilterBank = 0;
}
否则{ // CAN2
filterCfg.FilterBank = 14;
}
// CAN_FILTER_MODE_LIST
如果(initCfg.idSizeType == CAN_EXT_ID){
tmp = (initCfg.SystemCanId & 0x1FFFFFFF) << 3;
// Shift um 3, denn die oberen Bits [31:3] werden verwendet für Vgl
// mit der
Ext.ID[0:29],
// siehe 参考手册:图 500. Filter bank scale configura
tion
}
else{ // CAN_STD_ID
tmp = (initCfg.SystemCanId & 0x000003FF) << 21;
// 链接 Shift um 21, denn die oberen Bits [31:21] werden verwendet
// für den Vgl mit der
Std.ID[0:11]
// siehe 参考手册:图 500. Filter bank scale configuration
}
tmp = (initCfg.SystemCanId & 0x1FFFFFFF) << 3;
filterCfg.FilterIdHigh = (uint16_t)(tmp >> 16);
filterCfg.FilterIdLow = (uint16_t) tmp;
filterCfg.FilterMaskIdHigh = 0x0000;//(uint16_t)(tmp >> 16);
filterCfg.FilterMaskIdLow = 0x0000;//(uint16_t) tmp;
filterCfg.FilterMode = CAN_FILTERMODE_IDLIST;
filterCfg.FilterScale = CAN_FILTERSCALE_32BIT;
filterCfg.FilterActivation = ENABLE;
filterCfg.SlaveStartFilterBank = 14;
如果 (HAL_CAN_ConfigFilter(hcan, &filterCfg) != HAL_OK){
返回 CAN_ERROR_INIT;// 过滤器配置错误
}