CAN规范里头提到,如果一个节点由于发送错误计数器的值不小于255时,它会进入bus off离线状态。 但问题是,我的STM32F107是主机,负责发送CAN信号的,当由于信号线的问题(CANH和CANL短路),导致主机发送错误,离线了(CAN_ESR上的TEC>255),CAN上也就没有信号,那么从何而来《128次连续11个“隐性”位》进入恢复过程。 而且 CAN_MCR里的RESET置位,也不能复位CAN寄存器,CAN_ESR上错误次数还是存在。难道只能强行复位芯片才能解决? 下面是我的错误中断里的处理代码
|
【MCU实战经验】基于STM32F103C8T6的hart总线调试器设计
求教STM32F103进入STOP模式后用外部中断唤醒的问题
基于STM32F103RCT6的无源蜂鸣器音乐播放(生日快乐歌)
STM32F103c8t6有没有DAC 功能?
STM32F103x中文数据手册
新手求教,为何在我电脑上找不到STM32F1Xx.h文件
金龙107例程汇总(STM32F107)
万利STM32F107VC 原理图
STM32F103 ADC多通道检测必须要DMA吗?
【官方例程】STM32F107以太网官方例程
但楼主的问题显然不是这个,楼主主要是对这句话“当它监听到总线上有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节点本身在没有辅助电路的情况下是无法区分这两种情况的。
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;
将以上红色项使能试试。
如果ABOM位为’1’,bxCAN进入离线状态后,就自动开启恢复过程。
如果ABOM位为’0’,软件必须先请求bxCAN进入然后再退出初始化模式,随后恢复过程才被开启。
评分
查看全部评分
评分
查看全部评分
在初始化的时候已经置位了,但就是恢复不了,重新发can也发不出去。
手册里说的恢复过程是:需要CAN总线上有128次连续11个隐形位,相当于,用CAN总线上的数据把CAN_ESR里的TEC域递减清零。才能恢复完成。但我这个是主机,停止CAN发送的话,CAN总线上也没有数据存在。所以就清除不了错误。
难道是互联产品的从CAN就是用在恢复主CAN的?
当主CAN出现故障之后,从CAN用来发数据,清除主CAN的CAN_ESR计数?然后恢复现场?
没有开重发机制。
CAN总线默认的状态是隐性电平“1” (没有差分信号),那么CAN总线上如果没有数据在传输,那么128次连续11个隐性位,相当于总线闲置过一段时间之后,CAN会自己恢复?
评分
查看全部评分
在进入错误回调函数之前,把相关的中断都关掉了,需要重新打开
多谢您的详细回答。也就是说CAN主机也无法判定CAN线短路这种情况对吗?
CAN控制器是不知道的,但不排除有些CAN收发器可能知道,或者在加入外围辅助电路后,MCU有方法可以判别,这个就看怎么设计电路了。
我目前也碰到这个问题,就是在总线上,CAN_H和CAN_L在线上短路,二条边连接到一起了。
然后直接在初始化上,把ABOM位为’1’,bxCAN进入离线状态后,就自动开启恢复过程。我用的是STM32F103ZET6.
谢谢!!