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.

[参考译文] TCAN4550:即使 SWE 被禁用、也会接收到 CANSLNT 错误

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1181722/tcan4550-canslnt-error-is-received-even-if-swe-is-disabled

器件型号:TCAN4550

您好!

我一直在处理 TCAN4550的驱动程序代码、并且能够成功地在 CAN 总线上发送和接收数据包(已通过 CAN 转 USB 工具验证)。

到目前为止、通过轮询针对 RF0N/RF1N 标志位的 m_CAN 中断寄存器(0x1050)来接收数据。

当我尝试使用 nINT 中断引脚而不是轮询数据时、会发生这个问题。 当发送或接收数据时、我始终从 nINT 引脚获得中断、当我读取中断状态寄存器(0x820)时、我始终得到值0x4A0、即标志 CANSLNT、CANERR、GLOBALERR。 我已经尝试设置 SWE_DIS 位并从状态寄存器(0x0800)禁用看门狗、但我仍然继续获取 CANSLNT 中断。

一些观察结果:

接收 CANSLNT 中断时、即使 m_CAN 中断寄存器(0x1050)中的 RF0N/RF1N 位已更改、同一寄存器(0x820)中的 m_CAN_INT 位也不会置位。

2、CANSLNT 中断在发送一个 TX 包和接收一个 Rx 包后都触发。 清除中断对解决该问题没有帮助、下次接收数据时、中断仍会触发。

如果我禁用 CANSLNT 中断、那么在接收到数据时根本不会获得中断。 我已验证数据仍能正确接收到 Rx FIFO 中、但未设置任何 m_CAN 错误。

4、一些可能需要关注的寄存器状态:(每次读取中断寄存器时、都会将其清除)

-初始化之后、发送数据之前:

地址0x0800:0x00000000

地址0x1044:0x0000070F

地址0x1050:0x00000000

-发送数据后(这是触发中断后的状态)

地址0x0800:0x0000040A

地址0x1044:0x00000708

地址0x1050:0x00011000

-接收数据后 (这是触发中断后的状态)

地址0x0800:0x0000040A

地址0x1044:0x00000708

地址0x1050:0x00010001

如何避免这些 CANSLNT 中断? 是否有任何必须配置的设置我错过了?  

提前感谢!

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

    您好!

    已为工程师分配了此问题。  由于假期原因、TI E2E 设计支持论坛的回复可能会延迟至1月3日。 感谢您的耐心等待。

    最棒的

    Chris

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

    您好、Sandy、

    当 CAN 总线上的静默时间较长或两个报文之间的空闲时间比预期的长时、CANSLNT 标志会置1。  这可能表示故障情况、例如接线线束损坏或短路、从而阻止消息通过。  计时器大约为1秒。  

    为了避免 CANSLNT 错误、您可以增加总线上的 CAN 消息量、以防止总线空闲时间超过 tsilence 规范。

    也可以通过将中断使能寄存器中的 CANSLNT 位置为"0"来禁用 CANSLNT 中断位。  (寄存器0x0830[10])。  CANSLNT 中断位默认设置为"1"、因此如果不想看到该中断、需要禁用该位。  CANERR 和 GLOBALERR 位会被置位、因为 CANSLNT 位会被置位。  您不关心的任何其他中断也可以以相同的方式被禁用。  寄存器0x1054是 MCAN 中断的中断使能寄存器。

    此致、

    Jonathan

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

    您好、Jonathan、

    感谢您的回复!

    [引用 userid="47451" URL"~/support/interface-group/interface/f/interface-forum/1181722/tcan4550-canslnt-error-is-received-even-if-swe-is-disabled/4452502 #4452502]CAN 总线长时间保持静音或消息之间的空闲时间比预期的长时、CANSLNT 标志会置1。  [/报价]

    我做了一些实验、以100ms 的间隔发送 Rx 数据包、一旦数据包停止、~1秒后 CANSLNT 中断触发、因此我认为这是我在发送1个数据包时看到的情况。 我很困惑、因为中断像 Tx 完成数据或新 Rx 数据一样触发、但现在该行为是合理的。

    继续讨论下一个问题:

    [引用 userid="47451" URL"~/support/interface-group/interface/f/interface-forum/1181722/tcan4550-canslnt-error-is-received-even-if-swe-is-disabled/4452502 #4452502"]寄存器0x1054是 MCAN 中断的中断使能寄存器。[/quot]

    出于测试目的、我目前将0x1054中的所有中断使能位设置为1、并且无法接收任何 MCAN 中断。 我是否需要为接收中断配置其他设置?

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

    桑迪

    当使用寄存器0x1054时、这允许将 MCAN 中断指定为 m_CAN_int 中断线路之一、然后可以在 GPIO1或 GPO2上指示该中断线路。 如果这是您尝试执行的操作、您还需要决定要使用哪个中断线路、0或1、并通过将特定的 MCAN 中断分配给它们各自的中断线路来在寄存器0x1058中启用此功能。 然后、在寄存器0x0800中、您可以将 GPIO1和/或 GPO2分配给 MCAN 中断线路指示。

    如果您只是尝试为 nINT 引脚启用 MCAN 中断、只要 MCAN 中断被启用、MCAN 中断就会在 nINT 上指示。 如何确定是否接收到 MCAN 中断?

    此致、

    Eric Hackett  

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

    尊敬的 Eric:

    我正在尝试为 nINT 引脚启用 MCAN 中断、但当一条消息被接收到 Rx FIFO 0中时、当我用示波 器测量 nINT 引脚时、nINT 引脚不会被拉低(nINT 引脚正在工作、因为我一直接收到由 CANSLNT 错误触发的中断)。 如果我读取寄存器0x1050、我会看到 Rx FIFO0中用于新消息的位被设置为1。 但是、当我读取0x820时、未设置 m_CAN_int 位、我认为这是我在 nINT 引脚上没有收到中断的原因。

    我已经做了一些测试、故意发送的消息比我的 Rx FIFO0可以容纳的消息多。 RF0L、RF0F、RF0W、RF0N 位都被置位、但我仍然没有收到中断。 我还从接收报文切换到了 FIFO0到 FIFO1、也没有中断。 这使我认为 nINT 引脚上不会反映任何与 CAN 相关的中断。 如前所述、我现在已启用0x1054中的所有 CAN 中断。 是否在任何情况下可以忽略中断、或者是否缺少其他一些设置? 谢谢!

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

    您好、Sandy、

    您能否共享寄存器0x0830的最终值并确认位10已设置为"0"以禁用 CANSLNT 标志?

    您还可以监控寄存器0x0824和0x1050并共享它们的值吗?  它们应该匹配、但0x0824也报告 RX FIFO 信息、并且它与寄存器0x0820相邻、这允许在长度为2个字的单个 SPI 读取中读取器件特定的中断位和 MCAN 中断位。

    如果寄存器0x1054中的 MCAN 中断位被启用、当任一被启用的中断位被置位时、M_CAN_INT 位应该被置位。  也可以将 GPIO1或 GPO2引脚配置为仅反映 Eric 提到的已启用 MCAN 中断的中断引脚。

    您是否还在读取和清除状态寄存器0x000C 中设置的任何中断位?  您要读取寄存器0x000C 的值是多少?

    读取并清除所有状态和中断寄存器后、您是否看到 nINT 引脚变为高电平?  还是始终保持低电平?  如果没有清除任何中断位、nINT 引脚将保持低电平、并且它将屏蔽引脚不报告被置位的任何新中断位。  因此、我们需要确保清除所有设置位、并且可以看到 nINT 引脚变为高电平。

    此致、

    Jonathan

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

    您好、Jonathan、  

    寄存器0x0830的最终值为0xFFFFFFFF、用于确认 CANSLNT 中断已禁用、并且我不再在 nINT 引脚上获得中断。

    在我的当前设计中、我使用轮询线程来监控 Rx 数据的 MCAN 中断位。 当我向 TCAN4550发送数据时、您提到的寄存器的值如下。

    寄存器0x0824:0x10001

    寄存器0x1050:0x10001

    寄存器0x000C:0x0008  

    寄存器0x0820:0x04A0。

    在清除任何中断之前、我测量了 nINT 引脚且该引脚为高电平、这表示没有触发中断、并且先前的任何中断都已清除。 在我们的当前设计中、GPO1和 GPO2未使用、因此它们未以任何方式进行配置。  

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

    您好、Sandy、

    这是否意味着一切都能为您效劳?  还是您仍有一些问题?  我只想澄清一下您关于在 nINT 引脚上不再获得中断的说法。  这是否意味着您也没有收到新的数据中断?

    nINT 引脚为低电平有效且寄存器0x0820和0x0824中所有未屏蔽位的逻辑 OR 运算、因此寄存器0x0824中的 RF0N 位应导致 nINT 引脚被拉低。

    此致、

    Jonathan

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

    您好、Jonathan、

    [引用 userid="47451" URL"~/support/interface-group/interface/f/interface-forum/1181722/tcan4550-canslnt-error-is-received-even-if-swe-is-disabled/4462715 #4462715"]这是否意味着您也没有收到新的数据中断?

    是的、我没有收到新的数据中断。 当我禁用 CANSLNT 中断时、nINT 引脚永远不会被拉低。 CANSLNT 位引起的 CANERR 是否会阻止设置 M_CAN_INT?

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

    您好、Sandy、

    我已经做了一些测试、无法复制您的结果。  我只屏蔽了寄存器0x0830 0xFFFFFFFF 中的 CANSLNT 位、每次向该板发送消息时、我都会看到 nINT 引脚切换为低电平。  我还看到、在接收到新消息时、寄存器0x0820中的 M_CAN_INT 位被置位。  否则、我会看到与您一样的寄存器0x0830、0x0820和0x0824值。  

    向寄存器0x1050的 RF0N 位写入"1"将清零 RX FIFO 0新消息位、这将导致 nINT 引脚返回高电平。 请再次注意、寄存器0x0824只是寄存器0x1050的只读副本、可在单个 SPI 事务中更轻松地对寄存器0x0820和0x0824中的所有中断进行突发读取。

    您如何监控 nINT 引脚? 您是否使用具有下降沿触发器的示波器探头?

    我必须将接收节点 MCU 置于一种模式、以防止其在 nINT 引脚转换时自动清除中断位、从而使用电路板上 LED 的视觉指示。  否则、MCU 会清除中断、然后才能观察 LED 上的任何内容。 当我执行上述0x00000001的0x1050写入时、nINT 引脚转变为高电平。

    我的 MCU 在180uS 内清除了中断、因此很容易错过。  当 RF0N 位置位时、屏蔽 CANSLNT 位不应阻止您接收 nINT 中断。

    此致、

    Jonathan

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

    您好、Jonathan、

    我使用示波器监控 nINT 引脚、并在下面连接我捕获的信号。 CH1 (黄色)是 nINT 引脚、CH2 (蓝色)是 CAN-L 引脚。  

    CAN 总线上的数据由 CAN 分析仪工具发送到 TCAN4550、但正如您看到的、nINT 引脚始终为高电平。 此时对0x1050寄存器的读取验证 RF0N 位是否已置位、从 FIFO0读取的数据是否与总线上发送的数据相匹配。

    nINT 引脚能够被 TCAN4550拉低、因为我之前遇到的问题之一中提到了 CANSLNT 中断、所以我排除了任何硬件设计问题。

    是否存在其他无法将 nINT 引脚拉低的情况? 你有什么建议可以尝试吗? 谢谢!

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

    您好、Sandy、

    nINT 引脚反映寄存器0x0820和0x0824中未屏蔽的所有故障的逻辑或。 如果您只屏蔽了 CANSLNT 标志、那么新消息仍应在 nINT 引脚上反映出来、同时它们会反映在寄存器0x1050和0x0824中、0x0824是0x1050的只读副本。

    我将再次设置我的测试系统、然后捕获我的器件配置寄存器值、以便我们可以将它们与您的配置寄存器进行比较。

    此致、

    Jonathan

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

    您好、Jonathan、

    我对其他设置进行了实验、发现我能够让 GPO2引脚在接收到数据时正确发出中断。 以下是我捕获的信号。 CH1 (黄色)是来自 GPO2的信号、而 CH2 (蓝色)是 CANL。

    我不确定这意味着什么、但我想与您分享这一发现。 如果您对此有任何想法、请告诉我! 谢谢。

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

    您好、Sandy、

    这很有意思。  nINT 是一个全局中断、在任何非屏蔽中断上都应被拉低。  因此、当 GPO2配置为 MCAN 中断并根据 MCAN 中断位的设置被拉低时、nINT 引脚也应被拉低。  

    我已经使用 nINT 引脚(黄色)和 CANL (蓝色)信号复制了您的测试和示波器快照。  我的 MCU 响应中断信号并在大约170 μ S 内清除中断寄存器。

    然后、如果我将蓝色示波器探针移出 CANL 线路并将其放置在 GPO2引脚上、并向该电路板发送另一条消息、您可以看到 nINT 和 GPO2引脚是相同的。

    我的引脚和中断配置寄存器值为:

    寄存器0x1054 = 0x1A800001

    寄存器0x1058 = 0x00000000

    寄存器0x105C = 0x00000003

    寄存器0x0800 = 0xC84004A8

    我还通过将中断线路选择寄存器0x1058中的 RFONL 位配置为"1"并确保中断中的中断线路1使能 EINT1位设置为"1"、验证了 GPIO1引脚的使用方式与 GPO2引脚的使用方式相同 线路使能寄存器0x105C。

    只要中断使能寄存器0x1054中的 RX FIFO 0新消息中断使能 RF0NE 位设置为"1"、寄存器0x1050和0x0824中的 RF0N 中断位将在新消息上设置为"1"、这将导致 nINT 拉低。  我不知道有什么其他配置设置可以阻止 nINT 在中断位以这种方式启用或取消屏蔽时拉低。

    如果您只能使 GPO2或 GPIO1在新消息上拉低、但 nINT 引脚保持高电平、那么我将开始质疑 nINT 引脚是否正常工作。  在我看来、它可能会受到某种程度的损坏。  您是否已将 CANSLNT 标志置为双电平、从而使 nINT 引脚拉低?  此外、您是否碰巧有第二个器件或电路板、您可以尝试进行测试、以查看相同寄存器设置是否有不同的结果?

    此致、

    Jonathan

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

    您好、Jonathan、

    我找到了问题。 在0x105C 中启用 EINT0以测试 GPO2后、我还能够在 nINT 引脚上获取中断。 看起来是否需要启用 EINT0或 EINT1才能使 nINT 引脚正常工作以处理 CAN 中断? 我的印象是、只有在将 GPO1或 GPO2用于 m_CAN_int 0/1时、才必须启用它们。 再次感谢您的所有帮助!

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

    您好、Sandy、

    很棒!  是的、这是有道理的。  MCAN CAN FD 控制器是博世开发的独立 IP 块、通常嵌入在 MCU 或 FPGA 中、并使用独立的 CAN FD 收发器。  TCAN4550率先在同一 IC 中创建 CAN FD 控制器和收发器。  

    MCAN IP 是自包含的、具有到两条中断线路的所有中断位输出、这两条中断线路输出到 TCAN4550、MCU 或 FPGA 引脚。 在寄存器中、用户可以配置各种中断位以使用两条线路中的任何一条。

    TCAN4550从 MCAN 中获取这两条中断线路、并将它们添加到其他 TCAN4550器件级中断位、例如过压/欠压和温度警告或 SPI 错误等

    TCAN4550器件中断显示在寄存器0x0820中、MCAN 中断显示在寄存器0x1050中、以及地址为0x0824的0x1050的只读副本。  该只读 MCAN 寄存器允许在 SPI 头字中使用长度为2的字段对寄存器0x0820和0x0824进行单次 SPI 读取、从而节省时间并提高 SPI 效率。

    nINT 引脚只是寄存器0x0820和0x0824的逻辑 OR。

    禁用两条 MCAN 中断线路实质上会阻止 MCAN 中断到达中断寄存器的 TCAN4550端、因此会阻止 nINT 引脚对它们做出响应。

    某些应用要求或更愿意为 TCAN4550器件中断(电压、温度和 SPI 错误等)和 MCAN 中断提供单独的中断线路。  GPIO1和 GPO2可用于将特定的 MCAN 中断隔离到专用的 MCAN 中断引脚、通常在 MCU 的中断服务程序中为其提供更高的优先级。

    我意识到我假设您至少启用了一个 MCAN 中断线路、但现在我将在以后收到的问题中提供此调试建议。  因此、我也从该主题中获得了一些内容、我很高兴帮助您解决您的问题。

    此致、

    Jonathan

x 出现错误。请重试或与管理员联系。