你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F107,CAN发送错误,导致CAN离线状态,如何恢复CAN总线?

[复制链接]
waiman-156411 提问时间:2017-1-5 13:39 /
阅读主题, 点击返回1楼
收藏 2 评论17 发布时间:2017-1-5 13:39
17个回答
yzez 回答时间:2017-12-7 09:58:26
hjl2832 发表于 2017-12-7 09:13
关注,标记,CAN问题

在进入错误回调函数之前,把相关的中断都关掉了,需要重新打开
任风吹吹 回答时间:2017-12-7 10:30:48
楼主你是想知道BUSOFF后如何恢复吗? 将ABOM设1后,一旦检测到条件会自动恢复的,不需要人工干预。

但楼主的问题显然不是这个,楼主主要是对这句话“当它监听到总线上有128次连续11个“隐性”位后,允许处于bus off状态的节点转到“error active”状态。”不怎么理解吧?

当CAN节点进入到BUS OFF状态后,只要使能了ABOM位,那么它还是持续检测总线是否存在128次连续11个隐性位,这个是CAN接口恢复到主动错误状态的条件,那么,关键的是,如何理解这个128次连续11个隐性位。

那么我要问的是,什么是隐性位?当CANH=CANL=2.3V时! 这里是约等于,我没找到这个符号,用等号代替。

当CANH和CANL短接时,CAN节点本身并不知道(如果没有其他外围辅助检测电路的话),从CAN节点来看,只是知道CANH=CANL=2.3V,对于CAN节点来说,这个就是IDLE状态。所以当持续一段时间后,BUS OFF状态会解除,自动恢复到主动错误状态,但是回到主动错误状态后,由于CANH与CANL还是短接(CAN BUS IDLE状态),此时若发送报文,则会导致发送错误,进而导致TEC累加,最终再次导致进入到BUSOFF状态。如此反复循环。

在此过程中,楼主如查看BUSOFF寄存器的状态,楼主会发现有时为0,有时为1,这就是返回循环导致的。

进入到BUSS OFF状态需要发送来驱动,但从BUS OFF状态恢复到主动错误状态并不需要任何操作来驱动,它就是自动检测128次连续11位隐性位这个条件来决定的。

这里关键的是,当CANH与CANL短接时,对于CAN节点来说,就是一直为IDLE,当CAN总线上没有任何消息时,也是IDLE,CAN节点本身在没有辅助电路的情况下是无法区分这两种情况的。
waiman-156411 回答时间:2017-12-8 21:01:00
任风吹吹 发表于 2017-12-7 10:30
楼主你是想知道BUSOFF后如何恢复吗? 将ABOM设1后,一旦检测到条件会自动恢复的,不需要人工干预。

但楼主 ...

多谢您的详细回答。也就是说CAN主机也无法判定CAN线短路这种情况对吗?
任风吹吹 回答时间:2017-12-11 09:42:53
waiman-156411 发表于 2017-12-8 21:01
多谢您的详细回答。也就是说CAN主机也无法判定CAN线短路这种情况对吗?

CAN控制器是不知道的,但不排除有些CAN收发器可能知道,或者在加入外围辅助电路后,MCU有方法可以判别,这个就看怎么设计电路了。
北宸 回答时间:2018-4-22 15:22:45
本帖最后由 北宸 于 2018-4-22 15:26 编辑

我目前也碰到这个问题,就是在总线上,CAN_H和CAN_L在线上短路,二条边连接到一起了。
然后直接在初始化上,把ABOM位为’1’,bxCAN进入离线状态后,就自动开启恢复过程。我用的是STM32F103ZET6.
谢谢!!
san兄弟 回答时间:2018-11-7 17:48:21
关注关注,CAN
stm1024 回答时间:2018-11-7 19:01:33
这个问题是单独的CAN控制器是无法解决的。每次控制器因为错误busoff以后,总能读到连续的隐性位然后又上线了,结果又是一堆的错误帧,然后busoff,如此反复。
需要专门的外围电路来实现,例如检测总线的电阻,如果是0欧或者很小,就可以认为是总线本身有问题了。
dldz525 回答时间:2018-11-8 13:17:04
    hcan.Instance = CAN;
    hcan.Lock = HAL_UNLOCKED;
    hcan.pRxMsg = &CanRxMsgStruct;
    hcan.pRx1Msg = &CanRxMsg1Struct;
    hcan.pTxMsg = &CanTxMsgStruct;
    hcan.Init.Prescaler = 32;               
    hcan.Init.Mode = CAN_MODE_NORMAL;//CAN_MODE_LOOPBACK;
    hcan.Init.SJW = CAN_SJW_1TQ;
    hcan.Init.BS1 = CAN_BS1_3TQ;
    hcan.Init.BS2 = CAN_BS2_5TQ;
    hcan.Init.TTCM = DISABLE;               
    hcan.Init.ABOM = ENABLE;               
    hcan.Init.AWUM = ENABLE;       
    hcan.Init.NART = DISABLE;               
    hcan.Init.RFLM = DISABLE;               
    hcan.Init.TXFP = DISABLE;       

将以上红色项使能试试。       

12

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版