liqing666 发表于 2017-9-14 22:37:15

STM32F767用CUBE配置的CAN1能正常收发数据,CAN2和CAN3则不行

如题,我是想用CAN1,CAN2,CAN3分别独立收发数据,但现在只有CAN1能正常收发,CAN2,CAN3只能发,不能中断接收,代码配置如下,求大神们帮我看看:
int CAN_Config(void)
{
          CAN_FilterConfTypeDefsFilterConfig;
          static CanTxMsgTypeDef      TxMessage2;
          static CanRxMsgTypeDef      RxMessage2;
          static CanTxMsgTypeDef      TxMessage1;
          static CanRxMsgTypeDef      RxMessage1;
          static CanTxMsgTypeDef      TxMessage;
          static CanRxMsgTypeDef      RxMessage;
          //CAN1初始化25MHz125kbps
          CanHandleToBMS1.Instance = CAN1;
          CanHandleToBMS1.pTxMsg = &TxMessage1;
          CanHandleToBMS1.pRxMsg = &RxMessage1;
          //CAN1工作模式及波特率配置
          CanHandleToBMS1.Init.TTCM = DISABLE;
          CanHandleToBMS1.Init.ABOM = ENABLE;
          CanHandleToBMS1.Init.AWUM = DISABLE;
          CanHandleToBMS1.Init.NART = DISABLE;
          CanHandleToBMS1.Init.RFLM = ENABLE;
          CanHandleToBMS1.Init.TXFP = DISABLE;
          CanHandleToBMS1.Init.Mode =CAN_MODE_NORMAL;
          CanHandleToBMS1.Init.SJW = CAN_SJW_1TQ;
          CanHandleToBMS1.Init.BS1 = CAN_BS1_4TQ;
          CanHandleToBMS1.Init.BS2 = CAN_BS2_5TQ;
          CanHandleToBMS1.Init.Prescaler = 20;
          if(HAL_CAN_Init(&CanHandleToBMS1)!=HAL_OK)
                  return 1;
          //CAN1过滤器使能FIFO0
          sFilterConfig.FilterNumber = 0;
          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_FIFO0;
          sFilterConfig.FilterActivation = ENABLE;
          sFilterConfig.BankNumber = 14;
          if(HAL_CAN_ConfigFilter(&CanHandleToBMS1, &sFilterConfig)!=HAL_OK)
                  return 2;

         //CAN2 初始化25MHz125kbps
          CanHandleToBMS2.Instance = CAN2;
          CanHandleToBMS2.pTxMsg = &TxMessage;
          CanHandleToBMS2.pRxMsg = &RxMessage;
       //CAN2工作模式及波特率配置
          CanHandleToBMS2.Init.TTCM = DISABLE;
          CanHandleToBMS2.Init.ABOM = ENABLE;
          CanHandleToBMS2.Init.AWUM = DISABLE;
          CanHandleToBMS2.Init.NART = DISABLE;
          CanHandleToBMS2.Init.RFLM = ENABLE;
          CanHandleToBMS2.Init.TXFP = DISABLE;
          CanHandleToBMS2.Init.Mode = CAN_MODE_NORMAL;
          CanHandleToBMS2.Init.SJW = CAN_SJW_1TQ;
          CanHandleToBMS2.Init.BS1 = CAN_BS1_4TQ;
          CanHandleToBMS2.Init.BS2 = CAN_BS2_5TQ;
          CanHandleToBMS2.Init.Prescaler =20;
          if(HAL_CAN_Init(&CanHandleToBMS2)!=HAL_OK)
                  return 3;
       //CAN2过滤器使能FIFO1
       sFilterConfig.FilterNumber = 14;//14;
       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_FIFO1;
       sFilterConfig.FilterActivation = ENABLE;
       sFilterConfig.BankNumber = 14;
       if(HAL_CAN_ConfigFilter(&CanHandleToBMS2, &sFilterConfig)!=HAL_OK)
              return 4;
//       
   /*##-CAN3初始化 #######################################*/
       CanHandleToDC.Instance = CAN3;
       CanHandleToDC.pTxMsg = &TxMessage2;
       CanHandleToDC.pRxMsg = &RxMessage2;
       //CAN3 初始化 25MHz 125kbps
       CanHandleToDC.Init.TTCM = DISABLE;
       CanHandleToDC.Init.ABOM = ENABLE;
       CanHandleToDC.Init.AWUM = DISABLE;
       CanHandleToDC.Init.NART = DISABLE;
       CanHandleToDC.Init.RFLM = ENABLE;
       CanHandleToDC.Init.TXFP = DISABLE;
       CanHandleToDC.Init.Mode = CAN_MODE_NORMAL;
       CanHandleToDC.Init.SJW = CAN_SJW_1TQ;
       CanHandleToDC.Init.BS1 = CAN_BS1_4TQ;
       CanHandleToDC.Init.BS2 = CAN_BS2_5TQ;
       CanHandleToDC.Init.Prescaler = 20;
       HAL_CAN_Init(&CanHandleToDC);
        //CAN3过滤器使能FIFO0
       sFilterConfig.FilterNumber = 14;
       sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
       sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
       sFilterConfig.FilterIdHigh = 0x0000;
       sFilterConfig.FilterIdLow =0x0000;
       sFilterConfig.FilterMaskIdHigh = 0x0000;//0xFFFF;
       sFilterConfig.FilterMaskIdLow = 0x0000;//0xFF00;
       sFilterConfig.FilterFIFOAssignment = CAN_FIFO0
       sFilterConfig.FilterActivation = ENABLE;
       sFilterConfig.BankNumber = 14;
       HAL_CAN_ConfigFilter(&CanHandleToDC, &sFilterConfig);

   return 0;
}


回调函数如下:
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *CanHandle)
{
        uint8_t i;
        if(CanHandle->pRxMsg->IDE == CAN_ID_EXT)   
        {
                        if(CanHandle->Instance == CAN1)
                        {
                                CANBMS.IDE = CanHandle->pRxMsg->ExtId;
                                CANBMS.DLC = CanHandle->pRxMsg->DLC;
                                for(i=0;i<8;i++)
                                {
                                        CANBMS.Data = CanHandle->pRxMsg->Data;               
                                }
                                LeftCANqueue_push(CANBMS);
                                HAL_CAN_Receive_IT(CanHandle, CAN_FIFO0);       
                                __HAL_CAN_ENABLE_IT(&CanHandleToBMS1,CAN_IT_FMP0);//重新开启FIF00消息挂号中断
                        }
                        if(CanHandle->Instance == CAN2)
                        {       
                                CANBMS.IDE = CanHandle->pRxMsg->ExtId;
                                CANBMS.DLC = CanHandle->pRxMsg->DLC;
                                for(i=0;i<8;i++)
                                {
                                        CANBMS.Data = CanHandle->pRxMsg->Data;               
                                }
                                RightCANqueue_push(CANBMS);                               
                                HAL_CAN_Receive_IT(CanHandle, CAN_FIFO1);
                                __HAL_CAN_ENABLE_IT(&CanHandleToBMS2,CAN_IT_FMP1);
                        }
                        if(CanHandle->Instance == CAN3)
                        {       
                                CANBMS.IDE = CanHandle->pRxMsg->ExtId;
                                CANBMS.DLC = CanHandle->pRxMsg->DLC;
                                for(i=0;i<8;i++)
                                {
                                        CANBMS.Data = CanHandle->pRxMsg->Data;               
                                }                       
                                HAL_CAN_Receive_IT(CanHandle, CAN_FIFO0);
                                __HAL_CAN_ENABLE_IT(&CanHandleToDC,CAN_IT_FMP0);
                        }
        }
}

MrJiu 发表于 2017-9-15 10:28:18

看配置好像都几乎一样。。。。只能帮顶了!!!!

liqing666 发表于 2017-9-15 10:31:46

MrJiu 发表于 2017-9-15 10:28
看配置好像都几乎一样。。。。只能帮顶了!!!!

是的,找不到问题出在哪,急死了!

MrJiu 发表于 2017-9-15 11:02:48

liqing666 发表于 2017-9-15 10:31
是的,找不到问题出在哪,急死了!

其实就是数据手册看少了,数据手册看明白了,然后库里面直接看寄存器。。。啥都OK。。。

liqing666 发表于 2017-9-15 14:52:46

MrJiu 发表于 2017-9-15 11:02
其实就是数据手册看少了,数据手册看明白了,然后库里面直接看寄存器。。。啥都OK。。。 ...

:L时间不等人呐
页: [1]
查看完整版本: STM32F767用CUBE配置的CAN1能正常收发数据,CAN2和CAN3则不行