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.

[参考译文] AM2432:TIDP 示例未正确读取 Endat 配置

Guru**** 2832805 points

Other Parts Discussed in Thread: SYSCONFIG, UNIFLASH

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1621945/am2432-tidp-example-does-not-read-the-endat-configuration-correctly

器件型号: AM2432
Thread 中讨论的其他器件: SYSCONFIG、UNIFLASH

你(们)好

我已经使用 endat_diagnostic 示例中的 endat_print_encoder_info (priv);函数扩展了 TIDEP01032 示例、并在通道%d Init 完成后在 hall.c 中调用此函数!!!

当我启动 TIDEP01032 时收到以下消息:

——

EnDat 2.1 线性编码器    ID :1114112 02 SN: 650644853

位置:0 位[分辨率:0 nm]

传播延迟:3575ns

——

当我调用诊断示例时、得到:

EnDat 2.2 旋转编码器    ID :1149206 02 SN: 650644853

位置:18 位(单圈:18、多圈:0)[分辨率:262144 M/rev]

传播延迟:3580ns

-----

这些是正确的值。

我的问题:为什么 TIDEP 示例无法正确读取 Endat 版本、类型 (ROT/LIN) 和 pos 位?

BR

Alexander

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

    尊敬的 Alexander:

    ]为什么 TIDL 示例无法正确读取 Endat 版本、类型 (ROT/LIN) 和 pos 位?

    是否可以检查 priv->current_channel? 在调用 endat_print_encoder_info 之前、priv->current_channel 应保留正确的频道号。 此外、您还可以检查 priv 结构、该结构保存编码器信息、例如编码器类型、步长、ID 等 确保这些变量不会被错误地更新并且打印正确。
    endat_get_encoder_info API 执行所有命令并将编码器信息存储在 priv 中、以便您可以调试和识别缺少的内容。

    BR、

    Achala Ram

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

    您好 Achalla

    很高兴听到您的声音。

    priv->current_chanel 值已正确设置为 0。

    在调试器中、我看到以下内容:

    在我看来、这似乎只是正确读取了 ID 和序列号。

    以前调用的函数 endat_get_encoder_info () 也被正确执行,因为我不会遇到错误。

    该代码与 API 级别的正常运行 ENDA_DIAGNOSTIC 示例几乎相同。


    有何不同?

    BR

    Alexander

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

    如果您查看驱动程序文件中 endat_get_encoder_info () 的声明,它将逐个执行命令,包括获取 pos_res。 如果在运行诊断示例的同一硬件上运行此示例、则应该看到与诊断示例中看到的值相同的值、因为这两种情况下使用了相同的驱动程序和固件。 仅在应用程序方面存在差异。 因此在获取编码器信息和打印等之前、请检查所有事项、例如 priv 是否损坏或通道值是否正确

    BR、

    Achala Ram

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

    嗨、Achala

    我在函数中设置了一个断点:endat_get_pos_res ()。
    当我启动 TIDL 示例时、endatChRxInfo 的元素全部为空:

    现在、我要在相同的硬件上启动诊断示例。

     变量中填充了值...

    ???

    BR

    Alexander

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已在函数 endat_get_pos_res () 中设置了一个断点。
    当我启动 TIDL 示例时、endatChRxInfo 的元素都为空:

    您是否还能在运行时捕获信号 endat_get_pos_res? 此函数会发送命令以获取位置长度、因此请检查通信是否捕捉错误。 理想情况下、如果任何命令正常工作、该命令也应该起作用。 SN 和编码器 ID 非零并不意外、但位置长度为零。  

    BR、

    Achala.  

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

    是的、我想使用振荡器范围记录 Endat 的时钟和数据信号:

    我 在函数 endat_get_pos_res () 设置一个呼吸点。

    ——

    TIDP 示例:

    数据= zerro???

    ——

    这里是同一硬件上的诊断示例:

    ???

    BR Alexander

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

    在 endat_drv.c 中,我用 debugP_log () 输出扩展了函数 endat_get_ecoder_info ()。

    它显示了以下值:

    pos_res、CURRENT_CHANNEL[]、 endatInfoBuffer 和函数的调用方

     

    TIDEP 输出示例:

    通道= 0

    endatRxInfo = 0

    ——

    Giv可 知性示例 如下所示:

    ——

     在 hal.c 中  

    PRU 的工作方式可能不同吗?

    TIDEPs 与诊断

    我需要帮助。

    BR

    Alexander

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

    尊敬的 Achala:

    我犯了一个小错误!

    总线上的 Endat 协议(CLK/数据)完全相同。 以白色显示您可以看到 TIDP、以绿色显示诊断示例。

    剩下的是 TIDP 示例中的 endatChRxbuffer 保持为空...

    我捕获了错误的命令、抱歉。

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

    您好 Alex、

    剩下的是 TIDP 示例中的 endatChRxbuffer 保持为空...

    您是否对 SysConfig 中的内存分配或的全局地址转换进行了任何更改 EndatChInfo? 固件使用此存储器来存储命令的响应。 如果这不正确、固件可能会写入不同的位置、而 R5 可能会从不同的位置读取。 由于这种不匹配、响应endatChRxInfo () 可以为零。 该 endat_init 函数在 DMEM 中写入全局地址并为分配内存 endatChRxInfo、固件使用该地址来存储响应。 您可以检查 endatChRxInfo, 其存储器位置、该位置应指向正确分配的存储器。

    BR、

    Achala Ram  

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

    嗨、Achala

    我们尚未进行任何更改这是您的示例 1:1。 除了根据您的说明删除 Motor2 的定义之外。

    endatChRxInfo 缓冲区并不总是空、可以读取 Endat 编码器的序列号和 ID。 这是同样的机制:发送命令、然后读取 endatChRxInfo->ch[ch].posWord0。

    检查 endatChRxInfo 地址的最佳方法是什么?

    -----

    DebugP_log(“&priv->endatChRxInfo:0x%x\r\n“、priv->endatChRxInfo);

    打印件: &priv->endatChRxInfo: 0x41010c18

    在 SysConfig 中、我找到了该部分。 gEnDatChInfo 位于 R5F_TCMB0 类型:TCMB_R5F。 以下地址位于内存区域:R5F_TCMB0、地址为:0x41010000。 所以它看起来不会完全错

    BR

    Alexander

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

    Alexander

    您能否共享构建工程时生成的.map 文件?

    此致

    Dhaval

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

    您好 Dhaval

    以下是映射文件:

    e2e.ti.com/.../0361.mapfile.txt

    gEnDatChInfo ist 位于地址:0x41010c18。

    我认为是对的。

    BR

    Alexander

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

    Alexander

    很抱歉这里延迟了回复。

    是的、此段的链接器地址和存储器地址看起来正确。

    您是否修改了 MPU 设置或链接器中的任何缓存设置?  

    下一步是检查 PRU 是否能够正确读取数据。 您可以尝试以下操作吗?

    1.从 motor_control_sdk\source\position_sense\endat\firmware 导入并构建 PRU 工程

    2.从 R5F 加载 PRUICSS 固件后、停止 PRU 内核、并仅从 PRU 工程加载符号(不加载程序)。  更多详细信息、请参阅 AM243x 电机控制 SDK:位置检测示例

    3. 在 PRU 工程的“endat_main.asm 文件“中查找 ENDAT_HOST_CMD_DONE 符号、并在其中放置一个断点。

    4.发送命令、断点触发后、在 R15 至 R18 寄存器中查找包含位置和其他信息的数据。

    此致

    Dhaval

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

    您好、Dhaval、

    首先、非常感谢您的帮助。 我没有对项目进行任何更改。

    在:C:\ti\motor_control_sdk_am243x_11_00_00_06\source\position_sense\endat\firmware 下、

    有几个项目。 我应该拿哪一个?

    BR Alexander

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

    Alexander

    您必须根据您使用的 PRU 为 RTU-PRU0/1 或 TX-PRU0/1 选择 multi_ch_load_share 版本。
    RTU-PRU 用于通道 0、TX-PRU 用于 PRU-ICSS 模块的 3 通道外设接口的通道 2。

    您是否可以共享 R5F 工程的.syscfg 文件?

    此致

    Dhaval

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

    没问题。 这是 syscfg:

    e2e.ti.com/.../8156.AM243_5F00_BP_2D00_AM2BLDCSERVO.syscfg.txt

    BR Alexander

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

    尊敬的 Dhaval:

    我编译了 multi_chanel_load_share_tru_pru1 工程、加载符号并在 Endat_Host_ CMD_DONE 处设置一个 Brakpoint、还实现了该工程。

    我的问题:在哪里可以找到正确的 R 5-R18 寄存器???

    BR Alexander

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

    Alexander

    您应该会在“内核寄存器“部分中看到它们。

    此致

    Dhaval

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

    尊敬的 Dhaval:

    现在无法上传图片...

    在 R15 = 0x1420001C 中

    INR16 = 0x0

    在 R17 = 0x0 中

    在 R18 = 0x0 中

    BR Alexander

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

    Alexander

    感谢您分享这些详细信息。  

    要确认、您何时添加此断点? 是否在初始化完成后?  

    您能否在运行“examples\position_sensen\endat_diagnostic\multi_channel_load_share\am243x-lp"示“示例时添加相同的断点并检查 R15-R18 中的数据?

    此致

    Dhaval

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

    您好 Dhaval

    是否将相同的二进制文件加载到 PRU 单元中?

    还是必须为 dianostoc 示例编译另一个 position_sense\Endat\Firmware 项目?

    MotorExample:

    STATUS = PRUICSS_writeMemory (gPruIcsXHandle、

    PRUICSS_IRAM_RTU_PRU (ENDAT_PRUICSS_SLICEx)、0、(uint32_t *)

    EnDatFirmwareMultiMakeRTU_0、sizeof (EnDatFirmwareMultiMakeRTU_0));

     

    诊断示例:

    STATUS = PRUICSS_writeMemory (gPruIcsXHandle、

    PRUICSS_IRAM_PRU (PRUICSS_SLICEx)、0、(uint32_t *)

    EnDatFirmware_0、sizeof (EnDatFirmware_0);

    BR Alexander

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

    好的、我找到了以下产品: endat_peripheral_interface_single_ch_am243x-evm_iss_g0_pru1_fw_ti-PRU-CGT

    我的步骤如下:运行诊断示例、直到 R5F 在该点停止:

    然后连接到 PRU、加载符号、设置断点、然后让其运行。

    现在、运行 R5F CPU。

    现在、我们捕获 PRU 中的断点。

    R15 bis R18 相同的值……

    Alexander

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

    Alexander

    您是否可以尝试遵循更改?

    TCM 区域配置为“缓存“、这可能会导致问题、因为 R5F 可能会读取过时的数据、即使 PRU 已更新该数据也是如此。

    在 SysConfig 中、将 CONFIG_MPU_Region2/0x41010000 部分的“区域属性“设置更改为“可共享“或“非缓存“。



    此致

    Dhaval

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

    尊敬的 Dhaval:

    这是朝着正确方向迈出的一步。

    现在我读的 Endat 类型 2.2 和分辨率正确,但 posBits 至少不是空的,但错误的 59 位。

    诊断示例使用 18 位正确显示了 posBits。

    BR Alexander

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

    您好 Dhaval

    以下是附加信息:

    我构建了版本构建并加载了调试器、读取相同的错误位置。

    但是、如果我将工程刷写到 QSPI 并启动、则正确读取 POS 位...

    出什么问题了?

    BR Alexander

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

    Alexander

    [引述 userid=“639980" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1621945/am2432-tidp-example-does-not-read-the-endat-configuration-correctly/6270387

    我构建了版本构建并加载了调试器、读取相同的错误位置。

    [/报价]

    您在此处使用哪种引导模式和流程?

    此致

    Dhaval

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

    切换 UART 引导模式。

    致电 uart_uniflash.py

    开关 QSOI 引导模式

    重新启动

    此处介绍:

    AM243x MCU+ SDK:刷写 Hello World 示例

    我更改了 default_sbl_ospi.cfg 文件、以便使用我的工程文件。

    BR Alexander

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

    Alexander

    我相信这些是您在应用程序正常运行时遵循的步骤。 不工作时、您使用哪种引导模式?如何加载应用程序二进制文件?



    此致

    Dhaval

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

    您好 Dhaval

    BOOTMODE 为 QSPI 引导

    在 CCS 中、转到工程并点击“Debug Project“。

    调试器加载二进制文件、然后通过“Continue"按钮“按钮开始操作。

    BR Alexander

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

    Alexander

     很抱歉 这里有延迟的回复。  

    在这种情况下、当您从 CCS 加载.out 时、您是否根据 AM243x MCU+ SDK:EVM Setup 刷写了 SBL NULL 引导加载程序

    此致

    Dhaval

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

    您好 Dhaval

    是的、我正在使用 sbl-null 引导加载程序。

    如果我关闭并再次打开目标和 Booster Pack、我会在第一个调试器下载/启动时读取正确的位置值。

    在那之后,只有 posres 值总是错误的!

    BR Alexander

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

    Alexander

    PRU 可能未以预期频率运行、这可能会导致数据采样错误。

    要验证这一点、您能否在应用中添加调试日志以读取 PRU 内核时钟频率? 您可以使用以下 API 来读取频率。


    uint64_t clkRate;
    SoC_moduleGetClockFrequency (TISCI_PRU_ICSSG0、 TISCI_DEV_PRU_ICSSG0_CORE_CLK、&clkRate);


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

    没问题:

    BR Alexander

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

    Alexander
    您是否在第一次运行(工作运行)和后续运行(非工作运行)中看到相同的值?

    此致

    Dhaval

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

    尊敬的 Dhaval:

    我不明白您的意思是工作/不工作?

    我的工作如下:

    1. 打开目标的电源。 (LaunchPad 和 Booster Pack)

    2. 通过调试器加载软件,然后按“开始“。 现在我正确读取了所有值。

    3. 现在停止调试会话。

    4. 现在我通过调试器重新加载软件并启动。

    现在读取了错误的 posRes 值。

    如果我现在加载并启动 SW 10 次、则 posRes 值错误 8 倍、正确 2 倍。

    当新打开目标时、该值始终正确

    Rb Alexander

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

    尊敬的 Alexander:

    在步骤 3 之后、您是否执行系统重置以在再次加载软件之前清除电阻器/内存?

    BR、

    Achala Ram

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

    嗨、Achala

    我不会显式执行系统重置!

    我只使用带有以下按钮的调试面板:

    但 GEL 解释程序会为我重置 CPU、所以我不必在这里或在这里执行任何操作?

    GEL OutputWindow 显示:

    BR Alexander

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

    是否可以比较两种情况(步骤 2 正常工作、步骤 4 不工作)在运行 endat_get_pos_res () 之前和之后存储在 TCM 中的值? 将 gEnDatChInfo 的地址放入“Memory Browser“中、观察其内容。 此外、您是否可以使用逻辑分析仪捕获这两种情况的信号? 在工作和非工作情况下、预期行为应该相同:TX 和 RX 信号(包括时钟)应该相同、并且 gEnDatChInfo 在这两种情况下应包含相同的响应。

     BR、

    Achala Ram

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

    嗨、Achala

    是的、我将在 KW15 周内完成。 在那之前、我会休息一下。

    在那之前、我会提供相关信息、

    BR Alexander