牛卧堂MCU技术交流

标题: NUC240 CAN bus遇到bus-off如何自动恢复 [打印本页]

作者: assman    时间: 2022-3-17 18:15
标题: NUC240 CAN bus遇到bus-off如何自动恢复
各位大大安安,我在BSP中CAN范例遇到CAN bus中断进到bus-off状态问题,导至message无法传送,想问除了重新上电复位之外,如何初始化让CAN bus自动恢复?
  1. void CAN0_IRQHandler(void)
  2. {
  3.     uint32_t u8IIDRstatus;

  4.     u8IIDRstatus = CAN0->IIDR;

  5.     if(u8IIDRstatus == 0x00008000) {      /* Check Status Interrupt Flag (Error status Int and Status change Int) */
  6.         /**************************/
  7.         /* Status Change interrupt*/
  8.         /**************************/
  9.         if(CAN0->STATUS & CAN_STATUS_RXOK_Msk) {
  10.             CAN0->STATUS &= ~CAN_STATUS_RXOK_Msk;   /* Clear RxOK status*/

  11.             printf("RxOK INT\n") ;
  12.         }

  13.         if(CAN0->STATUS & CAN_STATUS_TXOK_Msk) {
  14.             CAN0->STATUS &= ~CAN_STATUS_TXOK_Msk;    /* Clear TxOK status*/

  15.             printf("TxOK INT\n") ;
  16.         }

  17.         /**************************/
  18.         /* Error Status interrupt */
  19.         /**************************/
  20.         if(CAN0->STATUS & CAN_STATUS_EWARN_Msk) {
  21.             printf("EWARN INT\n") ;
  22.         }

  23.         if(CAN0->STATUS & CAN_STATUS_BOFF_Msk) {
  24.             printf("BOFF INT\n") ;
  25.         }
  26.     } else if(u8IIDRstatus != 0) {
  27.         printf("=> Interrupt Pointer = %d\n", CAN0->IIDR - 1);

  28.         CAN_MsgInterrupt(CAN0, u8IIDRstatus);

  29.         CAN_CLR_INT_PENDING_BIT(CAN0, ((CAN0->IIDR) - 1)); /* Clear Interrupt Pending */
  30.     } else if(CAN0->WU_STATUS == 1) {
  31.         printf("Wake up\n");

  32.         CAN0->WU_STATUS = 0;     /* Write '0' to clear */
  33.     }

  34. }
复制代码





作者: admin    时间: 2022-3-18 16:35
可以参考M480的处理。
作者: admin    时间: 2022-3-18 16:36


作者: admin    时间: 2022-3-18 16:36
前提是总线上的错误消失,否则下次还会出错
作者: assman    时间: 2022-3-21 14:26
了解,感谢版大提醒~




欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/) Powered by Discuz! X3.2