最近有个STM32 用户咨询:
“最近在运用stm32f105做双can通讯,can驱动芯片运用的TJA1042,发现将canH canL 短路再铺开今后,can犯错康复不回来?之前在K40上运用的时分没有这个问题,不知道这个状况我们有什么辅导主张啊?”
别的,他还附上了依据STM32CUBEMX东西装备的相关代码如下:
hcan1.Instance = CAN1;
hcan1.Init.Prescaler = 2;
hcan1.Init.Mode = CAN_MODE_NORMAL;
hcan1.Init.SJW = CAN_SJW_1TQ;
hcan1.Init.BS1 = CAN_BS1_8TQ;
hcan1.Init.BS2 = CAN_BS2_7TQ;
hcan1.Init.TTCM = DISABLE;
hcan1.Init.ABOM = DISABLE;
hcan1.Init.AWUM = DISABLE;
hcan1.Init.NART = DISABLE;
hcan1.Init.RFLM = DISABLE;
hcan1.Init.TXFP = DISABLE;
HAL_CAN_Init(&hcan1);
从用户的描绘来看,应该是CANH/CANL短路时导致过错而进入离线状况。
其实,CAN硬件是具有犯错办理和离线康复功用的。在STM32参阅手册的CAN犯错办理章节有相关描绘。
CAN协议所描绘的犯错办理,完全由硬件经过发送过错计数器(CAN_ESR寄存器里的TEC域),和接纳过错计数器(CAN_ESR寄存器里的REC域)来完结,其值依据犯错状况作添加或削减。关于TEC和REC办理的详细信息,需参阅CAN规范。此外,CAN_ESR寄存器供给了当时过错状况的详细信息。经过设置CAN_IER寄存器(比方ERRIE位),当检测到犯错时软件能够灵敏地操控中止的发生。
关于离线康复
当TEC大于255时,bxCAN就进入离线状况,一起CAN_ESR寄存器的BOFF位被置’1’。在离线状况下,bxCAN无法接纳和发送报文。
依据CAN_MCR寄存器中ABOM位的设置,bxCAN能够主动或在软件的恳求下,从离线状况康复(变为过错主动状况)。在这两种状况下,bxCAN都有必要等候一个CAN规范所描绘的康复进程(CAN RX引脚上检测到128次11个接连的隐性位)。
假如ABOM位为’1’,bxCAN进入离线状况后,就主动敞开康复进程。
假如ABOM位为’0’,有必要经过软件恳求bxCAN先进入初始化形式然后退出并进入正常形式,随后才干发动康复进程。
注: 在初始化形式下,bxCAN不会监督CAN RX引脚的状况,这样就不能完结康复进程。为了完结康复进程,bxCAN有必要作业在正常形式。
用户给出的装备代码并未呈现使能ABOM功用的句子,那关于ABOM的默许值又是怎样呢?
从CAN_MCR寄存器的初始值来看,位ABOM默许初始值是0,即没有敞开主动离线康复功用。
已然这样,用户要么凭借犯错中止和查询CAN_ESR中的BOFF位来进行软件手动康复,要么修正装备代码,将ABOM使能,实施离线主动康复。
后来用户将装备代码调整,使能了ABOM, 代码中参加hcan1.Init.ABOM
= ENABLE; 即OK。