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-Q1:查询 RX 通信的 TCAN4550 中断处理

Guru**** 2872490 points

Other Parts Discussed in Thread: TCAN4550-Q1, TCAN4550

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1637169/tcan4550-q1-query-on-tcan4550-interrupt-handling-for-rx-communication

器件型号: TCAN4550-Q1
主题: TCAN4550 中讨论的其他器件

尊敬的团队:

我们使用的是 TCAN4550-Q1 模块与基于 SPI 的 i.MX93 处理器。 我们想了解 RX 通信期间中断引脚的行为。

在我们的当前设置中、RX FIFO 水线配置为 26 条消息。 基于此、我们预计在收到 26 条消息后会生成中断、之后应触发消息接收流程。 此外、我们已启用看门狗计时器 (WDT) 60ms、因此如果 FIFO 未达到 26 条消息、仍可通过 WDT 中断来处理待处理消息。

然而、在分析过程中、我们观察到在探测 SPI 和中断线路时、每 26 条消息确实会生成一个中断。 但是、在 m_can_ISR 中断服务例程中添加跟踪日志来检查驱动程序行为时、控制不会进入水线中断条件。 相反、它一致地进入 RF0N 中断条件。

我们想了解在 INT 线路上观察到的硬件级中断如何与驱动器级中断处理相关。 具体而言、我们希望了解驱动程序中从中断产生到消息接收处理的完整中断流程。

目前、此流程中存在一些混淆、我们主要关注的是高 CPU 利用率、这会影响其他进程。 我们非常感谢您在理解和解决此问题方面提供指导。

谢谢你。

 

此致、

Ankita

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

    您好 Ankita、

    我相信您可以在以下两个文档中找到所需内容:

    TCAN45xx 软件用户指南 (链接)

    MCAN 用户手册 (链接)

    TCAN4550 使用 Bosch 开发的 CAN FD 控制器“MCAN"。“。  除了寄存器地址外、IP 在没有修改的情况下使用、TCAN4550 在每个寄存器地址中添加了 0x1000 的偏移量。  例如、MCAN 用户手册中将控制寄存器列为 0x18、但在 TCAN4550 中、由于偏移、该寄存器为 0x1018。  另请注意、TCAN4550 只有 2k 的 MRAM、但 MCAN IP 可以支持超过 2k 的配置、因此必须注意在配置中不要使用超过 2k 的 MRAM。  除了寄存器地址差异外、MCAN 用户手册中的信息直接适用于 TCAN4550、本文档可用作 TCAN4550(与 MCAN 相关)的补充。

    您可以在中断使能寄存器 0x1054 中启用/禁用 MCAN 中断。  如果您不希望接收 RF0N 中断、而只接收 RF0W 中断、则需要设置 RF0NE = 0 并设置 RF0WE = 1。

    0x0800 寄存器地址与 MCAN 无关。  配置寄存器 0x0800 和器件相关中断寄存器 0x0820 用于与 MCAN 无关的看门狗等功能。

    MCAN 中断寄存器为 0x1050、但具有地址为 0x0824 的“只读“复制、该复制放置在器件中断寄存器 0x0820 附近。  这允许在长度为 2 的单个 SPI 读取事务中读取 oxo820 和 0x0824 中断寄存器、从而无需对寄存器 0x0820 和 0x1050 进行两次单独的 SPI 读取、从而节省时间。  但是、如果设置了任何 MCAN 中断位、则需要通过写入寄存器 0x1050 来将其清除。

    MCAN 有两条中断线、可用于将不同的中断隔离到不同的中断线。  您可以使用中断线选择寄存器 0x1058 将不同的 MCAN 中断位分配给不同的线路。  如果您将 GPIO1 和 GPO2 引脚连接到 MCU、也可用作额外的硬件中断线路。  您可以使用中断线使能寄存器 0x105C 来启用或禁用 MCAN 中断线路。

    nINT 引脚是全局中断引脚、将反映寄存器 0x0820 和 0x0824(包括 MCAN)中所有启用的中断位。  如果这是唯一使用的硬件中断引脚、也可以、但请注意、它反映的不仅仅是 MCAN 中断。  如果您只关心 MCAN 中断、则使用 GPIO1 或 GPO2 引脚可以将该引脚专用于非常特定的中断位。  但是、这不会阻止它们也在全局 nINT 引脚上报告、但它确实提供了用于在需要时为不同中断设置优先级的选项。

    我希望这能解决您的问题。

    此致、

    Jonathan

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

    尊敬的 Jonathan:

    感谢您的答复。

    我们主要的困惑是、当我们探测 INT 线时、我们会观察到每 26 条消息(根据配置的水线位)生成一个中断。 但是、在驱动程序级别、控制不会进入基于水线的中断处理条件;相反、它始终进入 RF0N(新消息)中断条件。

    根据驱动程序流、我们预计每条消息都会触发中断、但这不是我们观察到的情况。 因此、我们想了解这种行为的发生原因以及确切的中断处理流程是什么。

    我希望这澄清了我们试图传达的问题。

    此致、
    Ankita

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

    您好 Ankita、

    好的、我知道您的问题不在于如何启用寄存器、并且器件正在按照您的预期设置相应的中断位。   

    您可能需要根据应用程序调整中断服务处理例程。  我在器件级别支持 TCAN4550-Q1、并帮助您解决寄存器配置问题、或者您在使用器件时遇到问题。   

    我不确定您的例程当前是什么、但概括来说、当看到水线中断位时、需要清除它、然后开始从 RX FIFO 中读取消息。  从 RX FIFO 读取消息的过程是相同的、适用于以下情况:您将中断设置为在每个新消息到达后读取消息、或者您是否在开始读取消息之前等待多条消息到达 RX FIFO。  您只需频繁地阅读消息、以防止溢出情况导致数据丢失。

    此致、

    Jonathan

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

    尊敬的 Jonathan:

    感谢您的答复。

    如前所述、TCAN 驱动程序中启用了 60ms 看门狗计时器、以确保即使在未达到 RX FIFO 水线位时也能读取数据。

    在此上下文中、我们想了解应在 m_can 中断服务例程中检查哪个中断位来处理此条件。

    目前、我们使用 IR_RF0W 来检测 FIFO 水线中断。 但是、我们想知道如何处理未达到水线位且需要根据看门狗计时器触发读取数据的情况。 具体来说、在这种情况下应监控哪个中断字段、以及如何管理此流程以及基于水线的处理?

    我们感谢您就此提供指导。

    此致、

    Ankita

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

    您好 Ankita、

    TCAN4550-Q1 有三组不同的寄存器或寄存器组、每个组具有不同的地址范围、MRAM 有第四个 SPI 地址范围。

    MCAN 特定寄存器的地址范围为 0x1000 到 0x10FC、MCAN 特定中断寄存器的地址为 0x1050。

    与器件其他功能相关的非 MCAN 寄存器的地址范围为 0x0800 至 0x083C、非 MCAN 器件中断寄存器的地址为 0x0820。

    RX FIFO 水线 (RF0W) 位是寄存器 0x1050 中的位 1。   

    看门狗超时 (WDTO) 是寄存器 0x0820 中的位 18。

    请注意、非 MCAN 地址范围内的寄存器 0x0824 是已创建的 MCAN 中断寄存器 0x1050 的只读副本、以便在长度字段设置为 2 的单个 SPI 事务中可以读取这两个中断寄存器。  如果 MCU 配置为执行此操作、则仍需要通过写入寄存器 0x1050 来清除任何 MCAN 位。

    对于您的应用、我假设当您收到看门狗超时中断时、您只需运行相同的例程即可读取和清除获取 RX FIFO 水线中断时使用的 RX FIFO。

    此致、

    Jonathan