STM32F1 HAL CAN2未接收

STM32F1 HAL CAN2未接收,stm32,can-bus,stm32-hal,Stm32,Can Bus,Stm32 Hal,我使用的是带有STM32F107VCT6控制器的定制板。该板的主要用途是连接两个can网络,进行一些计算,并通过SPI将一些数据中继到另一个控制器,将一些数据中继到另一个can网络,反之亦然 我有CAN1网络的接收和传输,完全符合我的要求;但是,CAN2网络只能传输(因此不是硬件故障) 复制代码后,如许多其他论坛所建议,将过滤器组更改为大于14的值;除了将其他要求设置为更改为CAN2外,它仍然不会在中断或轮询模式下接收 我使用STM32Cube MX生成了与CAN1相同的初始化代码,尽管在具有不

我使用的是带有STM32F107VCT6控制器的定制板。该板的主要用途是连接两个can网络,进行一些计算,并通过SPI将一些数据中继到另一个控制器,将一些数据中继到另一个can网络,反之亦然

我有CAN1网络的接收和传输,完全符合我的要求;但是,CAN2网络只能传输(因此不是硬件故障)

复制代码后,如许多其他论坛所建议,将过滤器组更改为大于14的值;除了将其他要求设置为更改为CAN2外,它仍然不会在中断或轮询模式下接收

我使用STM32Cube MX生成了与CAN1相同的初始化代码,尽管在具有不同中断优先级的不同总线上

但是代码不起作用,就好像总线上没有消息一样。我正在使用微芯片CAN总线分析仪发送和接收测试信息

另一个细节:我仍然让CAN1运行,只是没有数据;因此,它的所有时钟仍在运行

以下是我的测试代码:

主回路 非常感谢您的任何意见, 干杯
Tom

在过滤器配置中,添加额外的行,说明从属过滤器组的起始数量

sFilterConfig2.SlaveStartBankNumber=14


这样,CAN过滤器组就可以被分为两个不同的部分。然后,您可以对CAN2使用14到28之间的过滤器组编号。

在过滤器配置中,添加额外的行,说明从属过滤器组的起始编号

sFilterConfig2.SlaveStartBankNumber=14

这样,CAN过滤器组就可以被分为两个不同的部分。然后,您可以对CAN2使用14到28之间的过滤器组编号

int main(void)
{
  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  MX_CAN1_Init();
  MX_CAN2_Init();
  MX_RTC_Init();
  MX_SPI1_Init();
  MX_USART1_UART_Init();

  CAN_FilterConfTypeDef  sFilterConfig2;

  sFilterConfig2.FilterNumber = 0;
  sFilterConfig2.FilterMode = CAN_FILTERMODE_IDMASK;
  sFilterConfig2.FilterScale = CAN_FILTERSCALE_32BIT;
  sFilterConfig2.FilterIdHigh = 0x0000;
  sFilterConfig2.FilterIdLow = 0x0000;
  sFilterConfig2.FilterMaskIdHigh = 0x0000;
  sFilterConfig2.FilterMaskIdLow = 0x0000;
  sFilterConfig2.FilterFIFOAssignment = CAN_FILTER_FIFO1;
  sFilterConfig2.FilterActivation = ENABLE;
  sFilterConfig2.BankNumber = 20;

  HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig2);

  hcan2.pRxMsg = &RxMessage2;


    while (1)
    {

        HAL_CAN_Receive (&hcan2, CAN_FIFO1, 1000);

        {
            uint8_t buf[100], l = sprintf(buf, " ID: %d DLC: %d Data: %d %d %d %d %d %d %d %d \n\r", RxMessage2.StdId, RxMessage2.DLC, RxMessage2.Data[0], RxMessage2.Data[1], RxMessage2.Data[2], RxMessage2.Data[3], RxMessage2.Data[4], RxMessage2.Data[5], RxMessage2.Data[6], RxMessage2.Data[7]);
            HAL_UART_Transmit(&huart1, buf, l, 1000);
        }

        if (RxMessage2.StdId !=0) {
            while(1);
        }
    }
}