前言:
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要取消当前发送数据
上一篇:Bootloader升级方式一———擦、写flash在RAM中运行
下一篇:STM8的IAP在线升级
推荐阅读最新更新时间:2024-11-10 23:30
设计资源 培训 开发板 精华推荐
- STM32 OpenSource Multimeter - 适合DIY入门的开源万用表
- 用于仪表的 16 位、50MSPS、1CH DAC
- altera下载器-stm32
- DER-32 - 22W 3 路输出 DC/DC 转换器
- 使用 NXP Semiconductors 的 TDA8592J 的参考设计
- LTM4630IV 2 相、1.5V、36A 输出 DC/DC 稳压器的典型应用电路
- stlinkv3mod-bridge
- 使用 ON Semiconductor 的 KA7810E 的参考设计
- AD8058AR-EBZ,AD8058ARZ 双通道高速运算放大器评估板,采用 8 引脚 SOIC 封装
- NSI45025AT1G 用于基本交流应用的恒流 LED 驱动器的典型应用