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.

[参考译文] TM4C1294NCPDT:在计算 CANMessageGet 时找出接收到的消息的 ID

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1050511/tm4c1294ncpdt-finding-out-the-id-of-received-messages-when-caling-canmessageget

器件型号:TM4C1294NCPDT

在 CAN 消息对象中使用 ID 过滤时(即设置 MSG_OBJ_USE_ID_FILTER 标志和**不**将 ui32MsgIDMask 设置为全1), 如何知道向我发送消息的 ID?

我假定在  调用 CANMessageGET()时,可以在我提供的 tCANMsgObject 对象的 ui32MsgID 字段中获得此信息,但 Tivaware 文档明确指出了其他信息。 ("使用 CANMessageGet ()时,结构的所有相同字段的填充方式与使用 CANMessageSet ()函数时相同"))是否准确? 还有其他方法吗?

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

    尊敬的 Franco:

      我认为这一说明本可以更清楚地说明。 我想它试图说的是 CANMessageGet()将返回一个与 CANMessageSet()相同的字段排列结构。 我认为这并不意味 着 CANMessageGet 和 CANMessageSet 之间的内容相同。  

    描述:
    此函数用于读取 CAN 控制器中32个报文对象之一的内容
    并将其返回给调用方。 返回的数据存储在调用方提供的字段中
    psMsgObject 指向的结构。 数据包含 CAN 消息的所有部分、
    以及一些控制和状态信息。
    通常、此函数用于读取已接收和存储 CAN 的消息对象
    具有特定标识符的消息。 但是、此函数也可用于读取内容
    以加载结构的字段、以防仅为结构的一部分
    必须从先前的设置更改。
    使用 CANMessageGET()时,结构的所有相同字段都填充在中
    与使用 CANMessageSet()函数的方式相同,但以下情况除外:

    另请查看数据表说明。  

    19.3.7接收数据帧
    报文处理器将来自 CAN 控制器接收移位寄存器的报文存储到中
    匹配消息 RAM 中的消息对象。 数据字节、所有仲裁位和 DLC 位
    都存储在相应的消息对象中。 通过这种方式、数据字节被连接
    与标识符一起使用、即使使用了仲裁屏蔽。 CANIFnMCTL 寄存器的 NEWDAT 位
    设置为指示已接收到新数据。 CPU 在读取时应清除该位
    报文对象向控制器指示已接收报文、且缓冲区为
    可免费接收更多消息。 如果 CAN 控制器接收到一条报文、并且 NEWDAT 位为
    CANIFnMCTL 寄存器中的 MSGLST 位已经置位、表示之前的数据已写入
    丢失了。 如果系统在成功接收到一个帧时需要一个中断、则的 RXIE 位
    CANIFnMCTL 寄存器应置位。 在这种情况下、同一寄存器的 INTPND 位被置位、从而导致
    CANINT 寄存器用于指向刚刚接收到报文的报文对象。 TXRQST 位
    应清除该报文对象的位、以防止远程帧的发送。


    19.3.11已接收报文对象的处理
    由于数据原因、CPU 可以随时通过 CAN 接口寄存器读取接收到的消息
    消息处理器状态机可确保一致性。
    通常、CPU 首先将0x007F 写入 CANIFnCMSK 寄存器、然后再写入的数量
    报文对象写入 CANIFnCRQ 寄存器。 该组合会传输整个接收到的数据
    从报文 RAM 发送报文到报文缓冲寄存器(CANIFnMSKn、CANIFnARBn、
    和 CANIFnMCTL)。 此外、消息 RAM 中的 NEWDAT 和 INTPND 位将被清零、
    确认消息已被读取并清除由生成的挂起中断
    此消息对象。
    如果报文对象使用掩码进行验收滤波、则 CANIFnARBn 寄存器将显示
    已接收消息的完整、未屏蔽 ID。