lpc1768 can 总线 bus_off 如何恢复

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

lpc1768 can 总线 bus_off 如何恢复

5,180 Views
yeqing85123
Contributor II

您好,

     lpc1768 芯片, can 总线节点进入bus_off状态,根据 LPC17xx User Manual 的处理方法,代码如下:

LPC_CAN1->MOD = 1; // Enter Reset Mode

  LPC_CAN1->GSR = 0; // clear tx error counter

  LPC_CAN1->CMR = (1<<1)|(1<<2)|(1<<3);

  LPC_CAN1->MOD = 0;// Return Normal operating

等待128个Bus Free condition 后, 节点依然无法恢复正常工作。请问该如何解决?使节点能恢复正常工作模式。

Labels (1)
Tags (1)
0 Kudos
4 Replies

3,300 Views
897143634
Contributor I

Kerry Zhou,感谢您提供上述的bus_off恢复的方法。我用的是LPC1768,CAN跑一段时间后,收发数据都不正常。然后按您提供的方法去查询寄存器内容,此时RM=1了,同时检查下BS位为1, 然后写GSR[TXERR] =0, 软件再清除下RM位: 

  1. 检查RM=1

  2,检查BS=1

  3,GSR[TXERR] =0

  4,RM清零

  5,等待下

按此方法后,CAN恢复正常收发。请问您这是什么原因造成的bus_off。另外我的使用环境是LPC1768与其他的七个CAN模块设备通讯。

0 Kudos

3,300 Views
kerryzhou
NXP TechSupport
NXP TechSupport

  楼主你好!

  关于bus off的恢复方法,在User manual中是这么说的:

Mode bit '1' (present) and an Error Warning Interrupt is generated, if enabled. Afterwards the Transmit Error Counter is set to '127', and

the Receive Error Counter is cleared. It will stay in this mode until the CPU clears the Reset Mode bit. Once this is completed the CAN

Controller will wait the minimum protocol-defined time (128 occurrences of the Bus-Free signal) counting down the Transmit Error

Counter. After that, the Bus Status bit is cleared (Bus-On), the Error Status bit is set '0' (ok), the Error Counters are reset, and an Error

Warning Interrupt is generated, if enabled. Reading the TX Error Counter during this time gives information about the status of the

Bus-Off recovery.

  按照上面的说明,应该是Transmit Error Counter 被置为了127, 这时候,人为清除RM(Reset mode)位, 然后CAN控制器等待128个bus free信号,发送错误计数器进行递减,然后总线状态位恢复,Error状态位为0, Error 计数器复位。

  所以,我认为你可以试试:

LPC_CAN1->MOD &= fffffffe; // 清除RM位

然后使用while等待CANnGSR[TXERR]到0, 之后,再查看bus状态, Error状态。

但是有个前提,一般出现错误,和外部总线硬件也有关系,建议你先移除总线上其他的CAN节点,只留一个CAN调试器供测试,防止出现一种情况,实际上总线恢复了,但是由于总线上其他节点的原因,又导致该CAN节点进入的bus off状态。

  楼主可以再参考我说的方法在你那边试下。

  如果还有问题,欢迎继续交流!


Have a great day,
Jingjing

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos

3,300 Views
yeqing85123
Contributor II

Jingjing Zhou,您好,谢谢你提供的帮助!我试试看。我这个问题只有在初次上电的时候才偶尔会出现,初始化过程是在所有其他需要初始化的东西初始化ok后,延时500ms,再初始化的can,如果上电后,节点工作正常,基本不会再出问题。另外我看User manual中CAN controller operation 的 Error handling 中有:

The Tx and Rx error counters can be written if RM in CANxMOD is 1. Writing 255 to the

Tx Error Counter forces the CAN Controller to Bus-Off state. If Bus-Off (BS in CANxSR) is

1, writing any value 0 through 254 to the Tx Error Counter clears Bus-Off. When software

clears RM in CANxMOD thereafter, only one Bus Free condition (11 consecutive

recessive bits) is needed before operation resumes.

,按理解,应该是很容易恢复的。此外,当节点上电后异常,处于Bus-Off 状态时,我有量测总线的波形很正常。谢谢!

0 Kudos

3,300 Views
kerryzhou
NXP TechSupport
NXP TechSupport

你好!

  如果的确是由于出错引起的bus off,按照这样的方法是容易恢复的。

    现在需要确认下,你这个bus off是不是发送出错导致的,因为按照你一楼的做法,也就是出错处理里面,你贴出的这段话:

如果CANxMOD中的RM位为1,就可以写Tx和Rx错误计数器。向Tx错误计数器写入255将强制CAN控制器进入总线关闭状态。 如果总线关闭(CANxSR中的BS位)为1,向Tx错误计数器写入0~254之间的任何值都将清除总线关闭状态。 软件清除CANxMOD中的RM位之后,恢复操作之前只需要一个总线空闲条件(11个连续的隐性位)。

      所以,你可以debug看下,如果出错的时候,是否满足如下条件:

下列寄存器位被置位: CANxSR中的BS位、CANxIR中的BEI和EI位(如果已使能),以及CANxMOD中的RM位。

  因为,GSR寄存器平时是只读的,只有在RM位为1的时候才能够写,所以你代码中要加个判断,然后debug看看,是否是RM=1了,同时检查下BS位是否为1, 然后写GSR[TXERR] =0, 软件再清除下RM位, 看你一楼贴的代码,顺序有问题了。

  1. 检查RM=1

  2,检查BS=1

  3,GSR[TXERR] =0

  4,RM清零

5,等待下

  然后再看看是否已经恢复了。

现在一共两种方法,你都试试。

测试之后,把结果也贴上来便于我这边分析。


Have a great day,

Jingjing

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------