找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9245|回复: 2
打印 上一主题 下一主题
收起左侧

一个关于STM32 CAN出错恢复的话题

[复制链接]
跳转到指定楼层
楼主
ID:98618 发表于 2016-4-27 23:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近有个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


相关话题链接:【点击阅读】

一个关于CAN出错中断重复出现的话题

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:83553 发表于 2016-4-28 12:59 | 只看该作者
我用51+sja1000也有这样的情况,如何设置,请教楼主。谢谢!
回复

使用道具 举报

板凳
ID:958413 发表于 2021-8-2 19:38 | 只看该作者
写的不错,顶一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表