历史上的今天
今天是:2025年01月09日(星期四)
2020年01月09日 | STM8做BUS OFF快慢恢复策略
2020-01-09 来源:eefocus
前言:
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要取消当前发送数据
史海拾趣
|
各位高手有没有测试过加速计和陀螺仪这两颗的功能阿,三轴加速计有X,Y,Z三个电压输出,都是经过其内部的AD转换后输出的,不知道这三个方向上的电压是怎么变化的,是有加速度的时候变化呢,还是位置改变了变化啊? 陀螺仪有X,Y两个电压输出,也是 ...… 查看全部问答> |
|
很多MTD驱动都有调用simple_map_init()函数来初始化read,write等函数,不知道这个函数的用法,请大虾帮忙讲一讲啊,如果我需要改变这些read,write函数,该怎么办啦?… 查看全部问答> |
|
求职: 请问有没有人需要高级WINCE工程师--限深圳地区! 求职: 请问有没有人需要高级WINCE驱动工程师--限深圳地区! 如有,请如下EMAIL联系 lumit_hu@126.com… 查看全部问答> |
|
上周在研讨会上买了英蓓特的开发板,试了下,感觉有几个地方不爽,所以就自己动手DIY了:1)USB供电问题,必须插2条USB线,可怜我的本本一共才3个,鼠标用了一个,被他全占了,其它USB-232就没法用了;2)板子附带的1602没有接背光,而实际这 ...… 查看全部问答> |
|
各位高手大家好,小妹我用此板子的UART出了一點問題,大家可以幫幫我嗎? 感激不盡 問題是這樣的,我開啟了八個UART,為了使輸入資料可以做辨識,個別在UART4跟UART5的地方 加了三個#字號跟一個通道編號 例如:UART4是 ###Edata 這樣 ...… 查看全部问答> |
|
SimpliciTI简介: SimpliciTI是TI开发的专门针对其CCxxxx系列无线通信芯片的网络协议。 它支持两种网络拓扑结构:严格的点对点通信和基于星型的网络拓扑结构,在星型连接中Hub点在SimplciTI被称为Access Point,简称AP.(AP就是常说的网关,数据中 ...… 查看全部问答> |
|
老师给了一块tm4c 1294的launchpad,说让我们自己玩,但之前没接触过arm这些东西,接触过单片机;所以完全不知道怎么开始??这块板子能干嘛我都不知道,该怎么学习??完全处于迷茫状态??望大神相助,指点一二,让我有个方向!!非常感谢! … 查看全部问答> |




