问答

汇集网友智慧,解决技术难题

21ic问答首页 - HC32F460 CAN通讯问题

hc32f460 CAN

HC32F460 CAN通讯问题

luckyren2023-01-13
本帖最后由 luckyren 于 2023-1-13 09:04 编辑

我在调试HC32F460的CAN通讯时发现如果同时收到了两帧数据,第二帧数据会保存下来,导致下面接收的数据是上一帧的数据,然后后面的接收都错位了,中断里也清标志位了,有人指导一下吗?我的初始化及中断接收处理如下:
  1. static void CanInitConfig(uint16_t CAN_Baud_Rate)
  2. {
  3.     stc_can_init_config_t stcCanInitCfg;
  4.     stc_can_filter_t astcFilters[CAN_FILTERS_COUNT] = \
  5.     {
  6.         {0x00000000ul, 0x111ul, CanFilterSel1, CanAllFrames}
  7.     };

  8.     //<< Enable can peripheral clock and buffer(ram)
  9.     PWC_RamOpMdConfig(HighSpeedMd);
  10.     PWC_RamPwrdownCmd(PWC_RAMPWRDOWN_CAN, Enable);
  11.     PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_CAN, Enable);

  12.     //<< CAN GPIO config
  13.     PORT_SetFunc(PortC, Pin06, Func_Can1_Rx, Disable);
  14.     PORT_SetFunc(PortC, Pin07, Func_Can1_Tx, Disable);

  15.     MEM_ZERO_STRUCT(stcCanInitCfg);
  16.     //<< Can bit time config
  17.     switch(CAN_Baud_Rate)
  18.     {
  19.         case 1000:      //1M
  20.             stcCanInitCfg.stcCanBt.PRESC = 1u-1u;
  21.             break;
  22.         case 500:       //500K
  23.             stcCanInitCfg.stcCanBt.PRESC = 2u-1u;
  24.         break;
  25.         case 250:       //250K
  26.             stcCanInitCfg.stcCanBt.PRESC = 4u-1u;
  27.         break;
  28.         case 125:       //125K
  29.             stcCanInitCfg.stcCanBt.PRESC = 8u-1u;
  30.         break;
  31.         case 100:       //100K
  32.             stcCanInitCfg.stcCanBt.PRESC = 10u-1u;
  33.         break;
  34.         default:
  35.             stcCanInitCfg.stcCanBt.PRESC = 2u-1u;
  36.         break;                                                                       
  37.     }
  38.    
  39.     stcCanInitCfg.stcCanBt.SEG_1 = 5u-2u;
  40.     stcCanInitCfg.stcCanBt.SEG_2 = 3u-1u;
  41.     stcCanInitCfg.stcCanBt.SJW   = 3u-1u;

  42.     stcCanInitCfg.stcWarningLimit.CanErrorWarningLimitVal = 10u;
  43.     stcCanInitCfg.stcWarningLimit.CanWarningLimitVal = 16u-1u;

  44.     stcCanInitCfg.enCanRxBufAll  = CanRxNormal;
  45.     stcCanInitCfg.enCanRxBufMode = CanRxBufNotStored;
  46.     stcCanInitCfg.enCanSAck      = CanSelfAckDisable;
  47.     stcCanInitCfg.enCanSTBMode   = CanSTBFifoMode;

  48.     stcCanInitCfg.pstcFilter     = astcFilters;

  49.     stcCanInitCfg.u8FilterCount  = CAN_FILTERS_COUNT;

  50.     CAN_Init(&stcCanInitCfg);

  51.     stc_irq_regi_conf_t     stcIrqRegiConf;

  52.     stcIrqRegiConf.enIRQn = Int000_IRQn;
  53.     stcIrqRegiConf.enIntSrc = INT_CAN_INT;
  54.     stcIrqRegiConf.pfnCallback = &CAN_RxIrqCallBack;
  55.     enIrqRegistration(&stcIrqRegiConf);
  56.     NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
  57.     NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);
  58.     NVIC_EnableIRQ(stcIrqRegiConf.enIRQn);
  59. }
  1. static void CAN_RxIrqCallBack(void)
  2. {
  3.     if(true == CAN_Irq**Get(CanRxIrq**))
  4.     {
  5.         CAN_Irq**Clr(CanRxIrq**);
  6.         CAN_IrqCmd(CanRxIrqEn, Disable);         
  7.         CAN_Receive(&stcRxFrame);
  8. //        rt_kprintf("stcRxFrame.Cst.Control_f.DLC = %d\r\n",stcRxFrame.Cst.Control_f.DLC);
  9. //        rt_kprintf("stcRxFrame.Cst.Control_f.IDE = %d\r\n",stcRxFrame.Cst.Control_f.IDE);


  10.         can_RX_flag = 1;
  11.         
  12.     }
  13.     if(true == CAN_Irq**Get(CanTxPrimaryIrq**))
  14.     {
  15.         CAN_Irq**Clr(CanTxPrimaryIrq**);
  16.         CAN_IrqCmd(CanRxIrqEn, Enable);
  17.     }
  18.     //总线忙碌中断
  19.     if(true == CAN_Irq**Get(CanBusErrorIrq**))
  20.     {
  21.         CAN_Irq**Clr(CanBusErrorIrq**);
  22.     }   
  23.     //仲裁失败中断
  24.     if(true == CAN_Irq**Get(CanArbiLostIrq**))
  25.     {
  26.         CAN_Irq**Clr(CanArbiLostIrq**);
  27.     }
  28.     if(true == CAN_Irq**Get(CanRxOverIrq**))  
  29.     {
  30.         CAN_Irq**Clr(CanRxOverIrq**);
  31. //        for (size_t i = 0; i < 10; i++)
  32. //        {
  33. //            CAN_Receive(&stcRxFrame);
  34. //            rt_kprintf("stcRxFrame.Cst.Control_f.DLC = %d\r\n",stcRxFrame.Cst.Control_f.DLC);
  35. //            rt_kprintf("stcRxFrame.Cst.Control_f.IDE = %d\r\n",stcRxFrame.Cst.Control_f.IDE);
  36. //        }

  37.     }
  38.     if(true == CAN_Irq**Get(CanErrorIrq**))  
  39.     {
  40.         //gData.ResetCanF=1;
  41.         CAN_Irq**Clr(CanErrorIrq**);      
  42.     }   
  43.     if(true == CAN_Irq**Get(CanErrorWarningIrq**))  
  44.     {
  45.         //gData.ResetCanF=1;
  46.         CAN_Irq**Clr(CanErrorWarningIrq**);      
  47.     }      
  48.     if(true == CAN_Irq**Get(CanErrorPassivenodeIrq**))  
  49.     {
  50.         //gData.ResetCanF=1;
  51.         CAN_Irq**Clr(CanErrorPassivenodeIrq**);      
  52.     }
  53.    
  54.     if(true == CAN_Irq**Get(CanTxBufFullIrq**))  
  55.     {
  56.         CAN_Irq**Clr(CanTxBufFullIrq**);      
  57.     }
  58.      
  59.     if(true == CAN_Irq**Get(CanRxBufFullIrq**))  
  60.     {
  61.         CAN_Irq**Clr(CanRxBufFullIrq**);
  62.         //CAN_Receive(&stcRxFrame);

  63. //        memset(rxCanBuff,0,sizeof(rxCanBuff));
  64. //        memset(txCanBuff,0,sizeof(txCanBuff));
  65. //        memset(&stcRxFrame,0,sizeof(stcRxFrame));
  66. //        putCan_Data(txCanBuff,8,rxCanBuff[2]);
  67.             
  68.     }

  69.     if(true == CAN_Irq**Get(CanRxBufAlmostFullIrq**))  
  70.     {
  71.         CAN_Irq**Clr(CanRxBufAlmostFullIrq**);      
  72.     }
  73.    
  74.     if(true == CAN_Irq**Get(CanTxSecondaryIrq**))  
  75.     {
  76.         CAN_Irq**Clr(CanTxSecondaryIrq**);      
  77.     }
  78.    
  79.     if(true == CAN_Irq**Get(CanAbortIrq**))  
  80.     {
  81.         CAN_Irq**Clr(CanAbortIrq**);      
  82.     }

  83.     if(true == CAN_Irq**Get(CanErrorPassiveIrq**))  
  84.     {
  85.         CAN_Irq**Clr(CanErrorPassiveIrq**);      
  86.     }        
  87. }


回答 +关注 14
12626人浏览 21人回答问题 分享 举报
21 个回答
12下一页

您需要登录后才可以回复 登录 | 注册