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.

[参考译文] TMS320F280049C:接收所有 msgid#39;s、数据长度在哪里?

Guru**** 2561760 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1009859/tms320f280049c-receive-all-msgid-s-and-where-is-datalength

器件型号:TMS320F280049C

您好!

当接收到 CANbus 通信时、通常会给出 ID 和数据长度(由硬件提供)。 根据 can.h -> CAN_setupMessageObject() ,在接收到 CANmessage 时必须提供 msgid,原因是什么?  我理解数据长度的"无关"、因为存在断言。  我希望在总线上接收所有 CANMessages、因此不提供 msgid。

 Objid 和 msgid 之间有什么关系?

使用"CAN_readMessageWithID()"时,数据长度在哪里? (HW CANMODULE 接收多少个数据字节)

是否有有关函数 CAN.c / can.h 的文档

布鲁德

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

    您好、Ruud、

    CAN_setupMessageObject()函数同时适用于发送和接收对象。  在报文对象的传输过程中使用 msgid、因为它是发送到 CAN 总线的 CAN 帧的一部分。  在消息接收期间、msgid 在接受过滤期间与 CAN 模块的屏蔽位一起使用、以决定是否接受 CAN 帧。  在 CAN 中、该模块能够接收所有传入消息或根据屏蔽位(例如、 您的应用程序只希望接收0x2F0-0x2FF 范围内的 msgID 并拒绝其他类型的 msgID、然后您必须相应地提供 msgid 和掩码位以完成此操作)。  TRM 的26.11.6节提供了接受滤波的详细信息。

    Objid 与 CAN 模块内的消息 RAM 结合使用。  F280049器件中的 CAN 模块在报文 RAM 中有32个报文对象。  用户可以灵活地将这32个报文对象(或 Objid)用作发送或接收、以便于通过 DMA 或中断进行 CAN 通信、而无需 CPU 干预。

    msgid、有时称为节点 ID、是与 CAN 消息帧一起传输的内容。  这是通过 CAN 总线广播的帧的标识、以便其他节点能够识别它。  任何节点在 CAN 总线中都不应具有相同的 msgid、否则这将导致仲裁错误。

    要读取数据长度或 DLC,可以在函数 CAN_readWithMessageID()函数之后立即查看寄存器字段 CAN_IF2MCTL.FLC (位3-0)。

    您可以查看应用报告 http://www.ti.com/lit/sprace5。 它具有许多经过测试的示例、并展示了 CAN 帧和消息 ID 的基础知识。  这也在应用报告 http://www.ti.com/lit/spracq3中进行了介绍 、并详细说明了 CAN 帧。

    函数的文档都是在 can.h 文件中函数原型之前作为注释提供的

    此致、

    Joseph

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

    您好、Joseph、

    如果没有其他问题,我明天将研究这一问题,并将其标记为已解决。

    感谢您的快速回复!

    此致、

    吕德

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

    您好、Joseph、

    当接收 CANdata 时、我是否可以假设如果消息 ID 掩码= 0、那么该邮箱中的所有消息都会被接收、而不管 msgid 的值是什么? 但是,当提供 msgid 时,会保证在该邮箱中接收到消息?

    对于数据长度、我发现  f28004x 控制器的 CAN_O_IF2MCTL <3:0>。 (尽管如此、我仍然发现它没有与消息一起传递有点奇怪)

    感谢您指出该文档!  

    编辑:查看 CAN_sendMessage()时,它包含 msgLen。 但是在设置 CAN_setupMessageObject()时,它还包含一个 msgLen。

    这是用于 RAM 分配吗?

    此致、

    吕德

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

    您好、Ruud、

    也许最好用一个示例来说明消息 ID 掩码的使用。  如果将消息 ID 设置为0x1111、将 ID 掩码设置为0x1FFFFFFF、则仅接受具有0x1111的消息。 如果 MASK 设置为0x1FFFFFF0、则接受消息0x1110到0x111F。

    msgLen 仅在 CAN_sendMessage()中有效,因为它以 DLC 的形式发送此信息。  msgLen 仅用作 CAN_setupMessageObject()中的标志,在其他任何地方都不使用。

    在发送期间, CAN_sendMessage()将 msgLen 写入  CAN_O_IF2MCTL <3:0>。  在接收过程中,接收到的帧会在检测到有效帧后立即进入消息 RAM,函数 CAN_readMessage()会启动消息 RAM 信息(数据、msgid、控制,包括 DLC 和其他信息)的传输,这是 CAN_O_IF2MCTL <3:0>[DLC]更新的地方。

    希望这能让您的问题清晰明了。

    此致、

    Joseph