This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1290NCPDT:CAN 控制器仅监听模式故障排除

Guru**** 2024750 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/634896/tm4c1290ncpdt-can-controller-listen-only-mode-troubleshooting

器件型号:TM4C1290NCPDT

客户投诉 CAN 控制器中的仅监听模式无法正常工作、

客户 已确认其为真... 但有时它会起作用。

 

它们 跟踪到 CANTST 寄存器中的位(见下文)

 

寄存器6:CAN 测试寄存器(CANTST)、偏移量0x014、与 CANnRx 位相关。  当该位置位时、即使寄存器设置为监听模式、车辆也始终检测到确认。  当该位清零时、车辆未检测到侦听器。   他们无法在文档中看到如何清除此位。  有人能澄清吗?

 

此外、在 TI 例程库中: CANBitTimingSet

 

该例程错误地将 CAN 控制器从初始化模式中退出。

ui32SavedInit 是保存在例程开始时的原始值

 

   //

   //如果以前未设置 Init,则将其清除。

   //

   if (ui32SavedInit 和 CAN_CTL_init)

   {

       ui32SavedInit &=~CAN_CTL_init;

   }

 

这应该是(因为初始值可能已清除此位)

 

   //

   //如果以前未设置 Init,则将其清除。

   //

   if (!(ui32SavedInit & CAN_CTL_init))

   {

       ui32SavedInit &=~CAN_CTL_init;

   }

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Lawrence、

    我不熟悉监听/静音模式。 但根据数据表、CANnRX 位是只读位。 您无法更改它。 它应该只反映 CANnRX 引脚的状态。

    我真的看不到清除 init 位的代码有什么问题。 复位后、INIT 位默认设置为高电平。 因此、如果该位已置位、则在配置位时序后将其清零。 出于任何原因、如果在调用位时序之前将 INIT 位清零、则使用 ui32SavedInit 再次将其清零、因为该位在语句 HWREG (ui32Base + CAN_O_CTL)= ui32SavedInit | CAN_CTL_init | CAN_CTL_CCE 中强制为高电平。

    ui32SavedInit = HWREG (ui32Base + CAN_O_CTL);
    HWREG (ui32Base + CAN_O_CTL)= ui32SavedInit | CAN_CTL_init | CAN_CTL_CCE;

    快来吧……

    if (ui32SavedInit 和 CAN_CTL_init)

    ui32SavedInit &=~CAN_CTL_init;


    HWREG (ui32Base + CAN_O_CTL)= ui32SavedInit;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    查尔斯

     

     您对库代码是正确的、 是正确的

     

    但是、客户 仍然看到、设置 RXbit 时、他们的记录器 仍然看到有位填充 ACK 帧。

    当 RX位 未被置位时 、记录器似乎不发送任何帧。

     

    问题是、在他们的系统上、他们处于监听模式以执行波特率检测。  叉车/汽车为250k、 当它们设置为500k 以侦听时、叉车将收到错误帧、直到 它们以250k 切换到下一个波特率。  因此 ,他们能够确定它何时起作用而不起作用的最佳方法似乎是基于该位指示的任何内容。   他们并不真的关心清除该位…他们关心该位被置位时监听模式中的含义是什么?

     

    它们 始终调用一个 CANInit、并通过设置测试中的测试模式位 CTL 和 监听模式位来进行后续操作。   他们认为这与 CTL 中的 INIT 位有关、但 他们可以看到情况并非如此。  因此 、在使 CAN 控制器可靠地进行侦听方面、他们似乎缺少一些东西。

     

    我怀疑他们期望在任何波特率下工作、但他们必须配置/猜测正确的波特率才能正常工作?



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Laurence、

     我对静音模式的理解是、TX 引脚在内部与 RX 引脚线连接、同时仅驱动 TX 引脚上的隐性位。 它与环回模式有点相反。 在回送模式下、TX 引脚被驱动到收发器、并且在 RX 引脚与收发器断开连接的情况下、也被内部路由到 RX 引脚。 在任一种情况下、我都希望 MCU (处于监听模式)的波特率与 CAN 系统设置期间商定的其余节点相同。 您会说 MCU 设置为500k、其余节点设置为250k。 我认为这不起作用。 您为 MCU 设置的位时序无法对总线上的流量进行正确采样。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    查尔斯

    如果 Tiva 与 CAN 的波特率不符、CAN 总线是否仍能正常工作? 预期的情况是、如果 Tiva 在监听模式下运行时被配置为错误的波特率、那么监听模式将是无源的并且不会影响 CAN 总线运行。 但他们看不到这一点。 这是预期吗?

    此致、

    劳伦斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Laurence、

    处于监听模式的 MCU 应仅驱动隐性位。 由于监听模式为无源模式、即使 MCU 检测到错误、也不应发送错误帧。 不过、我希望 MCU 能够检测错误并向 CPU 生成错误中断、而不会影响 CAN 总线。 请使用示波器探测 MCU 的 TX 引脚、看看情况是否如此。 网络上有多少个节点? 其他节点是否可能回复 ACK 或错误帧?