STM8做BUS OFF快慢恢复策略

前言:

CAN总线上出现错误会导致CAN控制器进入BUS OFF状态,具体的可以参考CAN的规范。

CAN控制器提供自动恢复和手动恢复功能。

1.自动恢复

自动恢复比较简单,初始化的时候打开自动恢复功能。要求不高的话建议打开,否则CAN BUS OFF一直无法恢复通信。

CAN->MCR |= CAN_MasterCtrl_AutoBusOffManagement;/*atuo bus off recovery */

2.手动恢复

一般车厂要求ECU不能自动恢复,而是先快恢复后慢恢复。

常用的就是:先100ms恢复5次,然后是1000ms恢复一次。

具体的就是:

(1)发生BUS OFF后,立即关闭TX,然后重置CAN控制器

(2)快恢复次数+1

(3)快恢复次数<5则设置恢复时间为100ms,否则,恢复时间设置1000ms

(4)恢复时间到了,就打开TX

(5)成功发送报文则清零快恢复次数

初始化时打开相关中断

  CAN_ITConfig(CAN_IT_FMP,ENABLE); 
  CAN_ITConfig(CAN_IT_BOF,ENABLE); 
  CAN_ITConfig(CAN_IT_ERR,ENABLE); 

中断里这样写

INTERRUPT_HANDLER(CAN_TX_IRQHandler, 9)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
  
  if(CAN_GetITStatus(CAN_IT_BOF) == SET)
  {
    //这里加你的CAN初始函数,将CAN重新初始化CAN_Init(……);
    BusOff_Confirm();
    CAN_ClearITPendingBit(CAN_IT_BOF);
  }
  else if(CAN_GetITStatus(CAN_IT_TME) == SET)
  {
    BusOff_ResetFastCounter();
    CAN_ClearITPendingBit(CAN_IT_TME);
  }
  
}

注意这样CAN_CancelTransmit这里一定要用的,否则会有问题

void BusOff_ResetFastCounter(void)
{
  fastRecoveryCounter = 0;
}

void BusOff_Confirm(void)
{
#ifdef CFG_ENABLE_FAST_RECOVERY
  if(fastRecoveryCounter < CFG_FAST_RECOVERY_CNT)
  {
    recoveryTime = CFG_FAST_RECOVERY_TIME;
    fastRecoveryCounter++;
  }
  else
#endif
    recoveryTime = CFG_SLOW_RECOVERY;
  CAN_CancelTransmit(CAN_TransmitMailBox_0);
  CAN_CancelTransmit(CAN_TransmitMailBox_1);
  CAN_CancelTransmit(CAN_TransmitMailBox_2);
  CAN_DrvInit();
  BusOff_Flag = 1;
}

总结:

1.相关中断一定要打开

2.BUS OFF自动手动恢复要配置对

3.发生BUS OFF要取消当前发送数据

  • 9
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
STM32 FDCAN是STMicroelectronics(意法半导体)生产的一款高性能CAN(控制器区域网络)控制器,具有广泛的用途。在CAN网络通信中,如果发生“bus off”(总线失效)的情况,意味着CAN控制器无法正常发送和接收CAN消息。 造成STM32 FDCAN“bus off”的原因可能有多种。以下是一些常见的原因及其解决方法: 1. 总线干扰:当CAN总线受到强电磁干扰或电压噪声时,可能会导致总线失效。在解决这个问题时,可以尝试在CAN网络线路上添加滤波器或使用屏蔽线缆来减少干扰。 2. 通信错误:如果CAN控制器无法正确发送或接收CAN消息,也可能导致总线失效。可以通过检查硬件电路,确认CAN线连接正确,检查中断和错误处理函数的实现是否正确来排除这种问题。 3. 错误配置:对于FDCAN控制器的配置参数(如速率、节点地址、传输协议等)的错误设置也可能导致总线失效。可以通过重新配置FDCAN控制器的参数,并确保参数与通信网络的要求匹配来解决这个问题。 在发生“bus off”后,STM32 FDCAN通常会自动尝试恢复并重新连接到CAN总线。但如果问题无法解决,可以通过硬件复位或重新初始化FDCAN控制器来恢复总线连接。 总的来说,当STM32 FDCAN发生总线失效问题时,需要仔细检查硬件和配置,并采取相应的措施来解决问题,以确保CAN网络的正常通信。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值