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.

[参考译文] TMS320F2.8075万:接收和识别RTR消息

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/581455/tms320f28075-receiving-and-identifying-rtr-messages

部件号:TMS320F2.8075万

我要管理Node-ID =1的NMT从属设备的节点防护服务。
假设有一个NMT主机发送了一个COB-ID = 0x701的RTR帧,则NMT从属设备接收该帧,然后发送响应。

我根据《技术参考手册》中的21.11 .................................................................4和21.12 ................................8部分配置邮箱。
我特别设定

方向= 1
umask =1 (我只想接收带有COB-ID = 0x701的RTR帧)
RmtEn = 0 (我不希望在接收RTR时自动发送响应消息)

因此,当邮箱收到COB-ID = 0x701的RTR帧时,NewDat位设置为1。

但是,如何检查收到的帧是RTR帧而不是另一种类型的帧? 是否需要测试任何位来了解接收的帧是否为RTR帧?

假设NMT主机错误地发送了一个COB-ID = 0x701的正常帧(例如SDO或PDO),该帧仍由邮件处理程序传输到邮箱?

《技术参考手册》通常将"RTR位"与其他仲裁和控制位(标识符+ IDE + RTR + DLC)一起提及,但虽然我在接口寄存器中找到了标识符和DLC位,但我尚未找到RTR位。 在哪里可以找到它?

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

    Demis,

               不确定为什么要设置RmtEn =0 (即不想自动响应远程帧)。

     

    至于您关于如何区分远程帧与数据帧的问题,我不是很熟悉CANopen,但这是否是一个有效的使用案例,使任何一个帧都以相同的COB-ID (MSGID)出现在总线上?

     

    关于RTR位的问题,没有RTR位字段。 请参阅TRM的以下片段:

     

    22.11 Tm2远程帧传输对象的配置

    无需为远程帧的传输配置传输对象。 为接收对象设置TxRqst将导致远程帧的传输,其标识符与配置此接收对象的数据帧相同。

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

    [报价用户="Hareesh J"]

    Demis,

               不确定为什么要设置RmtEn =0 (即不想自动响应远程帧)。

    [/引述]

     

    我尝试用一个例子来解释。

    我对CANopen Nodeguard服务使用RTR消息:主中继器发送RTR帧,从属(节点)回复的8位数反映其通信状态:4 =已停止,5 =可操作,127 =可操作前。
    此外,主节点可以通过发送NMT消息来更改节点通信状态。

    假设从属设备处于“操作前”状态(=127),并且有以下消息序列:

     

     n   时间
     1) 0.0000s  主--------  RTR ----------- > 从属
     2) 0.0002s   主 <----------- 127————————————————————————————  从属
     3) 1.0000s   主--------  RTR ----------- > 从属
     4) 1.0002s   主 <----------- 127————————————————————————————  从属
     5) 2.0000s   主--------  RTR ----------- > 从属
     6) 2.0002s   主 <----------- 127————————————————————————————  从属
     7) 3.0000s   主--------  RTR ----------- > 从属
     8) 3.0002s  主 <----------- 127————————————————————————————  从属
     9) 3.9999s  主节点 -- NMT:转至操作-->从节点   
    10) 4.0000s   主--------  RTR ----------- > 从属

    消息9强制从属设备将其状态从“操作前”(=127)切换到“操作中”(=5)。
    消息10要求输入节点状态。

    但是,从机在消息9后仅接收100微秒的消息10,因此,如果从机正在处理优先级高于CANopen通信的功能或任务,则在接收到消息10后处理消息9。

    如果nodeguard邮箱设置为RmtEn =1,则节点会立即回复消息10,响应=127,因为DSP尚未使用正确的节点状态更新邮箱数据。
    即发送以下消息

    11A)时间:4.0001 的主程序 <----------- 127————————————————————————————  从属

    但主中继器需要状态5 (=运行),因此它发出错误信号。

    相反,如果nodeguard邮箱设置为RmtEn =0,则节点可以在消息10之前处理消息9 (有少许延迟):它将状态从“操作前”(=127)切换到“操作中”(=5),然后将状态正确的响应发送给主节点:

    11B)时间:4.0002 的主中继 器<-----------   5————————————————————————————  从属

    我的英语不是很好,但我希望我明白。

    我知道这种情况不太可能发生,但不幸的是,这种情况有时会发生。
     

    [报价用户="Hareesh J"]

    至于您关于如何区分远程帧与数据帧的问题,我不是很熟悉CANopen,但这是否是一个有效的使用案例,使任何一个帧都以相同的COB-ID (MSGID)出现在总线上?

    [/引述]

     

     不是,这不是有效的使用案例,事实上,在我的问题中,我写了"假设NMT主机错误地发送了COB-ID = 0x701的正常帧(例如SDO或PDO)"。
    换言之,我需要知道该消息是RTR消息还是数据帧消息,以识别来自具有相同COB-ID的错误数据帧消息的正确RTR消息。

    [报价用户="Hareesh J"]

    关于RTR位的问题,没有RTR位字段。

    [/引述]

     

    好的。

    [报价用户="Hareesh J"]

    请参阅TRM的以下片段:

     

    22.11 Tm2远程帧传输对象的配置

    无需为远程帧的传输配置传输对象。 为接收对象设置TxRqst将导致远程帧的传输,其标识符与配置此接收对象的数据帧相同。

    [/引述]

    我很清楚。

    但我不需要发送RTR消息,而只需要在收到RTR消息时进行识别。

    在TRM中,我发现了"控制位"中的"RTR"(例如在TRM spruhm9c,第页)。 2072秒 21.12 .6)所以我认为有一个控制位,称为RTR位,它告诉我接收到的消息是RTR帧还是数据帧。

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

    Demis,

               我现在明白了问题所在。

     

    配置为响应远程帧的邮箱将配置为传输操作。 现在,此邮箱只响应远程帧,而不响应普通帧。 因此,我假定邮件#9被传输到另一个邮箱。 如果是这样,则可以区分普通帧和远程帧。 不管怎样,您所描述的问题仍然存在。

     

    关于您在第21.12 .6节中对RTR位的参考,RTR位是CAN帧的一部分,但CAN寄存器中没有RT位字段。

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

    谢谢你,Hareesh。