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**** 2315160 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/584307/rm46l852-trouble-updating-data-in-can-message-object

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

你(们)好

更新 CAN 消息对象时遇到问题。 我正在进行原型设计的应用将需要超过64个 CAN 消息、因此我必须动态更改消息对象的内容。

我已经使用 HALCoGen 生成代码、然后编写了 CanTransmit 的修改版本、请参阅下面的代码片段。 ID 和 DLC 正确、但在 CAN 总线上不存在数据。

我缺少什么?

uint32 ExtCanTransmit (canBASE-t *节点、uint32 MessageBox、uint16 msgBoxArbitVal、uint8 DLC、const uint8 *数据)

uint32 i;

uint32成功= 0U;

uint32 regIndex =(MessageBox - 1U)>> 5U;

uint32 bitIndex = 1U <<(MessageBox - 1U)和0x1FU);

//检查输入参数

if (MessageBox > 64U || msgBoxArbitVal > 0x7FFU || DLC > 8U){

//错误! TODO 添加断言

返回0;

/**-检查待处理消息:

*-待处理消息、返回0

*-无待处理消息、开始新传输

*

if ((node->TXRQx[regIndex]& bitIndex)!= 0U){

成功= 0U;

否则

//接口寄存器是否可用?

if ((node->IF1STAT & 0x80U)=0U){

// IF1是免费的

NOD->IF1CMD = 0xB7U;// Dir =写入、访问仲裁位、控制位、数据 A 和数据 B

NOE->IF1ARB &= 0xE0000000U;//保持 MsgVal、XTD Dir 设置。

NODe->IF1ARB |=((UINT32)(msgBoxArbitVal & 0x7FFU)<<18U);//将传递的值复制到仲裁寄存器中。

NODE->IF1MCTL &= 0xFFFFFFF0U;//保留除 DLC 之外的所有内容。

NODE->IF1MCTL |=((UINT32) DLC & 0x0000000FU);//复制 DLC。

//复制 TX 数据

对于(I = 0U;I < DLC;I++){

NODE->IF1DATx[i]=*数据;

Data++;

//将 TX 数据复制到消息框中

NOode->IF1NO =(uint8) MessageBox;

成功= 1U;

否则

//没有可用的接口寄存器,请稍后重试。

成功= 0U;

返回成功;

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

    请使用
    while ((node->IF1STAT & 0x80U)=0x80U) {}

    要等待而不是使用的语句、请执行以下操作:

    if ((node->IF1STAT & 0x80U)=0U){....}

    如果在 IFX 寄存器和 MSG RAM 之间传输数据正在进行中、则您的代码位于此{...}中 将被忽略。

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

    您好 QJ、

    感谢你的答复。 不幸的是、这不能解决我的问题。 执行我的 if 语句之后的代码、因为 CAN 消息是在总线上发送的。 ID 和 DLC 正确。 但缺少 TX 数据内容。

    通常、我希望避免出现术语性不足的循环、我更喜欢"运行至完成"、如果接口寄存器(在本例中)被占用、我只需再次尝试下一个内核节拍。

    我必须缺少其他一些东西、这些东西会使数据消失。

    当我插入此代码时、ID 不会更新、但 TX 数据起作用:

     

    NOD->IF1CMD = 0x87U;

    对于(I = 0U;I < 8U;I++)

    NODE->IF1DATx[i]=*数据;

    Data++;

    NOode->IF1NO =(uint8) MessageBox;

    但是、由于我还想更新 ID (仲裁信息)、我尝试了:

    NOD->IF1CMD = 0xB7U;// Dir =写入、访问仲裁位、控制位、数据 A 和数据 B

    NOE->IF1ARB &= 0xE0000000U;//保持 MsgVal、XTD Dir 设置。

    NODe->IF1ARB |=((UINT32)(msgBoxArbitVal & 0x7FFU)<<18U);//将传递的值复制到仲裁寄存器中。

    NODE->IF1MCTL &= 0xFFFFFFF0U;//保留除 DLC 之外的所有内容。

    NODE->IF1MCTL |=((UINT32) DLC & 0x0000000FU);//复制 DLC。

    //复制 TX 数据

    对于(I = 0U;I < 8;I++){

    NODE->IF1DATx[i]=*数据;

    Data++;

    //将 TX 数据复制到消息框中

    NOode->IF1NO =(uint8) MessageBox;

     

    但 TX 数据不会在 CAN 总线上获取。

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

    此问题现已解决。 我错过了仲裁寄存器中的"Dir"位被设置为0、因为要初始化的最后一条消息是一条接收消息。

    对于以下代码片段、所有代码均按预期工作:

    // IF1是免费的
    节点->IF1CMD = 0xB7U; // Dir =写入、访问仲裁位、控制位、数据 A 和数据 B
    NOLE->IF1ARB = 0xA0000000U |((UINT32)(msgBoxArbitVal & 0x7FFU)<< 18U);//将传递的值复制到仲裁寄存器中。 设置 MsgVal 和 Dir。
    NODe->IF1MCTL &= 0x00000080U; //保留 EOB。
    NODe->IF1MCTL |=(0x00008100U |((UINT32) DLC 和0x0000000FU); //复制 DLC 并设置 NewDat 和 TxRqst。

    对于(I = 0U;I < DLC;I++){
    NODE->IF1DATx[i]=*(数据+ I); //复制 TX 数据


    NOode->IF1NO =(uint8) MessageBox; //将 TX 数据复制到消息框中

    成功= 1U;