请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
liqing666 提问时间:2017-9-14 22:37 /
如题,我是想用CAN1,CAN2,CAN3分别独立收发数据,但现在只有CAN1能正常收发,CAN2,CAN3只能发,不能中断接收,代码配置如下,求大神们帮我看看:
int CAN_Config(void)
{
          CAN_FilterConfTypeDef  sFilterConfig;
          static CanTxMsgTypeDef        TxMessage2;
          static CanRxMsgTypeDef        RxMessage2;
          static CanTxMsgTypeDef        TxMessage1;
          static CanRxMsgTypeDef        RxMessage1;
          static CanTxMsgTypeDef        TxMessage;
          static CanRxMsgTypeDef        RxMessage;
          //CAN1  初始化  25MHz  125kbps
          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 初始化  25MHz  125kbps
          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[i] = CanHandle->pRxMsg->Data[i];               
                                }
                                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[i] = CanHandle->pRxMsg->Data[i];               
                                }
                                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[i] = CanHandle->pRxMsg->Data[i];               
                                }                       
                                HAL_CAN_Receive_IT(CanHandle, CAN_FIFO0);
                                __HAL_CAN_ENABLE_IT(&CanHandleToDC,CAN_IT_FMP0);
                        }
        }
}

收藏 评论4 发布时间:2017-9-14 22:37

举报

4个回答
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。。。 ...

时间不等人呐
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版