具有双CAN的STM32 - 配置过滤器

问题描述 投票:0回答:1

在尝试在具有 2 个 CAN 总线的 STM32F105 上设置过滤器时寻求有关奇怪问题的帮助 - 16 位列表模式下的过滤器仅适用于前 2 个组。但相同的配置适用于具有单 CAN 总线的 STM32F103。

这是代码:

bool CanSetFilter(CAN_HandleTypeDef *can, uint8_t bank, uint16_t id1, uint16_t id2, uint16_t id3, uint16_t id4) {
  return CanSetFilterList16bit(can, bank, (uint32_t(id1)<<21) | (uint32_t(id2)<<5), (uint32_t(id3)<<21) | (uint32_t(id4)<<5), CAN_FILTERMODE_IDLIST, CAN_FILTERSCALE_16BIT, CAN_FILTER_FIFO0);
}

bool CanSetFilterList16bit(CAN_HandleTypeDef *can, uint8_t bank_num, uint32_t filter_id, uint32_t mask, uint32_t filter_mode, uint32_t filter_scale, uint32_t fifo) {
  CAN_FilterTypeDef sFilterConfig;
  sFilterConfig.FilterBank = bank_num;
  sFilterConfig.FilterMode = filter_mode;
  sFilterConfig.FilterScale = filter_scale;
  sFilterConfig.FilterFIFOAssignment = fifo;
  sFilterConfig.FilterActivation = ENABLE;
  sFilterConfig.FilterIdHigh = filter_id&0xFFFF;
  sFilterConfig.FilterIdLow = filter_id>>16;
  sFilterConfig.FilterMaskIdHigh = mask&0xFFFF;
  sFilterConfig.FilterMaskIdLow = mask>>16;
  bool result = (HAL_CAN_ConfigFilter(can, &sFilterConfig ) == HAL_OK);
  return result;
}

// and apply filters:
uint16_t canFilterIds[] = {
    0x076, 0x077, 0x07D, 0x167, 
    0x171, 0x204, 0x213, 0x217, 
    0x230, 0x3B3, 0x42F, 0x43E, // < this goes to bank 3 and doesn't work in result
};

const int canFiltersCount = sizeof(canFilterIds) / sizeof(canFilterIds[0]);
int filter = 0;
for (int i=0; (i<canFiltersCount) && (filter<28); filter++) {
    uint32_t f1 = (i<canFiltersCount) ? canFilterIds[i++] : canFilterIds[i];
    uint32_t f2 = (i<canFiltersCount) ? canFilterIds[i++] : canFilterIds[i];
    uint32_t f3 = (i<canFiltersCount) ? canFilterIds[i++] : canFilterIds[i];
    uint32_t f4 = (i<canFiltersCount) ? canFilterIds[i++] : canFilterIds[i];
    CanSetFilter(&hcan1, filter, f1, f2, f3, f4);
}

我在调试模式下看到

CanSetFilter(...)
的所有三个调用都成功。这是
CAN_FilterTypeDef
中的相应结果:

我不知道问题是什么,所以期待是否有人有一个有效的示例或遇到了这个问题。

filter stm32 can-bus hal
1个回答
0
投票

好的,问题出在 CAN 2 的过滤器初始化中。应该禁用我设置的过滤器

sFilterConfig.FilterBank = 27;
。它会导致不正确的行为。当我将其更改为
sFilterConfig.FilterBank = 0;
时,效果很好。 这是 CAN2 总线的过滤器初始化代码,它禁用过滤器,但保持过滤器为 CAN1 工作,也许对某人有帮助。

CAN_FilterTypeDef sFilterConfig;
sFilterConfig.FilterBank = 0;
sFilterConfig.FilterActivation = CAN_FILTER_DISABLE;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh = 0x0000;
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0x0000;
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO1;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.SlaveStartFilterBank = 28;
HAL_result = HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig);

受到此处讨论的启发:https://community.st.com/t5/stm32-mcus-products/how-to-configure-can-filters-to-use-can1-and-can2-parallelly/td-p /56553

© www.soinside.com 2019 - 2024. All rights reserved.