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.

[参考译文] TM4C1232H6PM:没有状态中断的 CAN 消息中断

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1420077/tm4c1232h6pm-can-message-interrupt-without-status-interrupt

器件型号:TM4C1232H6PM

工具与软件:

您好!

我正在使用 can_isr (使用 TivaWare)、它看起来像这样:

void _canISR(uint32_t CAN_BASE)
{
  uint32_t status = 0x00;
  uint32_t ui32Status = 0x00;

  ui32Status = CANIntStatus(CAN_BASE, CAN_INT_STS_CAUSE);

  //status interrupt or highest priority message interrupt with pending interrupt
  if ((ui32Status == CAN_INT_INTID_STATUS) || ((ui32Status <= 32) && (ui32Status > 0)))
  {
    status = CANStatusGet(CAN_BASE, CAN_STS_CONTROL);


    if (status & CAN_STATUS_RXOK)
    {

           ...

    }

}

我现在遇到状态为0但 ui32Status 不为0的问题、我不明白这是如何发生的。 是否每个消息中断也会导致状态中断?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价用户 id="622437" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1420077/tm4c1232h6pm-can-message-interrupt-without-status-interrupt ]ui32Status = CANIntStatus (can_base、can_int_sts_cause);

    您好!

     CANIntStatus 读取 CANINT 寄存器。 该值表示引发中断的报文对象的数量。 例如、如果将消息对象0设置为发送或接收、则 CANINT 将显示值1。 但是、如果有错误、则将显示0x8000。

    状态= CANStatusGet (can_Base、can_sts_control);

    CANStatusGet 读取 CANSTS 寄存器。 由于没有误差、因此读取后该值为零。  

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

    尊敬的 Charles:

    非常感谢您的答复!

    我认为 CANStatusGet (CAN_BASE、CAN_STS_CONTROL);即使没有错误、也可以不为0、例如、如果成功接收到消息、则应包含 RXOK 位。

    因此,假设消息被成功接收,我希望 CANStatusGet ()返回 RXOK 和 CANIntStatus ()返回相应消息对象的编号。

    我仍然不明白在什么情况下 CANIntStatus()将是!=0 (表示一个挂起的中断),但 CANStatusGet =0 (表示没有中断和没有消息接收或传输)。

    你能详细说明一下吗?

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

    您好、Dominic:

    [报价 userid="622437" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1420077/tm4c1232h6pm-can-message-interrupt-without-status-interrupt/5441019 #5441019"]

    我认为 CANStatusGet (CAN_BASE、CAN_STS_CONTROL);即使没有错误、也可以不为0、例如、如果成功接收到消息、则应包含 RXOK 位。

    [报价]

    同意。

    您能否在 CANStatusGet 中放置一个断点、并单步执行代码。  当输入该函数时、CANSTS 的值是多少。 假设 RXOK 未置位、但其他位已置位。 在这种情况下、您的 IF (STATUS 和 CAN_STATUS_RXOK)将变为零。  

     另请注意、 RXOK、TXOK 或 LEC 将在读取 CANSTAT 后被清除。 请参阅 下面突出显示的陈述。 有关 CANStatusGet ()的详细信息、请参阅 can.c 文件中的源代码。

    //
    // Just return the global CAN status register since that is what was
    // requested.
    //
    case CAN_STS_CONTROL:
    {
    ui32Status = HWREG(ui32Base + CAN_O_STS);
    HWREG(ui32Base + CAN_O_STS) = ~(CAN_STS_RXOK | CAN_STS_TXOK |
                                    CAN_STS_LEC_M);
    break;
    }

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

    感谢您的答复。

    当我单步执行代码时、通常我得到ui32Status == CAN_INT_INTID_STATUS(从 CANIntStatus)并且 STATUS == RXOK (或 TXOK)。 这对我来说是正常的和预期的行为。

    我很少会遇到 ui32Status == 2和 status == 0的情况, 我不明白它是如何产生的。 当我用 CANMessageGet (can_BASE、ui32Status、...)查看挂起的消息中断时 我识别了消息 ID、但消息长度不是我与该消息一起发送的长度。

    -消息是否可以被破坏,从而触发消息中断,而不是状态中断?

    -多个 CAN 消息可以快速连续"相互"吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我单步执行代码时、通常获得ui32Status == CAN_INT_INTID_STATUS(来自 CANIntStatus)并且 STATUS == RXOK (或 TXOK)。

    如果 ui32Status == CAN_INT_INTID_STATUS 则检测到某种类型的错误。  

    我很少遇到 ui32Status == 2和 status == 0、
     

    我不知道这个组合的答案。 如果 ui32Status =2、则表示中断是由于消息对象1造成的。 状态可以是 RXOK 或 TXOK、取决于您是将消息目标用于发送还是接收。  

    你能在 _canisr()的开头放置一个断点吗? 处理器在断点停止后、使用"Register Browser"(寄存器浏览器)窗口查看 CAN 寄存器。 我希望它能提供一些线索。  

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

    感谢您的答复。

    我将使用您介绍的工具来处理这一问题。

    感谢您的热情支持!