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.

[参考译文] TMDXIDK437X:PRU 外设接口接收问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/672198/tmdxidk437x-pru-peripheral-interface-receive-issue

器件型号:TMDXIDK437X

您好!

我使用 AM437上 PRU 的外设接口来接收从同一控制器上的另一个 PRU 发送的异步数据。 我以100kHz 的时钟发送数据、接收器以800kHz 的频率运行、因此我具有8倍过采样。 这意味着、当我发送8位时、我应该接收64位。

我的问题是我没有得到64、而是128、因此始终是预期的两倍。

我按照数据表中的说明构建了接收例程。 我已经更改了时钟速率、切换了 PRU、切换了外设接口中的通道、并且还使用了另一个控制器来发送数据、但我始终会得到相同的效果。

我尝试尽可能地分析效果、以下是我取得的进展:

我始终发送相同字节的2个字节、从"0x01 0x01"到"0xFF 0xFF"。 我将字节加倍、以确定接收到的字节是否是随机的、仅为发送字节的两倍、或者是否有其他影响。 下面是一个示例。 我发送字节0xA3 0xA3、因此我应该在接收器的存储器中找到的内容(具有8x 过采样)是:

FF 00 FF 00 00 FF  FF FF 00 FF 00 00 00 00 FF 去采样到10100011 10100011或0xA3 0xA3。

我实际上得到了以下结果:

FF 00 00 00 FF 00 00 00 FF 00 00 FF 00 FF FF FF 00 FF FF FF FF FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF FF FF FF FF 00 FF FF FF FF FF FF FF FF

这看起来是随机的、但您可以在其中找到所需的结果、正如我在下面所标记的:

FF 00 00 00 FF 00 00 00 FF 00 00 FF 00 FF FF FF 00 FF FF FF FF FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF FF FF FF FF 00 FF FF FF FF FF FF FF FF

如果您取出红色部件并将其余部分放在一起、您实际上会得到所需的结果。 正如我说过的、我针对1到255的位组合对其进行了测试、您可以对所有位组合应用此模式。 接收的数据是我想要的两倍、总是四个字节错误、字节正确、四个字节错误等等...

这是我发现的、但我无法解释为什么会出现这种效果或如何消除这种效果。 可以帮帮我吗?

此致、

Benjamin

电路板:AM437x 工业开发套件(IDK)

CCS 版本: 7.2.0.00013

编译器版本:TI v2.1.5

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

    这是什么" AM437上 PRU 的外设接口"? IEP 或其他东西? 请详细说明您如何发送和接收数据以及您使用的 PRU 引脚。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    它是支持 EnDat 2.2和 BiSS 的模块、在数据表中称为外设接口。 它不是 IEP。 我通过填充 FIFO 来发送数据、然后在 R31中设置 TX-CHANGE_GO。 为了接收数据、我轮询 R31中的有效标志并从 R31中的 RX_DATA_out0复制一个字节的数据。 我使用的引脚:
    pr0_pru0_gpo1
    pr0_pru1_gpi9

    此致

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

    您是否有逻辑分析仪、以便我们可以看到线路上实际发生了什么情况? 如果这是 TX 问题还是 RX 问题正确、应该缩小范围?

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

    您好!

    我使用逻辑分析仪和示波器查看了线路。 导线上的信号与我发送的信号完全相同。 我认为这是一个接收器问题。

    此致、

    Benjamin

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

    您是否能够共享您的代码、或至少共享您的 PRU ED 寄存器设置? 我正在尝试将其与我们的 EnDat 实现进行比较、以检查是否存在任何增量。

    您可能已经知道这一点、但我们的工业驱动器包(software-dl.ti.com/.../index_FDS.html) 中提供了一个 EnDat 示例、位于 interfaces/endat_master/firmware/endat_main.asm 文件中。

    Jason Reeder
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    endat_main.asm 文件提供了一个示例、说明如何在 M_OTF_receive_downsample_and_CRC 宏中接收传入数据并对其进行下采样。 这不会解释您接收的额外字节、但可能会提供检查和清除有效位的指针。

    以下是运行工业驱动器包中的 endat_diagnostic 程序并检测到 EnDat2.2编码器后来自 PRU 的寄存器。 此示例(在检测到 EnDat2.2编码器后)将 TX 时钟设置为8MHz、将 RX 时钟设置为64MHz。 您可以将这些设置与您自己的设置进行比较、以查看是否有任何内容看起来关闭。

    ED_P0_RXCFG - 0x000260E0
    0x00020007
    RX_div_factor = 3
    DIV_FRAC=1
    UART_clk
    OS = 8

    ED_P0_TXCFG - 0x000260E4
    0x00170700
    TX_div_factor = 24
    DIV_FRAC=1
    endat_clock_pin=1
    就绪
    UART_clk

    P0_CFG0_0 - 0x000260E8
    0x001DF800
    swap=0
    OVERRIDE_EN=0
    RX_FRAME_SIZE=29
    TX_FRAME_SIZE=31
    TX_Wire_dly=0

    ED_P0_CFG1_0 - 0x000260EC
    0x00FA07D0
    RX_en_counter=250
    TST_DELAY_COUNTER=2000

    R30
    0x0008AC00
    CLK_MODE=FREE_RUNING_STOP_HIGH
    TX_CHAN_SEL=0

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

    您好!

    我以前不知道 endat_main.asm 文件。 我查看了宏、认为我以正确的方式检查并清除了有效位。 我不能在这里发布我的代码,但如果您需要,我想我可以通过电子邮件将其发送给您。

    但我检查了我的寄存器、我认为它们基本上是相等的。 我的结果是:

     

    ED_P0_RXCFG = 0x00000007
    OS = 8

    ED_P0_TXCFG = 0x077F0700
    TX_div_FACTOR = 1919
    DIV_FRAC = 1
    endat_clock_pin = 1.
    就绪
    UART_clk

    P0_CFG0_0 = 0

    ED_P0_CFG1_0 = 0

    R30 = 0
    CLK_MODE = FREE_UNCING_STOP_LOW
    TX_CHAN_SEL = 0

     

     

    ED_P1_RXCFG = 0x00EF0007
    RX_div_FACTOR = 239
    DIV_FRAC = 1
    UART_clk
    OS = 8

    ED_P1_TXCFG = 0x00000700
    endat_clock_pin = 1.
    就绪
    UART_clk

    ED_P1_CFG0_1 = 0

    ED_P1_CFG1_1 = 0

    我将寄存器配置为100kHz 发送时钟和8倍过采样。 对于发送、我使用 P0和对于接收 P1。 我以连续模式发送、因此我不需要 TX 帧大小、也不使用线延迟、因此我将 CFG0和 CFG1保留为0。

    此致、

    Benjamin

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

    Benjamin、

    寄存器设置不正确、没有任何内容会跳出。 您能否联系您的现场合作伙伴与我分享代码?

    出于好奇、如果您忽略(立即清除)每秒数据有效标志、您是否会收到正确的数据流?

    endat_main.asm 代码中有一条注释、说明在检查数据有效位之前(清除后)等待至少两个周期。 在再次检查有效位之前、您是否至少有两个周期的延迟、或者这是否处于非常紧密的循环中?

    Jason Reeder

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

    您好!

    您的最后一个想法解决了我的问题。 我使用了一个非常非常紧密的环路。 现在、我添加了一些等待周期、我得到了我期望的结果。 感谢您的建议。

    也许您应该将这些信息添加到数据表、EnDat RX 示例中、因为这是我进行植入的依据、只是不知道这个规格。

    我很高兴您提到了该规范、并最终解决了我的问题。 我在这方面挣扎了相当一段时间。 感谢您的支持。

    此致、

    Benjamin

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

    Benjamin、

    感谢您回来确认答案!

    我已经提供了反馈、我们需要更新数据表、这应该可以进入未来的版本。

    Jason Reeder