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.

[参考译文] TMDS64EVM:EtherCAT PDO 通信不起作用。 Rx / TxPDO 地址已更改

Guru**** 2487425 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1420922/tmds64evm-ethercat-pdo-communication-does-not-work-rx-txpdo-addresses-are-changed

器件型号:TMDS64EVM

工具与软件:

您好!

我正在尝试通过 EtherCAT 获取 CAN、以便将工业 SDK 09.00.00.03与 SOE EtherCAT 堆栈结合使用、在 AM6442-EVM 开发套件上运行。 与 TI 的 BSP 代码集成取自 am335示例。 到目前为止、堆栈进入 OP 模式。 当主器件预期进行 PDO 通信时、问题就会开始。

第一个问题是使 SOE 注册为存在 PDO 通信。 PSE 未正确检测 ALEvent 寄存器状态。 但日志记录确实显示 ALEVENTMASK 已正确设置。 在此片段中:

/** ESC interrupt enable function by the Slave stack in IRQ mode.
 *
 * @param[in]   mask     = of interrupts to enable
 */
void ESC_interrupt_enable(uint32_t mask)
{
    DebugP_log("Enabling interrupts: '%X'\r\n", mask);
    print_present_mask_bits(mask);
    const uint32_t readmask = bsp_read_dword_isr(escHwPruIcssHandle, ESCREG_ALEVENTMASK);
    DebugP_log("Already present interrupts are: '%X'\r\n", readmask);
    print_present_mask_bits(readmask);
    bsp_write_dword(escHwPruIcssHandle, (mask | readmask), ESCREG_ALEVENTMASK);
}

将记录以下内容:

Enabling interrupts: '400'
Bit 'ALEVENT_SM2' is present.
Already present interrupts are: 'FFF32B'
Bit 'ALEVENT_CONTROL' is present.
Bit 'ALEVENT_DC_LATCH' is present.
Bit 'ALEVENT_DC_SYNC1' is present.
Bit 'ALEVENT_EEP' is present.
Bit 'ALEVENT_SM0' is present.
Bit 'ALEVENT_SM1' is present.

以确保器件从 PREOP 切换到 SAFeOP。

如果我正确理解、在第一个代码片段中通过"bsp_write_dword"启用中断应该会触发 PRUICSS_waitEvent (pruIcss1Handle、host_AL_event - 20)调用上的唤醒。 相应地应在 SOE 中调用 PDI_ISR()、该 SOE 应更新 ALEvent、如以下代码片段所示:

/** PDI ISR handler
 *
 * @param[in]   arg     = NOT USED
 */
void PDI_Isr(void)
{
    uint16_t alevent;

    alevent = bsp_read_word_isr(escHwPruIcssHandle, ESCREG_ALEVENT);
    CC_ATOMIC_SET(ESCvar.ALevent, etohs(alevent));

    if (ESCvar.ALevent & (ESCREG_ALEVENT_SM2 | ESCREG_ALEVENT_SM3))
    {
        DIG_process(DIG_PROCESS_OUTPUTS_FLAG |
                    DIG_PROCESS_APP_HOOK_FLAG |
                    DIG_PROCESS_INPUTS_FLAG);
    }
}

这里的问题是 ALevent 的值从不设置'ESCRG_ALEVENT_SM2'位。 如果我正确理解、以下哪一项是从主器件接收到的 PDO 通信的事件...? 未获得此事件意味着不使用来自主器件的 PDO 信息更新从器件。 这会导致例如电机状态字保持"不工作"状态、因为主器件无法通过从器件的 RXPDO 将电机更改为更工作的状态。

解决方法强制发生 SM2事件。 以查看通信控制流程的其余部分是否正常工作。 这也是 PDO 通信中的另一个问题、其中 process-data-buffer 的基地址在以下代码片段中移动:

static void ESC_readRXPDO(uint8_t *pData, uint16_t Address, uint16_t Len)
{
    int16_t sm_index;
    uint16_t ActAddress = bsp_get_process_data_address(escHwPruIcssHandle, Address, Len,
                                                       &sm_index);
    // Correct the actualAddr. As it induces an offset.
    // ActAddress = Address;

    if (ActAddress < ESC_ADDR_MEMORY)
    {
        pd_read_addr_err++;
        return;
    }

    bsp_read(escHwPruIcssHandle, pData, ActAddress, Len);
    bsp_process_data_access_complete(escHwPruIcssHandle, Address, Len, sm_index);
}

而无需还原"ActAddress"。 缓冲区起始地址从其 ESI 定义的位置移位:

0x1800 -> 0x1809

我不明白为什么会发生这种情况。 在下面的位置、当 SOE 开始刷新 RXPDO 时、还会导致数据无法读取:

/** Read Sync Manager 2 to local process data, Master Outputs.
 */
void RXPDO_update (void)
{
   if(ESCvar.rxpdo_override != NULL)
   {
      (ESCvar.rxpdo_override)();
   }
   else
   {
      ESC_read (ESC_SM2_sma, rxpdo, ESCvar.ESC_SM2_sml);
      if (MAX_MAPPINGS_SM2 > 0)
      {
         COE_pdoUnpack (rxpdo, ESCvar.sm2mappings, SMmap2);
      }
   }
}

无需还原'ESC_readRXPDO'代码片段中的地址、上述代码片段中提供的'rxpdo'数组就会保持空状态。 虽然、如果"bsp_get_process_data_address"返回的地址 恢复为 ESI 地址、则缓冲区会包含正确的数据、该数据会传递到我们的对象字典、从而更新电机的控制字并将其传递到工作模式。

我的问题是、这里出现了什么问题、导致 SyncManager 事件不发生;以及 RXPDO 通信失败? 我在哪里可以阅读有关同步管理器配置过程以正确进行此 PDO 通信的更多信息? 我确实检查了 ETG 规范、但找不到有关此缓冲器配置应如何工作/排列的参考。

此致、

Matthijs

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

    嗨、 Matthijs:

    我没有和 TI ESC 一起使用过 SOE。 请给我一些时间来研究这个问题。
    我还可以知道您正在使用哪个 EtherCAT MainDevice 进行验证吗? 如果可能、Wireshark 记录在日志中?

    此致、
    亚伦

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

    大家好、Aaron:

    没关系。 感谢您花时间仔细阅读我的问题。
    对于主器件、我们使用运行 SOEM 堆栈的 Linux 应用程序。 我将研究如何获取 Wireshark 日志。 尽管我以前没有这么做、因此我可能需要一些时间才能正确设置。

    此致、

    Matthijs

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

    更新了:我具有来自 EtherCAT 总线的 pcap 嗅探器。 它包含一些 CoE 通信、其中(我认为)配置了 PDO 映射寄存器并且驱动器切换到 OP 模式。

    https://dataspace.delem.com/public/download-shares/joVHoPpJ1pdxkP9Q76rGEjJ6BnKwiLcZ

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

    一个快速建议、  

    Unknown 说:
    与 TI 的 BSP 代码的集成取自 am335示例。
    • 是否可以将工业 SDK 09.00.00.03中提供的用于 AM64x?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    抱歉、我不确定您所指的具体文件是什么。
    我在您的报价中指的是 SOES/hal/tiesc/*下的 SOE 代码。 例如、先前代码段中的"esc_readRXPDO"函数来自该文件夹中的"esc_hw.c"。

    然后使用的 BSP 代码来自工业 SDK 09.00.00.03。 您是否想让我用 SDK 中的其他帮助者替代这些函数?

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

    好的、我在那句话中感到困惑。 我想您使用的是 AM335x SDK 中的 BSP 代码。

    在不还原'esc_readRXPDO'代码片段中的地址的情况下、上述代码片段中给出的'rxpdo'数组将保持空状态。 虽然、如果"bsp_get_process_data_address"返回的地址 恢复为 ESI 地址、则缓冲区会包含正确的数据、该数据会传递到我们的对象字典、从而更新电机的控制字并将其传递到操作模式。[/QUOT]

    此致、
    亚伦

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

    此外、为了响应您指向该 API 片段的链接:SOE 当前使用该函数来检查缓冲区启动。 我不确定是否误配置了 PSE、而这样的方式现在无法在 PRU 和 R5F 之间传输数据。 在项目早期,我对"ecat_options.h"页眉进行了一些编辑,以使驱动器进入前置 OP 模式。 这里是否存在一些问题?

    #define USE_FOE 0
    #define USE_EOE 0
    
    #define MBXSIZE 0x80
    #define MBXSIZEBOOT 0x80
    // 2x 3 buffers for RX- and TX-PDO triple-buffering.
    // Then 2x 1 buffer for SDO send and receive buffers.
    #define MBXBUFFERS 8
    
    #define MBX0_sma 0x1000
    #define MBX0_sml MBXSIZE
    #define MBX0_sme MBX0_sma + MBX0_sml - 1
    #define MBX0_smc 0x26
    #define MBX1_sma 0x1400
    #define MBX1_sml MBXSIZE
    #define MBX1_sme MBX1_sma + MBX1_sml - 1
    #define MBX1_smc 0x22
    
    #define MBX0_sma_b 0x1000
    #define MBX0_sml_b MBXSIZEBOOT
    #define MBX0_sme_b MBX0_sma_b + MBX0_sml_b - 1
    #define MBX0_smc_b 0x26
    #define MBX1_sma_b 0x1400
    #define MBX1_sml_b MBXSIZEBOOT
    #define MBX1_sme_b MBX1_sma_b + MBX1_sml_b - 1
    #define MBX1_smc_b 0x22
    
    #define SM2_sma 0x1800
    #define SM2_smc 0x64
    #define SM2_act 1
    #define SM3_sma 0x1C00
    #define SM3_smc 0x20
    #define SM3_act 1
    
    #define MAX_RXPDO_SIZE 512
    #define MAX_TXPDO_SIZE 512
    
    #define MAX_MAPPINGS_SM2 16
    #define MAX_MAPPINGS_SM3 16

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

    感谢  Matthijs 的输入。 我会回顾并回复您。

    此致、
    亚伦

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

    大家好、Aaron:

    我不知道论坛上的政策是什么... 但这是一个小问题,我很好奇,如果你能在我发送的日志中找到一些东西。

    如果您需要从我这边进一步登录以解决潜在问题、请告诉我!

    此致、

    Matthijs

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

    嗨、Matthijs:

    很抱歉耽误你的时间。 我 参与了另一个优先任务。 我将查看详细信息、并在明天的 EOD 前与您联系。 我是否需要有关错误场景的更多详细信息、我将告诉您。

    此致、
    亚伦

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

    嗨、Matthijs:

    好的、关于转储。 我在这里有一些值。
    • 因此、我正在将 ICSS_INTC_RAW_STATUS_REG0 (0x300A0200)和  ICSS_INTC_RAW_STATUS_REG1 (0x300A0204)中的寄存器值与我们的寄存器值进行比较:
      •  -使用 Beckhoff 堆栈
      •   -从你的日志
    • 这看起来不对? 看起来设置了更多的几个位。
    • 您还可以提供从0x300A0900到0x300A094C 的寄存器值。
    如果您需要从我这边进一步记录一个潜在问题、请告诉我!
    • 您是否能够提供整个 ICSSG1 (从0x30080000到0x300BFFFF)的寄存器转储?

    此致、
    亚伦

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

    嗨、Matthijs:

    我们将在印度度假、请期待下周对此作出回应

    此致、
    Prajith

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

    嗨、Matthijs:

    通过电子邮件提供了一个补丁。 请尝试使用补丁、并告知我们状态。

    此致、
    亚伦

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

    大家好、Aaron、Prajith、

    很抱歉应用补丁花了很长时间。 以一种对我们的项目很好的方式更新 SDK 需要花费一段时间。 初始结果是修补程序正常工作! 我们的主报告没有错误!

    感谢您的帮助、让我走得这么远! 明天回到办公室时、我将对设备进行进一步测试。 请告诉我,如果有任何数据,你可能会发现有趣的验证您的补丁的工作.

    此致、

    Matthijs

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

    嗨、Matthijs:

    这是否意味着以下提到的您报告的两个问题均已通过最新固件修复?

    1. PSE 未正确检测 ALEvent 寄存器状态。
    2. 进程数据缓冲区的基址被移位。  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Aaron:

    我用调试器检查了 SOE 中的相关代码、发现以下内容:

    现在使用所需的位正确设置了静音状态(即"ESCVvar 寄存器"中的"ESCRG_ALEVENT_SM2"和"ESCRG_ALEVENT_SM3"位)。 ALEVENT"变量)

    2.在调用"bsp_get_process_data_address"后、PDO 缓冲区的基址仍然会发生更改。 但它们都接近于 PSE 请求的地址。 我记录了返回的每个地址并打印出来:

    [SOES] New address given: '1800' for RXPDO-requested_address: '1800'.
    [SOES] New address given: '1812' for RXPDO-requested_address: '1800'.
    [SOES] New address given: '1809' for RXPDO-requested_address: '1800'.
    [SOES] New address given: '1C1A' for TXPDO-requested_address : '1C00'.
    [SOES] New address given: '1C00' for TXPDO-requested_address : '1C00'.
    [SOES] New address given: '1C0D' for TXPDO-requested_address : '1C00'.

    我最多有32个样本、让这个代码运行了一会儿、因此我想这些是在当前对象字典配置下在 SOE 和 PRU 之间重新使用的唯一地址。

    我想这个地址与 SOE 请求的地址不同是个问题、但您提到了应该使用这个函数和更改后的值。 我不太明白这一转变的来源。 也许可以在以前未使用的存储中引入新数据、以便为 SOE 留出更多时间来潜在地仍然读取旧数据...?

    如果这就是您使用补丁所需的全部确认、我将关闭该问题。 再次感谢所有的帮助!

    此致、

    Matthijs

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为此地址与 SoE 请求的地址不同是一个问题、但您提到要使用此函数和更改的值。 我不太明白这一转变的来源。 也许可以在以前未使用的存储中引入新数据、以便为 SOE 留出更多时间来潜在地仍然读取旧数据...?

    是的、ET1100屏蔽了内部处理数据的三重缓冲区实现。 在使用固件模拟 ASIC 的 TI ESC 上无法实现此功能。 因此固件会从三路缓冲器返回实际指针以供堆栈使用。