控制/MCU
最近有个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_MCR寄存器中ABOM位的设置,bxCAN可以自动或在软件的请求下,从离线状态恢复(变为错误主动状态)。在这两种情况下,bxCAN都必须等待一个CAN标准所描述的恢复过程(CAN RX引脚上检测到128次11个连续的隐性位)。
如果ABOM位为’1’,bxCAN进入离线状态后,就自动开启恢复过程。
如果ABOM位为’0’,必须通过软件请求bxCAN先进入初始化模式然后退出并进入正常模式,随后才能启动恢复过程。
注: 在初始化模式下,bxCAN不会监视CAN RX引脚的状态,这样就不能完成恢复过程。为了完成恢复过程,bxCAN必须工作在正常模式。
用户给出的配置代码并未出现使能ABOM功能的语句,那关于ABOM的默认值又是怎样呢?
既然这样,用户要么借助出错中断和查询CAN_ESR中的BOFF位来进行软件手动恢复,要么修改配置代码,将ABOM使能,实行离线自动恢复。
后来用户将配置代码调整,使能了ABOM, 代码中加入hcan1.Init.ABOM
= ENABLE; 即OK。
长按上方精灵鸟识别图中二维码可关注公众号
STM32单片机中文官网
意法半导体/ST/STM
全部0条评论
快来发表一下你的评论吧 !