转自:http://blog.csdn.net/flydream0/article/details/8161418
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
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)。 |
如下摘自《can2.0协议中文版》广州周立功单片机发展有限公司 发布
6.错误处理
6.1 错误检测
有以下 5 种不同的错误类型(这 5 种错误不会相互排斥)
• 位错误
站单元在发送位的同时也对总线进行监视。如果所发送的位值与所监视的位值不相符合,则在此位时
间里检测到一个位错误( BIT ERROR)。但是在仲裁场( ARBITRATION FIELD)的填充位流期间或 ACK
间隙( ACK SLOT)发送一“隐性”位的情况是例外的—— 此时,当监视到一“显性”位时,不会发出位
错误( BIT ERROR)。当发送器发送一个被动错误标志但检测到“显性”位时,也不视为位错误。
• 填充错误
如果在使用位填充法进行编码的信息中,出现了第 6 个连续相同的位电平时,将检测到一个填充错误。
• CRC 错误
CRC 序列包括发送器的 CRC 计算结果。接收器计算 CRC 的方法与发送器相同。如果计算结果与接
收到 CRC 序列的结果不相符,则检测到一个 CRC 错误( CRC ERROR)。
• 形式错误
当一个固定形式的位场含有 1 个或多个非法位,则检测到一个形式错误( FORM ERROR)。
• 应答错误
只要在 ACK 间隙( ACK SLOT)期间所监视的位不为“显性”,则发送器会检测到一个应答错误
( ACKNOWLEDGMENT ERROR)。
6.2 错误标定
检测到错误条件的站通过发送错误标志指示错误。对于“错误主动”的节点,错误信息为“主动错误
标志”,对于“错误被动”的节点,错误信息为“被动错误标志”。站检测到无论是位错误、填充错误、
形式错误,还是应答错误,这个站会在下一位时发出错误标志信息。
只要检测到的错误的条件是 CRC 错误,错误标志的发送开始于 ACK 界定符之后的位(其他的错误条件
除外)。
7.故障界定
至于故障界定,单元的状态可能为以下三种之一:
• “错误主动”
• “错误被动”
• “总线关闭”
“错误主动”的单元可以正常地参与总线通讯并在错误被检测到时发出主动错误标志。
“错误被动”的单元不允许发送主动错误标志。“错误被动”的单元参与总线通讯而且在错误被检测
到时只发出被动错误标志。而且,发送以后,“错误被动”单元将在预设下一个发送之前处于等待状态。
(见“挂起发送”)
“总线关闭”的单元不允许在总线上有任何的影响(比如,关闭输出驱动器)。
在每一总线单元里实现两种计数以便故障界定:
• 发送错误计数
• 接收错误计数
这些计数按以下规则改变(注意:在给定的报文发送期间,可能要用到的规则不只一个):
1. 当接收器检测到一个错误,接收错误计数就加 1。在发送主动错误标志或过载标志期间所检测到的
错误为位错误时,接收错误计数器值不加 1。
2. 当错误标志发送以后,接收器检测到的第一个位为“显性”时,接收错误计数值加 8。
3. 当发送器发送一错误标志时,发送错误计数器值加 8。
例外情况 1:
发送器为“错误被动”,并检测到一应答错误(注:此应答错误由检测不到一“显性”应答 以及当发
送被动错误标志时检测不到一“显性”位而引起)。
例外情况 2:
发送器因为填充错误而发送错误标志(注:此填充错误发生于仲裁期间。引起填充错误是由于:填充
位〈填充位〉位于 RTR 位之前,并已作为“隐性”发送,但是却被监视为“显性”)。
例外情况 1 和例外情况 2 时,发送错误计数器值不改变。
4. 发送主动错误标志或过载标志时,如果发送器检测到位错误,则发送错误计数器值加 8。
5. 当发送主动错误标志或过载标志时,如果接受器检测到位错误(位错误),则接收错误计数器值加
8。
6. 在发送主动错误标志、被动错误标志或过载标志以后,任何节点最多容许 7 个连续的 “显性”位。
以下的情况,每一发送器将它们的发送错误计数值加 8,及每一接收器的接收错误计数值加 8:
当检测到第 14 个连续的“显性”位后;
在检测到第 8 个跟随着被动错误标志的连续的“显性”位以后;
在每一附加的 8 个连续“显性”位顺序之后。
7. 报文成功传送后(得到应答及直到帧末尾结束没有错误),发送错误计数器值减 1,除非已经是 0。
8. 如果接收错误计数值介于 1 和 127 之间,在成功地接收到报文后(直到 ACK 间隙接收没有错误,
及成功地发送了应答位),接收错误计数器值减 1。如果接收错误计数器值是 0,则它保持 0,如果大于
127,则它会设一值介于 119 到 127 之间。
9. 当发送错误计数器值等于或超过 128 时,或当接收错误计数器值等于或超过 128 时,节点为“错
误被动”。让节点成为“错误被动”的错误条件致使节点发出主动错误标志。
10.当发送错误计数器值大于或等于 256 时,节点为“总线关闭”。
11. 当发送错误计数器值和接收错误计数器值都小于或等于 127 时, “错误被动”的节点重新变为“错
误主动”。
12. 在总线监视到 128 次出现 11 个连续“隐性”位之后,“总线关闭”的节点可以变成“错误主动”
(不再是“总线关闭”),它的错误计数值也被设置为 0。
备注:一个大约大于 96 的错误计数值显示总线被严重干扰。最好能够采取措施测试这个条件。
备注:起动/睡眠:如果起动期间内只有 1 个节点在线,以及如果这个节点发送一些报文,则将不会有
应答,如此检测到错误并重复报文。由于此原因,节点会变为“错误被动”,而不是“总线关闭”。