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.

[参考译文] AWR1642:AWR1642:更改 CAN 消息 ID 时出现问题

Guru**** 2577385 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/630466/awr1642-awr1642-problems-changing-can-message-ids

器件型号:AWR1642
Thread 中讨论的其他器件:SYSBIOS

您好;

在 CAN 消息最初配置后、我正在尝试更改其消息 ID。  我指的是现有消息框的 CAN_DCANMsgObjCfgParams 结构中的 msgIdentifier 字段。

我能够初始化 CAN 并发送和接收消息。  当我希望在运行时更改 msgIdentifier 时、这似乎是第一次工作、并且我可以使用新的消息 ID 发送和接收 CAN 消息。 当我第二次尝试更改消息框的消息 ID 时、它会失败。

在运行时修改消息框的 msgIdentifier 字段的建议方法是什么?  例如、J1939 CAN 规范需要这样做、其中信息编码到消息 ID 中、该 ID 将随着时间的推移而变化。  需要在上电周期中多次修改消息框的 msgIdentifier。

似乎没有 CAN_modifyMsgObject()或等效项。  有一个驱动程序函数 DCANConfigMsgObj(),可由 CAN_createMsgObject()使用,但如上所述只能更改消息 ID 一次。  第二次更改消息 ID 不起作用。

提前感谢、

Joe Shidle

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有关故障情况的其他详细信息:

    我已经尝试使用 CAN_deinit(),完全重新配置 CAN 子系统,以及 CAN_init()。 这会导致崩溃、指示 SYSBIOS 子系统中的异常。

    我已经尝试在希望更改的消息框中使用 CAN_deleteMsgObject(),然后使用 CAN_createMsgObject()重新创建它。 这是第一次使用、我可以发送具有新消息 ID 的消息。 但第二次会导致崩溃、表明在 SYSBIOS 子系统中释放堆内存失败。

    最后,我尝试直接从我的应用程序调用 DCANConfigMsgObj(),这是第一次运行,我能够使用新的消息 ID 发送消息。 但是、当我第二次或以后使用它时、它会继续使用旧的消息 ID。 例如、如果我从消息 ID 0x100开始、然后将其更改为0x101、则一切正常、消息框传输将以0x101消息 ID 结束。 如果我调用同一例程将其更改为0x102、0x103或0x104、则消息仍会以消息 ID 0x101退出。

    如果需要、我可以提供更多信息。

    不过、我的问题的要点仍然是:"如何在运行时更改消息框的 msgIdentifier 字段?"

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

    感谢您的提问。 让我和我的团队交谈、在接下来的几天里、我将有人对您做出回应。


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

    我们能够再现您在运行时指出的有关 CAN 消息 ID 配置的问题。

    但是、在 CANFD 接口上看不到同样的问题、CANFD 在经典 CAN 模式下工作。

    我们正在努力为您提供 CAN 驱动程序中的问题解决方案。
    感谢您的耐心等待。

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

    Joe Shidle、您好!

    我们能够在运行时配置 CAN 消息 ID、并使用修改后的消息 ID Tx 消息。

    下面是对$MMWAVE_SDK_01_00_00_05\packages/ti\drivers\can\test\con\main.c 中的 DcanTransmit 函数执行的代码修改:

    while (1)

    int32_t j = 1;
    int32_t 值;
    /*修改 Tx 消息标识符*/
    appDcanTxCfgParams.msgIdentifier = 0xC1 + j;

    J++;
    if ((0xC1+j)> 0xCF)

    J = 0;

    /*在此处创建 Tx 消息对象并删除 while ()循环之外创建的任何 Tx 消息对象*/
    txMsgObjHandle = CAN_createMsgObject (canHandle、DCAN TX_MSG_obj、&appDcanTxCfgParams、&errCode);
    if (txMsgObjHandle ==空)

    System_printf ("错误:可以创建 Tx 消息对象失败[错误代码%d]\n"、错误代码);
    返回-1;


    /*通过 Tx 消息对象发送数据*/
    RetVal = CAN_transmitData (txMsgObjHandle、&appDcanTxData、&errCode);
    如果(RetVal < 0)

    System_printf ("错误:可以为迭代%d 传输数据失败[错误代码%d]\n"、迭代计数、错误代码);
    返回-1;

    迭代 Count++;

    optionTLV.type = CAN_Option_DCAN 电源关闭;
    optionTLV.length = sizeof (uint8_t);
    值= 1;
    optionTLV.value =(void*)&value;

    RetVal = CAN_setOptions (canHandle、&OPTIONTLV、&errCode);
    如果(RetVal < 0)

    System_printf ("错误:可以设置选项睡眠失败[错误代码%d]\n"、错误代码);
    返回-1;

    optionTLV.type = CAN_Option_DCAN 电源关闭;
    optionTLV.length = sizeof (uint8_t);
    值= 0;
    optionTLV.value =(void*)&value;

    RetVal = CAN_setOptions (canHandle、&OPTIONTLV、&errCode);
    如果(RetVal < 0)

    System_printf ("错误:可以设置选项唤醒失败[错误代码%d]\n"、错误代码);
    返回-1;

    if (gDisplayStats = 1)

    gDisplayStats = 0;
    如果(((msgLstErrCnt =0)&&
    (dataMissMatchErrCnt = 0)&(RetVal = 0))

    System_printf ("调试:外部发送测试通过\n");

    其他

    System_printf ("调试:外部发送测试失败\n");
    RetVal =-1;

    System_printf ("调试:迭代次数:%d\n"、迭代计数);
    system_printf ("调试:传输的消息数:%d\n"、gTxPkts);
    System_printf ("调试:接收到的消息数:%d\n"、gRxPkts);
    System_printf ("调试:丢失的消息数:%d\n"、msgLstErrCnt);
    System_printf ("调试:错误状态中断:%d\n"、gErrStatusInt);
    System_printf ("\n\n");

    msgObjStats.handle = txMsgObjHandle;
    optionTLV.type = CAN_Option_DCAN _MSG_OBJECT_STATS;
    optionTLV.length = sizeof (CAN_DCANMsgObjectStats);
    optionTLV.value =(void*)&msgObjStats;

    RetVal = CAN_getOptions (canHandle、&OPTIONTLV、&errCode);
    如果(RetVal < 0)

    System_printf ("错误:可以获取失败的统计数据[错误代码%d]\n"、错误代码);

    System_printf ("调试:消息对象号:%d\n"、msgObjStats.msgObjectNum);
    System_printf ("调试:方向:%s\n"、(msgObjStats.Direction =0)? "接收":"发送");
    System_printf ("调试:接收到的中断数:%d\n"、msgObjStats.interruptsRxed);
    System_printf ("调试:处理的消息数:%d\n"、msgObjStats.messageProcessed);
    System_printf ("\n\n");

    msgObjStats.handle = rxMsgObjHandle;
    RetVal = CAN_getOptions (canHandle、&OPTIONTLV、&errCode);
    如果(RetVal < 0)

    System_printf ("错误:可以获取失败的统计数据[错误代码%d]\n"、错误代码);

    System_printf ("调试:消息对象号:%d\n"、msgObjStats.msgObjectNum);
    System_printf ("调试:方向:%s\n"、(msgObjStats.Direction =0)? "接收":"发送");
    System_printf ("调试:接收到的中断数:%d\n"、msgObjStats.interruptsRxed);
    System_printf ("调试:处理的消息数:%d\n"、msgObjStats.messageProcessed);
    System_printf ("\n\n");

    optionTLV.type = CAN_Option_DCAN 错误计数器;
    optionTLV.length = sizeof (CAN_DCANErrorCounter);
    optionTLV.value =(void*)&errCounter;

    RetVal = CAN_getOptions (canHandle、&OPTIONTLV、&errCode);
    如果(RetVal < 0)

    System_printf ("错误:可以获取错误计数器失败[错误代码%d]\n"、错误代码);

    System_printf ("调试:接收被动错误:%d\n"、errCounter.rxErrPassive);
    System_printf ("调试:发送错误计数器:%d\n"、errCounter.txErrCounter);
    System_printf ("调试:接收错误计数器:%d\n"、errCounter.rxErrCounter);

    RetVal = CAN_deleteMsgObject (txMsgObjHandle、&errCode);
    如果(RetVal < 0)

    System_printf ("错误:可以删除 Tx 消息对象失败[错误代码%d]\n"、错误代码);
    返回-1;

    通过此更改、您可以创建新的 TX 消息对象、并在消息对象被传输后将其删除。 要删除任何消息对象、我们需要将 CAN 接口置于"本地断电模式"、然后将其恢复到正常模式。

    下面也是从 AWR 器件在 PCAN 上接收到的消息的快照、消息 ID 在运行时发生更改。

      

    请告诉我这是否能解决您的问题。

    谢谢、

    Raghu

    ------------------------------------------------------

    如果您的问题得到了解答、请单击此帖子上的"验证答案"按钮。

    ------------------------------------------------------

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

    感谢您的调查和回应。 我将按照您的建议实施并告知您。

    但是、我确实有一个快速问题:当 CAN 接口处于"CAN_OPTION _DCAN _POWER_DOWN 设置为1时、CAN 接口是否仍然能够接收 CAN 消息?

    我担心在消息 ID 被改变的时间段内总线的可靠性。

    同样、SAE J1939 CAN 协议规范依赖于半定期修改 CAN 消息 ID、因为将大量数据编码到29位扩展 CAN 消息 ID 中。 我担心关闭 CAN 接口会影响现场产品的可靠性。

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

    我已将相关代码添加到我们的应用中、我们仍会看到问题。

    我们在开始时创建许多消息框对象、所有对象都具有默认消息 ID。 然后、我们在运行时的不同点更改 TX 消息框的消息 ID。 因此、有 N 个消息框、T 个 TX 消息框和 R 个 RX 消息框、其中 T + R = N

    我执行你的建议的方式如下:

    1) 1)删除1个或多个消息框对象
    2) 2)创建1个或多个具有新消息 ID 的新消息框对象
    3) CAN_setOptions()关闭电源
    4) CAN_setOptions()以唤醒
    (笑声) 一段时间后
    5) 5)使用新消息 ID 发送

    这是第一次工作。 我能够更改1个或多个 TX 消息 ID、然后使用新消息 ID 进行传输。

    第二次更改消息 ID 时,系统将挂起。

    使用调试器,在断电段期间,问题似乎出现在 CAN_setOptions()内。 等待系统完全断电时、系统似乎卡在 DO 中。

    有时我们还会在运行时看到此错误、该错误在上面的步骤2 (创建新的消息对象)中出现:

    ThreadType_Hwi 中发生异常。
    Hwi 句柄:0x0。
    Hwi 堆栈基地址:0x8026100。
    Hwi 堆栈大小:0x1000。
    R0 = 0x08f81e08 R8 = 0x0001ef90
    R1 = 0x00000001 R9 = 0x00000000
    R2 = 0x08015cf4 R10 = 0x00000001
    R3 = 0x08025d50 R11 = 0x00000000
    R4 = 0x08015cc8 R12 = 0xdffc0000
    R5 = 0xffffffdec SP (R13)= 0x080270a0
    R6 = 0x0001f1ca LR (R14)= 0x00006d4c
    R7 = 0x00000002 PC (R15)= 0xDffc0000
    PSR = 0x600c019f
    DFSR = 0x00000000 IFSR = 0x0000000d
    DFAR = 0x00000000 IFAR = 0xDFFC0000
    TI.SYSBIOS.family.ARM.exc.exception:第201行:E_prefetchAbort:PC = 0xDFFC0000、LR = 0x00006d4c。
    xdc.runtime.Error.raise:终止执行

    非常感谢您提供的任何其他帮助。

    此致、
    Joe Shidle
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好 Joe、
    代码中的顺序为:
    1) 1)创建具有新消息 ID 的新消息框对象
    2) 2)使用新消息 ID 发送
    3) CAN_setOptions()关闭电源
    4) CAN_setOptions()以唤醒
    (笑声) 一段时间后
    5) 5)删除 msg 框对象。

    在循环中运行该序列。
    您是否看到此序列有问题?

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

    你好 Joe、

    如果 要删除消息对象、我们需要遵循"本地断电"、然后"唤醒"的过程。

    如果您希望在初始化期间创建多个报文对象、然后使用不同的报文对象来发送 CAN 报文而不将其删除、下面是参考代码  

    e2e.ti.com/.../main.c

    同时附加一个短视频片段、显示 PCAN 应用接收到的数据以及不同的消息 ID。

    e2e.ti.com/.../VID_5F00_20171018_5F00_103635.mp4

    如果您需要更多信息、请告诉我。

    -Raghu

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

    Raghu、

    我是 Joe Shidle 的一名同事、正在尝试解决此问题。  

    为了再次讨论我们的问题、下面是我们根据我们的用例和您的建议尝试执行的操作。 这里的关键点是、我们需要在运行时以随机间隔更改 CAN 消息 ID:

    我们可以执行两次"运行时操作"、而不会出现任何问题。 在第三次尝试删除、创建和执行断电操作时, 使用 CAN_createMsgObject()创建的第一个 CAN_MsgObjHandle 最终指向一个看似无效的内存地址。  然后、这将引发异常并停止系统。 请参阅以下调试窗口:

    此处显示了抛出的异常:

    ThreadType_Hwi 中发生异常。
    Hwi 句柄:0x0。
    Hwi 堆栈基地址:0x8026100。
    Hwi 堆栈大小:0x1000。
    R0 = 0x08f81e08 R8 = 0x0001f3b0
    R1 = 0x00000001 R9 = 0x00000000
    R2 = 0x08015cf4 R10 = 0x00000001
    R3 = 0x08025d50 R11 = 0x00000000
    R4 = 0x08015cc8 R12 = 0xdffc0000
    R5 = 0xffffffdec SP (R13)= 0x080270a0
    R6 = 0x0001f5ea LR (R14)= 0x00006edc
    R7 = 0x00000002 PC (R15)= 0xDffc0000
    PSR = 0x600c019f
    DFSR = 0x00000000 IFSR = 0x0000000d
    DFAR = 0x00000000 IFAR = 0xDFFC0000
    TI.sysbios.family.arm.exc.exception:第201行:e_prefetchAbort:PC = 0xDffc0000、LR = 0x00006edc。
    xdc.runtime.Error.raise:终止执行

    除了为每个消息框传输消息外、我们将遵循此处列出的建议步骤顺序:

    [引用用户="Raghunandan Kamath"]

    你好 Joe、
    代码中的顺序为:
    1) 1)创建具有新消息 ID 的新消息框对象
    2) 2)使用新消息 ID 发送
    3) CAN_setOptions()关闭电源
    4) CAN_setOptions()以唤醒
    (笑声) 一段时间后
    5) 5)删除 msg 框对象。

    [/报价]

    为了进行测试、我在每个消息框上都输入了要传输的代码、并在其中的一些步骤之间增加了高达数百毫秒的延迟、但这并没有解决问题。

     

    请您确切说明这意味着什么?  

    [引用用户="Raghunandan Kamath"]

    如果 要删除消息对象、我们需要遵循"本地断电"、然后"唤醒"的过程。

    [/报价]

    我们是否未遵循正确的断电和唤醒过程? 我们还会缺少什么呢?

     

    谢谢、
    Erik

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

    Erik、

    感谢对问题的详细解释。

    我实际上无法再现你在答复中提到的问题。

    我编写的代码与您在解释中提到的代码相同。 请检查代码 e2e.ti.com/.../2604.main.c

    我已根据 您 的写操作修改了"dcanTransmitTest()"。我已编写了大约22条消息的代码作为示例。

    请查看我的应用程序代码、并告诉我它是否符合您的要求、或者您也可以发送上传您在 DCAN 传输代码中所做的更改、以便我可以在我的设置中重现此问题。

    根据您的要求、您在运行时必须传输多少个不同的消息标识符?

    谢谢、

    Raghu

     

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

    感谢你的帮助。 首先、由于我们存储接收到的 CAN 消息的方式、我们一侧出现了问题。 这导致了内存损坏、因此在创建 CAN 消息对象时返回了垃圾消息。

    其次、如2604.main.c 中的代码所示、删除、设置和创建的顺序至关重要。

    我无法准确地说运行时需要多少个消息 ID、但关键要求是我们可以在运行时无限制地更改它们。

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

    如果问题已解决,请标记已解决问题的响应并关闭帖子。

    谢谢、
    Raghu