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:使用 canUpdateID 功能重新配置 CAN 消息框

Guru**** 1831610 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/1356223/tms570lc4357-reconfigure-can-message-box-using-canupdateid-function

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

您好!

我想重新配置 CAN 消息框以进行发送和接收。

问题1:  

在 canUpdateID 函数中, node->IF2CMD =0xA0U;的目的是什么?

0xA0仅影响 ID 字段、为什么我们在 ID 字段中写入0xA0?

问题2:

我必须修改 canUpdateID 消息以适应某些寄存器文件更改、我已尝试在 HALCOGEN 生成代码时为寄存器分配值、如下所示。 但它不起作用。 没有传输更新对象 ID 后我要尝试传输的第二条消息。 此外、我看到在调试模式下、值不会写入寄存器。 IF2寄存器是否有写保护设置?

void canUpdateID(canBASE_t *node, bool isTx, uint32 messageBox, uint32 can_id)
{

    /** - Wait until IF2 is ready for use */
    while((*node).CAN_IF2CMD.bit.Busy)
    {
    } /* Wait */

    /** - Configure IF2 for
    *     - Message direction - Read
    *     - Data Read
    *     - Clears NewDat bit in the message object.
    */
    //(*node).CAN_IF2CMD.all = 0xA0U;
    //
    // Set direction to transmit
    //
    if(isTx)
    {
        (*node).CAN_IF2CMD.bit.DIR = 1U;
    }
    else
    {
        (*node).CAN_IF2CMD.bit.DIR = 0;
    }
    (*node).CAN_IF2CMD.bit.TxRqst = 0;

    /* Copy passed value into the arbitration register. */
    //(*node).CAN_IF2ARB.all &= 0x80000000U;
    (*node).CAN_IF2ARB.bit.MsgVal = 1;

    //node->CAN_IF2ARB.all |= (msgBoxArbitVal & 0x7FFFFFFFU);
    (*node).CAN_IF2ARB.bit.MsgVal = 0;
    if(isTx)
    {
        (*node).CAN_IF2ARB.bit.Dir = 1U;
    }
    else
    {
        (*node).CAN_IF2ARB.bit.Dir = 0;
    }

    (*node).CAN_IF2ARB.bit.ID = can_id << CAN_IF1ARB_STD_ID_S;

    /** - Update message box number. */
    /*SAFETYMCUSW 93 S MR: 6.1,6.2,10.1,10.2,10.3,10.4 <APPROVED> "LDRA Tool issue" */
    (*node).CAN_IF2CMD.bit.MSG_NUM = messageBox;

    /** - Wait until data are copied into IF2 */
    while((*node).CAN_IF2CMD.bit.Busy)
    {
    } /* Wait */

}
 

此致、

拉什米塔

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

    尊敬的 Rashmitha:

    在 canUpdateID 函数中, node->IF2CMD =0xA0U;的目的是什么?

    0xA0仅影响 ID 字段、为什么我们在 ID 字段中写入0xA0?

    [/报价]

    也许你感到困惑。 IF2CMD 表示非 ID 字段。

    这里我们将 IF2CMD 寄存器分为4个字符、如下所示:

    那么、我们在这里写入 IF2CMD 字段。 这意味着以下重点位将受到影响:

    我必须修改 canUpdateID 消息以适应一些寄存器文件的更改、我尝试了为寄存器分配值作为 HALCOGEN 生成的代码、如下所示。 但它不起作用。 没有传输更新对象 ID 后我要尝试传输的第二条消息。 此外、我看到在调试模式下、值不会写入寄存器。 IF2寄存器是否有写保护设置?

    下面我来解释一下我们在 HALCoGen 中到底要做些什么来更新 ID:

    1.  

    while ((node->IF2STAT & 0x80U) ==0x80U)
        {
        } /* Wait */

    上述指令用于等待  IF2繁忙。

    2.  

    node->IF2CMD = 0xA0U;

    在上述指令中、我们将设置 WR/RD 位和 ARB 位。

    这意味着我们在告诉 CAN 模块我们想要对消息 RAM 进行写入操作、同时我们在告诉我们想要更新仲裁字段(Identifier + Dir + Xtd + MsgVal)。

    3.

    node->IF2ARB &= 0x80000000U;
    	node->IF2ARB |= (msgBoxArbitVal & 0x7FFFFFFFU);

    在这两条指令中、我们将使用新的所需 ID 等更新仲裁字段。

    4.

    node->IF2NO = (uint8) messageBox;

    由于我们已经将新的 ID 更新到仲裁字段中、现在使用该指令、我们将针对相应的消息框启动实际写入到消息 RAM 中。

    5.

     while ((node->IF2STAT & 0x80U) ==0x80U)
        {
        } /* Wait */

    等到他更新完成。

    --

    谢谢。此致、
    Jagadish。

    [/quote]