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.

[参考译文] AM3359:RTOS 中的 DCAN 消息对象配置

Guru**** 2607805 points
Other Parts Discussed in Thread: AM3359

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/648667/am3359-dcan-message-object-configuration-in-rtos

器件型号:AM3359

您好!

我正在 AM3359 Sitara ICEv2板上开发 CAN 节点。 我已将 Starterware DCAN Rx Tx 示例与 SYS/BIOS 合并、该示例可正常工作以发送 CAN 消息。

CAN 接收功能也可以、但在接收不到 CAN 消息之后、我只能接收3条 CAN 消息。 我认为这是因为我配置了3个消息对象。 我想了解 CAN 通信在 AM335x 中的工作原理。

我参考了 AM335x 的 TRM、但对我来说仍然不清楚。 是否有人可以共享一个好文档来解释 CAN 通信需要配置的所有内容以及如何使用这些消息对象?

根据我的理解、我们需要执行以下操作:

1. 将 DCAN 置于初始化模式

2.设置位时间

3.配置报文对象

4.将 DCAN 置于正常模式。

现在、我的问题是、一旦消息对象被配置为接收消息、并且在正常模式下调用 ISR 以指示消息已接收、那么我们是否会使 ISR 中的特定消息对象无效? 如果该报文对象无效、那么它是否会接收下一条 CAN 报文? 我们是否必须每次配置才能接收新的 CAN 消息?   

对于每个 CAN 写入/Tx、我们是否必须配置报文对象?

使用以下版本:processor_sdk_rtos_AM335x_4_00_00_04和 pdk_AM335x_1_0_7

此致

Mohit

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Mohit、

    您是否正在寻找类似的产品?
    processors.wiki.ti.com/.../StarterWare_DCAN

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

    你好、Lali、

    否、我已经看到了此链接。 它介绍了不同的 API 以及这些 API 的功能。 但我更想了解使用这些 API 的顺序。

    基本上、我想了解有关消息对象的更多详细信息。 我对使报文对象有效或无效的要求有点困惑、如果我们不断收到报文、会发生什么情况、那么应如何处理这些报文对象?

    此致

    Mohit

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

    MsgVal 位指示 CAN IP 是否可以使用报文对象。 驱动程序开发人员可以选择启用 CAN 消息 RAM 中的部分或全部消息。 我无法解释为什么开发人员可能想要这么做、但这就是该位的用途。

    目前、我不确定如何回答流媒体问题。 上面描述的用例是否正在读取 RX 消息 RAM? TRM 显示这清除了 RX 消息 RAM 中的新数据标志。 您能描述一下您正在执行的消息序列吗?

    此致、
    Schuyler
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Schuyler、您好、
    因此、我理解的是、如果开发人员想要使用5个消息对象、则他/她将设置这些消息对象的 msg Val 位。 NexDataX 标志应用于在轮询模式下读取消息对象。
    但在中断模式下、IntPnd 标志应用于读取报文对象。 当 CAN 内核接收到报文时、报文将被传输到配置的报文对象。 当一条消息被接收时、IntPnd 标志也被置位。 调用 ISR、在 ISR 中读取报文对象并将其复制到应用程序中。
    现在、当应用程序读取报文时、应用程序在复制 CAN 帧后应对报文对象执行什么操作。 我们需要设置一些寄存器吗? 我们是否需要清除一些位?

    下面是用于接收的 DcanAppIsr 的一个片段
    /*接收报文对象的中断处理。 *
    if ((msgObjNum >=(instObj->maxMsgObjs/2U))&&
    (msgObjNum < instObj->maxMsgObjs))

    /*从消息 RAM 读取接收到的消息到接口寄存器*/
    DCANAppReadMsgObjData(instObj->instAddr,
    msgObjNum、
    (uint32_t*) rxData、
    DCAN IF_REG_NUM_2);

    /*清除中断挂起状态*/
    DCANAppIntrClear (instObj->instAddr、
    msgObjNum、
    DCAN IF_REG_NUM_2);

    pDataVal =(uint8_t*) rxData;

    instObj->appIntrCfg.frameLen =(DCANIfMsgCtlStatus (instObj->instAddr、DCAN IF_REG_NUM_2)&
    DCAN MSG_CTL_STS_DAT_LEN_CODE);

    //将数据复制到应用程序
    recvdFrame.dcanId =(DCANIfArbitrationStatus (instObj->instAddr、DCAN IF_REG_NUM_2)& DCAN ARB _STS_MSG_ID)>> 18;
    recvdFram.dcanLen = instObj->appIntrCfg.frameLen;
    recvdFrame.dcanData[0]= rxData[0];
    recvdFrame.dcanData[1]= rxData[1];
    ECAT_DataReceivedOnCAN (&recvdFrame);//不会在 ISR 中进行任何处理;只需复制到应用程序即可
    //结束复制数据

    if (instObj->appIntCfg.totalFrames=instObj->appIntrCfg.intrCount)

    /*禁用消息对象的接收中断*/
    DCANAppRxIntraDisable (instObj->instAddr、
    msgObjNum、
    DCAN IF_REG_NUM_2);

    /*使接收消息对象无效*/
    DCANAppInvalidateMsgObject(instObj->instAddr,
    msgObjNum、
    DCAN IF_REG_NUM_2);




    我的测试顺序:
    AM3359连接到 CANalyzer。 CANalyzer 正在连续且定期生成 CAN 消息。 这些 CAN 消息应由 DCAN 接收、并应传输至应用程序。 生成的消息具有不同的 CAN ID,因此我不会将消息对象配置为单个 CAN ID。 但我已将报文对象配置为 CAN ID 0以接收所有 CAN 报文。

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

    浏览本节23.3.14消息对象的配置介绍了读取消息对象以及复位 NewDAT 和 IntPend 位的情况。 IF 命令寄存器指示可以在读取对象时清除这些位。 本节介绍如何启用所有消息对象。 是否在接收到5个已配置的消息对象后不再接收?

    我查看了 Linux 驱动程序、看不到读取对象时清除了这些位、有一条注释指出这些位是自清除的。 Linux 驱动程序还使用轮询来处理 RX 对象。

    此致、
    Schuyler
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Schuyler、您好、
    我只配置了一个用于接收测试的报文对象、它是自清零的。 因此、我能够连续接收消息。 但是、如果我配置了多个报文对象、并且所有报文对象的 CAN ID 都为0 (以重新接收所有帧)、将会发生什么情况。 那么、哪一个消息对象将重新转换实际的帧。 它将转到下一个可用的消息对象、还是转到所有消息对象?

    关于为 Tx 配置消息对象的另一个问题。 我看到在环回示例中、消息对象在每次接收到消息时都在 ISR 调用中配置。 我们能否在开始时配置 Tx 的消息对象并在 ISR 中更新消息? 我们是否必须在运行时配置 CAN 传输的消息对象?

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

    第23.3.15.2节 TRM 的接收/发送优先级描述了报文对象编号(不是 CAN ID)控制着接收优先级。 因此、根据这种情况、接收到的下一条消息似乎应转到配置的消息的下一个升序消息对象。

    对于传输问题、如果我理解正确、您希望开始传输、然后通过 ISR 进行更新、那么本节将介绍23.3.15.4更新传输对象。 实际上、它讨论了即使消息是传输也会发生更新、因此您的更新设计应该适用于您正在编写的驱动程序。

    此致、
    Schuyler