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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版