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.

[参考译文] TMS570LS3137:当中断被置为无效时触发 DCAN 中断。

Guru**** 2538960 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1409348/tms570ls3137-dcan-interrupt-fired-when-interrupts-are-deactivated

器件型号:TMS570LS3137
主题中讨论的其他器件:HALCOGEN

工具与软件:

你好

我们注意到一种行为、 在加电时接收到 CAN 消息 触发中断。 ISR 中读取的 INT 寄存器值为0。

我曾尝试在启动时禁用 CTL 寄存器中的 IE0和 IE1位、并在稍后将其激活、但仍然触发中断。 请找到 ISR 中寄存器值的屏幕截图。

 

此外、我还尝试将 CAN 保持在初始化模式、也在初始化模式中触发中断。  

INT 寄存器的值0意味着没有挂起的中断是正确的? 那么、为什么调用 ISR 呢?  

INT 中的值0是否意味着复位? 我们应该忽略该中断?  

触发此复位中断的条件是什么?  

此致、

Anudeep Varada

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

    Anudeep、您好!

    [quote userid="542802" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1409348/tms570ls3137-dcan-interrupt-fired-when-interrupts-are-deactivated INT 寄存器的值0意味着没有挂起的中断是正确的吗? 那么、为什么调用 ISR 呢?  [报价]

    您是否发送了任何 CAN 数据包以获得中断?

    您能否提供您的项目或最简单的项目来解决问题、以便我在最后对问题进行调试

    ——
    谢谢、此致、
    Jagadish。

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

    您好!

    是的、我将发送 CAN 消息。 不过、IE0和 IE1位均为0、因此不应正确触发中断?

    我正在使用由 halcogen 生成的 CAN 文件,并在 canInit ()之后的启动时进行以下更改

      canREG2->CTL |=~(1<<1);
      canREG2->CTL |=~(1 << 17);
    请在 attachemente2e.ti.com/.../5074.can.c 中找到 CAN 文件
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Anudeep、您好!

    正确、如果 IEx 位为0、则不应生成中断。

    我还验证了旧线程和勘误表、但我没有看到任何与此行为相关的问题。

    因此、我想在最后测试这种行为 给我一些时间来测试和提供我的更新。

    ——
    谢谢、此致、
    Jagadish。

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

    Anudeep、您好!

    我理解了行为、实际上这不是问题、而且这只是预期行为:

    实际上、在 CAN 模块端有两个中断使能位:

    1.模块级中断使能位(IEx):

    它是模块级中断使能位、每个 CAN 实例都有一个使能位。 例如、IE0是 CAN1的模块级中断

    2.报文对象级中断:

    每个消息对象将有一个中断。

    例如、可以通过在 HALCoGen 中使用下面突出显示的行来启用消息目标54中断。

    因此、如数据表中提到的、如果启用了消息对象级中断、Intpend (中断挂起)位将在成功发送或接收消息时被触发。

    我的意思是、举例来说、如果我们启用消息对象级中断并禁用模块级中断。 现在、如果相应的消息对象数据已发送/接收、则 Intpend 标志将被设置。 但当然、将调用处理程序、因为尚未启用模块级中断。 一段时间后、如果您启用模块级中断、则处理程序将由于挂起的中断而立即调用。 现在处理程序应该为这些中断提供服务。 这正是我们在你们这边看到的行为。

    示例:

    我正在为消息对象54启用消息对象级接收中断

    并且在将数据发送到消息目标54之前、我禁用了 CAN 模块级中断

    那么、如果我现在发送消息、正如您可以看到我的中断处理程序未被调用、但是相应消息对象的挂起中断被设置。

    那么、现在如果我启用模块级中断:

    现在您可以看到中断处理程序会立即被调用。

    如果你不想设置这些挂起的中断、那么我们在需要之前就不应该启用消息对象级别的中断。

    ——
    谢谢、此致、
    Jagadish。