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.

[参考译文] RM46L852:关于 CAN 中断设置

Guru**** 2394075 points
Other Parts Discussed in Thread: RM46L852, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/703557/rm46l852-about-can-interrupt-setting

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

您好!

我使用的是"RM46L852"。

我必须使用 CAN 通信的接收中断。
但是、我没有得到我想要的结果。

"HALCOGEN"用于如下设置:
我检查了生成的代码中"ca.c、ca.h、sys_vim.c 和 sys_vim.h"的内容、并将相关器件复制到了我的项目中。

请告诉我、除了上述文件之外、您是否还有任何需要检查的文件。

如果您有一个使用接收中断的示例、请分享。 我认为这将对我有所帮助。

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

    您好、Woodyonng、

    您的 HALCoGen 配置看起来不错、它应该生成具有 ISR 的 CAN 驱动程序(CAN.c)、如下所示:

    #pragma CODE_STATE (CAN1LowLevelInterrupt、32)

    #pragma INTERRUPT (CAN1LowLevelInterrupt、IRQ)

    /* sourceId:CAN_sourceId_021 */

    /* DesignId:CAN_DesignId_019 */

    /*要求:HL_SR221、HL_SR223 */

    void can1LowLevelInterrupt (void)

      uint32 MessageBox = canREG1->INT >> 16U;

    /*用户代码开始(44)*/

    /*用户代码结束*/

      /**-设置 IF1以清除暂挂中断标志*/

      /*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/

      while ((canREG1->IF1STAT & 0x80U)=0x80U)

      {

      }/*等待*/

      CANREG1->IF1CMD = 0x08U;

      /*SAFETYMCUSW 93 S MR:6.1、6.2、10.1、10.2、10.3、10.4 "LDRA 工具问题"*/

      canREG1->IF1NO =(uint8) MessageBox;

      /*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/

      while ((canREG1->IF1STAT & 0x80U)=0x80U)

      {

      }/*等待*/

      CANREG1->IF1CMD = 0x87U;

      canMessageNotification (canREG1、MessageBox);

    /*用户代码开始(45)*/

    /*用户代码结束*/

    在主函数中、请使用以下命令启用 IRQ 中断:

      _enable_interrupt_();

    _enable_IRQ ();

    HALCoGen 有一个使用中断的 CAN 示例:

      

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

    主函数的内容。
    我看不到问题。

    void main (void)

    /*用户代码开始(3)*/
    CanInit ();
    gioInit ();
    spiInit ();
    hetInit ();
    adcInit ();


        _enable_interrupt_();


    canEnableErrorNotification (canREG1);


    /*通过 CPSR 启用 CPU 中断*/
    _enable_IRQ ();


    除了"ca.c、ca.h、sys_vim.c 和 sys_vim.h"之外、HOLCOGEN 是否还生成其他文件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Woodyoung、

    请在 CAN ISR (CAN.c)中添加一个断点、以检查是否生成了中断。 或者,您可以添加 canMessageNotification()以检查是否存在 RX 中断:

    以下通知来自示例代码:

    /*可以中断通知*/
    /*注意-您需要从 notification.c 中删除 canMessageNotification 以避免重新定义*/
    void canMessageNotification (canbase_t *节点、uint32 MessageBox)

    /*节点1 -传输请求*/
    if (node=canREG1)

    TX_DONE=1;/*确认传输请求*/


    /*节点2 -接收完成*/
    if (node=canREG2)

    while (!canIsRxMessageArrived (canREG2、canMESSAGE_BOX1));
    canGetData (canREG2、canMESSAGE_BOX1、Rx_PTR);//复制到 RAM *
    RX_PTR +=8;


    /*注意:由于两个节点上都只使用了消息框1,因此我们不在此进行检查。*/
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回答。

    我通过向"void can1LowLevelInterrupt (void)"函数添加断点来检查它、但它不会进入此函数。

    但是、当在主函数中执行以下函数时、该值将出现在 Rx 数据中。

    CAN1RxID = canGetID (canREG1、canMESSAGE_BOX5);
    //while (!canIsRxMessageArrived (canREG1、canMESSAGE_BOX5));
    canGetData (canREG1、canMESSAGE_BOX5、canRxData);

    此外、当您取消注释"// while (! CanIsRxMessageArrived (canREG1、canMESSAGE_BOX5));"、您将在这里以无限循环结束。

    通常会执行通信、但不会发生中断。

    我认为中断设置有问题、但我不知道哪个部分。

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

    CPU 级别:_enable_IRQ ()以启用 IRQ 中断(CPSR 寄存器中的 I 位)
    2. VIM 电平:检查通道16或/和29是否存在 CAN1高电平和低电平中断
    3.模块级:启用 RX 中断(高电平或低电平、应与步骤2中相同)

    非常直接。 您能否检查寄存器是否设置正确?

    此致、