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.

[参考译文] TMS570LC4357-EP:CAN 消息过滤器在 TMS570LC4357-EP 器件上未按预期工作。

Guru**** 2463330 points
Other Parts Discussed in Thread: TMS570LC4357-EP, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/964121/tms570lc4357-ep-can-message-filter-is-not-working-as-expected-for-tms570lc4357-ep-device

器件型号:TMS570LC4357-EP
主题中讨论的其他器件: HALCOGEN

尊敬的先生:

我正在使用 TMS570LC4357-EP 板、在该板中、我尝试针对以下限制配置 CAN。

  1. 仅接受给定 ID 的消息框。
  2. 对于 TXand RX、单个框中的 id 范围接受消息框。

我已经尝试使用下面显示的代码作为我的示例、该代码是从 halcogen 生成的:

1.仅接受消息框2中的 ID 0x7UL:

/*重置超时值。 *
while ((canREG1->IF2STAT & 0x80U)=0x80U)
   {
   }/*等待*/

canREG1->IF2MSK
               = 0xC0000000U/* MXtd、MDir *
               |(T_UINT32)((T_UINT32)((T_UINT32) 0x1FFFFFFFUL&(T_UINT32) 0x1FFFFFFFU)<<(T_UINT32) 0x0UL);/* extendard mask*/

canREG1->IF2ARB
               =(T_UINT32) 0x80000000U/* MsgVal */
               |(T_UINT32) 0x0000U /*XTD*/
               |(T_UINT32) 0x00000000U /*目录作为 Rx*/
               |(T_UINT32)((T_UINT32)((T_UINT32) 0x7UL &(T_UINT32) 0x1FFFFFFFU)<<(T_UINT32) 0x0UL);/* extendard 标识符*/        

canREG1->IF2MCTL
               = 0x00001000UL /*使用接受屏蔽*/
               |(T_UINT32) 0x00000400U /* RxIE*/
               |(T_UINT32) 8U;/*DLC*/        

CANREG1->IF2CMD =(T_UINT8) 0xF8U;        

canREG1->IF2NO  = 2U;

问题/意见:

    1. 即使接收来自 ID 0x3x 或0x2x 的消息、甚至是0x7x 的消息、也会触发中断。 我不确定为什么会触发0x3x 和0x2x 的中断,请告诉我为什么会触发中断。
    2. 即使我禁止使用 "IF2MCTL"寄存器中的接受屏蔽、行为也是一样的。

2.要在 ID 0x10UL 至0x17UL 范围内从消息框2接受:

/*重置超时值。 *
while ((canREG1->IF2STAT & 0x80U)=0x80U)
   {
   }/*等待*/

canREG1->IF2MSK
               = 0xC0000000U/* MXtd、MDir *
               |(T_uint32)((T_uint32)((T_uint32) 0x1FFFFFF8UL&(T_uint32) 0x1FFFFFFFUL)<<(T_uint32) 0x0UL);/* extendard mask*/

canREG1->IF2ARB
               =(T_UINT32) 0x80000000U/* MsgVal */
               |(T_UINT32) 0x0000U /*XTD*/
               |(T_UINT32) 0x00000000U /*目录作为 Rx*/
               |(T_UINT32)((T_UINT32)((T_UINT32) 0x17UL &(T_UINT32) 0x1FFFFFFFU)<<(T_UINT32) 0x0UL);/* extendard 标识符*/        

canREG1->IF2MCTL
               = 0x00001000UL /*使用接受屏蔽*/
               |(T_UINT32) 0x00000400U /* RxIE*/
               |(T_UINT32) 8U;/*DLC*/        

CANREG1->IF2CMD =(T_UINT8) 0xF8U;        

canREG1->IF2NO  = 2U;

问题/意见:

  1. 为接收 ID 0x3x 或0x2x 发出的消息、甚至为0x7x 触发中断。 我不确定为什么仅针对0x17x 触发消息回调、 而仅针对其他 ID 接收到 Rxok。 请告诉我原因。
  2. ID 范围的接收配置如上述代码 snappet 中所示、但不确定如何为给定 ID (ID 范围)进行传输。
  3. 如果消息框配置为 DLC: 8、(8字节)且数据传输仅为5字节、谁可以在传输期间将 DLC 更改为5字节?、我在控制之后更改了 DLC 寄存器(IF2CMD =((T_UINT8)(M_IFxCMD_DATAB | M_IFxCMD_DATAA | M_IFxCMD_DATAA | M_IFxCMD_TXW8)、但已在 CANQRxCMD_RQW8中接收到数据分析器、但已在 CANxCMD_RQWQRxCMD_8中接收数据。
请告诉我、是什么导致了问题。
谢谢、此致
苏布拉马尼亚 a
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Subramanya A">中断被触发以接收来自 id 0x3x 或0x2x 的消息、甚至是0x7x 的消息。 我不确定为什么仅针对0x17x 触发消息回调、 而仅针对其他 ID 接收到 Rxok。 请告诉我原因。[/引述]

    配置看起来正确。 您是否已验证您是否仅收到 CAN 消息框2对象中断、而不是状态中断或错误中断?

    [引用 user="Subramanya a"] ID 范围的接收配置如上面的代码 snappet 中所示,但不确定如何传输给定 ID (ID 范围)。

    您无法传输 ID 范围的 CAN 消息。 如果您需要传输具有不同 ID 的消息、它们将是不同的消息。 您可以使用多个邮箱,也可以在对 canTransmit()的调用之间重复使用一个调用 canUpdateID()的邮箱。

    [引用 USER="Subramanya A"]如果消息框配置为 DLC:8 (8字节)且数据传输仅为5字节,则在传输过程中,谁可以将 DLC 更改为5字节。?[/引用]

    如果只想传输5个字节的消息,则必须重新配置消息框。 必须写入 IFxMCTL 和 IFxNO 寄存器。 最简单的方法是从 HALCoGen 复制原始配置并创建一个用于更改 DLC 代码的函数:

     

    /**-初始化消息2.
    * -等待 IF2就绪可供使用
    * -设置消息掩码
    * -设置消息控制字
    * -设置消息仲裁
    * -设置 IF2控制字节
    * -设置 IF2信息编号
    *
    /*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
    while ((canREG1->IF2STAT & 0x80U)=0x80U)
    {
    } /*等待*/
    
    CANREG1->IF2MSK = 0xC0000000U |(UINT32)((UINT32)((UINT32) 0x000007FFU &(UINT32) 0x000007FFU)<<(UINT32) 18U);
    CANREG1->IF2ARB =(uint32) 0x8000000000U |(uint32) 0x000000000000 U |(uint32) 0x20000000U |(uint32)(((uint32) 0x200U &(uint32) 0x000007FFU)<<(uint32) 18U;
    CANREG1->IF2MCTL = 0x00001000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 5U;
    CANREG1->IF2CMD =(uint8) 0xF8U;
    canREG1->IF2NO = 2U;
    

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

    尊敬的先生:

    感谢重播、

    1.很抱歉,我的意见(标准和延长的意见仍然相同),如下所述。

      1. 在轮询模式中、我只将一个消息框配置为 ID 为0x7的 Rx。
        1. 仅考虑匹配标识符(即仅0x7)的接收、无问题
      2. 将模式更改为中断模式(启用 IE0、IE1、SIE 和 EIE)
        1. 收到 ID 0x7时 ,会触发通知(canStatusChangeNotification、canMessageNotification)。  没有问题

        • 问题/意见
          1.  即使不匹配 ID (即0x2或0x3)也会触发 canStatusChangeNotification (Rxok)的中断, 我的问题是,为什么会触发它?
          2. 针对不匹配的 ID (即0x2或0x3)触发 canMessageNotification、观测器数据寄存器中没有数据。

    2. 传输过程中 DLC 更改、未正常工作、我将粘贴的消息框配置代码复制到传输函数、如下所示。
    /*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
    while ((canREG1->IF1STAT & 0x80U)=0x80U)
    {
    } /*等待*/
    
    /*消息框为1,它是标准 ID */
    CANREG1->IF1MSK = 0xC0000000U |(UINT32)((UINT32)((UINT32) 0x000007FFU &(UINT32) 0x000007FFU)<<(UINT32) 18U);
    CANREG1->IF1ARB =(uint32) 0x8000000000U |(uint32) 0x000000000000 U |(uint32) 0x000000000000 U |(uint32)(((uint32) 7U 和(uint32) 0x000007FFU)<<(uint32) 18U);
    CANREG1->IF1MCTL = 0x00001000U |(UINT32) 0x00000400U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 6U;
    CANREG1->IF1CMD =(uint8) 0xF8U;
    canREG1->IF1NO = MessageBox;
    
    /**-等待 IF1准备就绪可供使用*/
    /*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
    while ((node->IF1STAT & 0x80U)=0x80U)
    {
    } /*等待*/
    
    /**-为配置 IF1
    * -消息方向-写入
    * -数据更新
    * -起动变速箱
    *
    NOD->IF1CMD = 0x87U;
    
    /**-将 TX 数据复制到 IF1中*/
    对于(I = 0U;I < 8U;I++)
    {
    #if ((__little_endian__= 1)||(__little_ENDIAN__= 1)
    /*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
    NODE->IF1DATx[i]=*数据;
    /*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
    Data++;
    其他
    /*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
    NODE->IF1DATx[s_canByteOrder[i]=*数据;
    /*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
    Data++;
    #endif
    }
    
    /**-将 TX 数据复制到消息框中*/
    /*SAFETYMCUSW 93 S MR:6.1、6.2、10.1、10.2、10.3、10.4 "LDRA 工具问题"*/
    NOode->IF1NO =(uint8) MessageBox; 

    请告诉我、原因是什么。 代码片段保持不变。

    谢谢、此致
    苏布拉马尼亚 a

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

    [引用 user="Subramanya"] 即使对于不匹配的 ID (即0x2或0x3),也会触发 canStatusChangeNotification (Rxok)的中断, 我的问题是,为什么触发它?  

    这是状态中断的正确操作。 RxOK 表示您已正确配置并收到有效的 CAN 消息。  通常、您不需要启用状态更改中断。 下面是技术参考手册第1445页的说明。

    [引用 user="Subramanya"]但针对不匹配的 ID (即0x2或0x3)触发 canMessageNotification,观察器数据寄存器中没有数据。

    这也是正确的操作、假设我们将讨论您的第一个配置示例。 您没有将消息框配置为接收 ID 为0x2或0x3的消息、因此检测到这些消息、但未保存。  

    [引用 user="Subramana">2.  在传输过程中 DLC 更改、无法正常工作、我将粘贴的消息框配置代码复制到传输函数、如下所示。

    您的项目是否很小? 如果是、请使用 CCS、执行"File"->"Export"并将项目导出到.zip 文件。 然后将该文件附加到此线程。