STM32之CAN---错误管理分析

发布者:电子科技爱好者最新更新时间:2015-11-19 来源: eefocus关键字:STM32  CAN 手机看文章 扫描二维码
随时随地手机看文章

1 几个重要概念

        根据ISO11898有如下几个重要的与CAN相关的定义:

  • Fault confinement(错误界定)

CAN nodes shall be able to distinguish short disturbances from permanent failures. Defective transmitting nodes shall be switched off. Switched off means a node is logically disconnected from the bus, so that it can neither send nor receive any frames.

CAN节点可以区分常规错误和永久故障。有故障的发送节点将切换到离线状态。离线意味着在逻辑上与总线断开,既不能发送也不能接收。

  • Error-active(主动错误)

An error-active node shall normally take part in bus communication and send an active error flag when an error has been detected. The active error flag shall consist of six (6) consecutive dominant bits and shall violate the rule of bit stuffing and all fixed formats appearing in a regular frame .

处于主动错误状态的节点能正常参与总线通信的收发和当检测到错误时将发送错误标志,错误标志由6个连续的显示位组成(这种连续的6个显示位与常规的填充位和其它帧固定格式不相同,正因为如此,硬件才容易区别)。

  • Error-passive(被动错误)

An error-passive node shall not send an active error flag. It takes part in bus communication, but when an error has been detected a passive error flag shall be sent. The passive error flag shall consist of six (6) consecutive recessive bits. After transmission, an error-passive node shall wait some additional time before initiating a further transmission .

处于被动错误状态的节点不能发送主动错误标志。它能参与正常通信,但当检测到错误时发送的是被动错误标志。被动错误标志由6个连续的隐性位组成。当发送结束后,处于被动错误状态的节点在下一次再次发送时之前需要等待一些额外时间。

  • Bus-off(离线)

A node shall be in the bus-off state when it is switched off from the bus due to a request of FCE. In the bus-off state, a node shall neither send nor receive any frames. A node shall start the recovery from bus-off state only upon a user request.

由于错误界定规则,一个节点可能处于离线状态,当处于此状态时,这个节点既不发送也不接收。至于何时离线恢复取决于何时用户请求。

2 ISO11898中错误界定的规则

2.1 描述

当涉及到错误界定,一个节点必须处于下述三个错误状态中的其中一个,至于具体是哪种错误状态取决于节点的错误计数值:

  • 主动错误状态(Error-active)
  • 被动错误状态(Error-passive)
  • 离线状态(Bus-off)

2.2 错误计数

错误计数器当检测下下述事件时将修改错误计数值:

  • 当一接收节点检测到一个错误时,错误计数器将加1.有一种情况可以排外,即当检测到发送一主动错误标志或者重载标志时出现一位错误时除外。
  • 当一接收节点发送一错误标志时,检测到首位为显性位时,错误计数器加8.
  • 当一发送节后发送错误标志时,错误计数器加8,这时有两种情况除外:1:当这个发送节点处于主动错误状态下,且检测到由于ACK域未有显性位而造成的ACK错误,但是在发送时未检测到被动错误标志;2:当发送节点发送一错误标志时,在仲裁时检测到填充位错误(这些填充位原来应该是隐性,但检测结果为显性)。以上两种异常错误计数值保留原值不变。
  • 当发送节点发送一主动错误标志或重载标志时,检测到位错误时,错误计数器加8.
  • 当接收节点娄送一主动错误标志或重载标志时,检测到位错误时,错误计数器加8.
  • 任何节点在发送主动错误标志,被动错误标志,或重载标志时都应都忍受连续7个显示位。当检测到连接14个显示位,或者被动错误标志后紧跟着连接8个显示位,或者8个连续显性位后紧跟着被动错误标志时,所有发送节点发送错误计数器加8,所有接收节点接收错误计数器加8.
  • 发成功发送一帧报文后,发送计数器应减1,除非当前已经为0.
  • 当成功接收一帧报文后,如果当前接收计数器的值大于1且小于127,则接收计数器减1;如果接收计数器的值为0,则保持为0;如果在于127,则接收计数器的值应设置为119~127之间的值。

2.3 主动错误状态和被动错误状态之间的转变

当发送错误计数器或者接收错误计数器的值大于127时,该节点变成被动错误状态。

当节点从主动错误状态变为被动错误状态时,节点将发送一主动错误标志。

当被动错误节点的发送错误计数器和接收错误计数器的值都小于且等于127时,将再次变为主动错误状态。

2.4 离线管理

如果一个节点的发送错误计数器的值超过255时,那么此节点将会处于离线状态。处于离线状态的节点不会对总线产生任何影响,它将不会发送消息帧,ACK,错误帧,过载帧等,至于会不会接收总线上的数据,取消于此节点的实现。

当一个处于离线状态下的节点接收到128次连接11位隐性位时,将变成主动错误状态,且同时设置发送错误计数器和接收错误计数器为0.

注:具体实现可能并不会与上述所描述的一模一样,比如离线还原,在STM32是有一开关来设置是否会自动还原,如果此功能禁止了,那么当处于离线状态下的节点接收到128次连接11连隐性位时也不会不还原成主动错误状态。

图1[page]

3 STM32的bxCAN实现

3.1 bxCAN错误状态图

                                                                                 图2

3.2 出错管理

CAN协议描述的出错管理,完全由硬件通过发送错误计数器(CAN_ESR寄存器里的TEC域),和接收错误计数器(CAN_ESR寄存器里的REC域)来实现,其值根据错误的情况而增加或减少。软件可以读出它们的值来判断CAN网络的稳定性。此外,CAN_ESR寄存器提供了当前错误状态的详细信息。通过设置CAN_IER寄存器(比如ERRIE位),软件可以灵活地控制中断的产生――当检测到出错时。

3.3 离线恢复

当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必须工作在正常模式。

4 CAN错误状态寄存器 (CAN_ESR)

地址偏移量: 0x18
复位值: 0x0000 0000

                                                                                       图3

 

位31:24 REC[7:0]: 接收错误计数器
这是对CAN协议的故障界定机制接收部分的实现。按照CAN的标准,当接收出错时,根据出错的情况该计数器加1或加8;而在每次接收成功后,该计数器减1,或减少其值为120-当该计数器的值大于127时。当该计数器的值超过127时,CAN进入错误被动状态。
位23:16 TEC[7:0]: 发送错误计数器
与上面相似,这是对CAN协议的故障界定机制发送部分的实现。
位15:7 保留位,硬件强制为0。
位6:4 LEC[2:0]: 上次错误代码
在检测到CAN总线上发生错误时,硬件根据出错情况设置其为1~6的值。当报文被正确发送或接收后,硬件清除其值为’0’。
硬件没有使用错误代码7,软件可以设置该值,从而可以检测代码的更新。
000: 没有错误;
001: 位填充错;
010: 格式(Form)错;
011: 确认(ACK)错;
100: 隐性位错;
101: 显性位错;
110: CRC错;
111: 由软件设置。
位3 保留位,硬件强制为0。
位2 BOFF: 离线(Bus Off)标志
当进入离线状态时,硬件对该位置1。当发送错误计数器TEC溢出,即大于255时,CAN进入离线状态。
位1 EPVF: 错误被动(Error Passive)标志
当出错次数达到错误被动的阈值时,硬件对该位置1。
(接收错误计数器或发送错误计数器的值>127)。
位0 EWGF: 错误警告标志
当出错次数达到警告的阈值时,硬件对该位置1。
(接收错误计数器或发送错误计数器的值≥96)。
 

关键字:STM32  CAN 引用地址:STM32之CAN---错误管理分析

上一篇:STM32中CAN错误中断1
下一篇:STM32 CAN模块使用详解

推荐阅读最新更新时间:2024-03-16 14:40

STM32 新固件库创建相关
上次那篇《STM32 RVMDK快速创建工程》,其实就是直接用keil安装库来创建工程。我认为不要用下载的固件库来创建工程,觉得容易出错。其实,我当时初窥stm32,很多东西没有搞清楚,所以才这么认为。直接用keil4的安装库来建立工程固然简单,但是那个库旧得要命,都是2.0左右的版本(我原以为新安装的必然是最新的库,其实不然)。 用新的固件库放于本地创建工程,之所以容易出错,我想有两点: 1、虽然把整个库放在本地,但不一定真的就用了本地的库,由于include paths没有设置完整或者没有在在选项里定义关键的defind,很容易造成编译器直接调用安装库,而不是本地库。 2、新库函数和旧库不兼容,如果用旧库写的程序
[单片机]
STM32开发 -- 开发环境搭建
一、Keil下载安装 首先需要下载安装软件Keil。 参看:Keil uVision4使用总结 参看:keil专栏 需要注意的是,GD32F105为ARM® Cortex™ -M3 32-bit MCU,所以需要下载Keil MDK。其最新版本为Keil MDK-ARM 5.24 uVision5开发工具。 再有解决:轻松解决keil4跟keil5在同一个系统下不能共存的问题 打开注册表: win+R 进入运行,输入 regedit 点开HKEY_CLASSER_ROOT选项,找到UVPROJFILE(KEIL4工程文件类型)和UVPROJXFILE(KEIL5工程文件类型) keil 4 keil 5 二、安
[单片机]
<font color='red'>STM32</font>开发 -- 开发环境搭建
基于STM32的CMMB智能网络监测系统的设计与实现
中国移动多媒体广播(CMMB)是我国自主研发的、具有完全自主知识产权的移动多媒体广播标准。目前,全国各大城市的CMMB网络正在建设和完善当中,而CMMB信号的覆盖测试为网络优化和调整提供了重要的数据依据。数字电视广播网络的建设是一个长期复杂的过程,需要经过不断地调整和优化才能达到一个理想的效果。而只有有效、精确的网络覆盖测试才能为调整、优化提供可靠的依据。一个成熟稳定的CMMB网络覆盖测试系统,对于CMMB的发展具有重大意义。因此,有必要设计一款针对CMMB网络的覆盖测试系统。 本设计基于高性能单片机STM32和GPRS无线通信方案实现了对测试点CMMB网络覆盖情况的实时监测,并利用GPS接收器将测试终端的地理位子信息上传到服
[单片机]
基于<font color='red'>STM32</font>的CMMB智能网络监测系统的设计与实现
STM32学习日志——基于NT35510驱动芯片的LCD屏显示
之前写过关于LCD屏的学习日志,当时学得很懵逼,最后先暂时跳过,把教材的例程当成库函数来用,等后面开窍了再回过头来学习一遍。回想大学学习51单片机的时候,也是觉得LCD屏很困难,我觉得新手很容易就在这里从就入门到放弃了,因为相比前面的知识,个人认为LCD算是一个比较复杂的外设,难度有阶梯式的上升。再加上学习的教材为了兼容各种驱动芯片,程序看起来比较乱。所以这次单把NT35100这款驱动芯片拎出来分析学习。 这里使用的是ATK-4.3'TFTLCD模块,他是采用NT35510芯片驱动,分辨率为800*480,自带GRAM。 ATK-4.3’ TFTLCD模块正面图 一、引脚与GRAM 它一共有34个引脚。原理图及
[单片机]
stm32驱动lora模块sx1278
开发环境 keil5 子设备读取Ds18b20数据,通过iic显示到OLED 屏幕上,同时用spi协议发送给lora,再传给网关。 网关接收到数据在OLED 屏幕上显示。 单片机源码: #include stdio.h #include DELAY/Delay.h #include UART/uart.h #include ADC/ADC.h #include LED/LED.h #include IIC/IIC.h #include OLED/OLED.h #include SPIx/SPIx.h #include SX1278/SX1278.h #define ALARM 22 int ma
[单片机]
基于CAN总线的并联液压混合动力车控制系统
目前,我国城市公共交通主要依赖公交车,站间距离一般在500~1000米。公交车在每站间有数次刹车和启动,在交通流量的高峰期,刹车和启动更加频繁,带来能源浪费、尾气污染加剧、部件寿命缩短等一系列问题。 本课题研究的控制系统,可使并联液压混合动力车充分利用制动能量,在频繁刹车和启动的路况,可以明显提高车辆启动、加速和减速特性,改善车辆排放,降低油耗,延长发动机及刹车装置的寿命。而且与混合动力电动车相比,该系统在成本,技术成熟度,可靠性,维护性等方面均占有相当的优势。 并联式液压混合动力车的动力传动系中有两种或两种以上的动力源可同时或单独提供动力,有两个或两个以上相应的执行元件可同时驱动负载,该动力传动系主要由发动机、变速箱
[单片机]
基于<font color='red'>CAN</font>总线的并联液压混合动力车控制系统
基于STM32的TCP/IP协议栈代码之UDP分析
1. UDP介绍 UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个 UDP数据报,并组装成一份待发送的IP数据报。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系。 UDP数据报封装成一份 IP数据报的格式如图11 - 1所示。 RFC 768 是UDP的正式规范。 UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。由于缺乏可靠性,我们似乎觉得要避免使用UDP而使用一种可靠协议如TCP。在讨论完TCP后将再回到这个话题,看看什么样的应用程序可以使用UDP。 2. UDP首部 UDP首部的各字段如图11 -
[单片机]
基于<font color='red'>STM32</font>的TCP/IP协议栈代码之UDP分析
CAN半导体器件的发展与趋势分析
汽车制造商对于价格是非常敏感的。电子设备所占的成本应当尽可能少。甚至有人开玩笑称,汽车开发工程师对他们所采用的每个额外的比特,都需要有管理人员的书面许可。尽管出于价格原因,许多ECU仍以8位微控制器为基础,实际上还不是特别糟糕。ECU过去往往用于实现某一特定功能,因而,有必要借助CAN网络链接一些8位ECU。然而,这种情况已经发生了变化,尤其在传动系统中,ECU目前以16位微控制器为基础。但还需要进一步的改进:更多的应用、更标准化的界面以及更强大的运算能力在此成为必不可少的条件。但是,ECU的数量将减少,以便使系统的复杂性得到控制。   例如,宝马5系列整合了多达95个ECU,每个ECU包含至少一个微控制器。通过使用一体化程度
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved