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.

[参考译文] AM625:在一个 PRU 上使用20个以上 GPI 的任何方式?

Guru**** 2463330 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1456474/am625-any-way-to-use-more-than-20-gpis-on-one-pru

器件型号:AM625

工具与软件:

你(们)好、

我将评估 AM62x 系列中的处理器、以用于两个即将推出的不同系统设计项目。

我的理解是、AM62x 上的每个 PRU 内核都可以访问20个增强型 GPI 和20个增强型 GPO。 PRU 内核到 GPIO 的高速、低延迟访问可以完美满足我的需求。 但是、我实际上需要20多个 GPI。

是否有办法将数字从20增加到30? 例如、是否可以将一些 GPO 重新映射为 GPI 以增加 GPI 的数量? 或其他技术?

R31寄存器中有足够的位可容纳更多引脚(请参阅 TRM 中的图7-21 "PRU 模块接口"、其中显示了 GPI 的 R31中可用的30位)。 我在 TRM 中看到了第7.4.2.2节"PRUSS 快速 GPIO 引脚"、但我不完全理解。 编程中是否有可用于将分配给其中一个 PRU 内核的 GPI 数量增加到20个以上的用途?

为了更加详细地说明我要尝试执行的操作、我有一款提供并行 CMOS 输出的双通道14位 ADC。 我想使用 PRU 内核上的 GPI 读取该输出。 缺点是 ADC 以~48 MHz 采样率运行、这非常快、并且延迟或误差裕度很小。 我已成功实现该实现、其中每个通道(14位/GPI)由一个 PRU 内核处理。 但我需要释放其中一个 PRU 以处理与不同组件(DAC)的连接、所以我想看看是否有方法可以增加一个 PRU 上的 GPI 数量、以便可以在单个 PRU 上处理两个通道(总共28位/GPI)、而另一个 PRU 则空闲。

谢谢!
Cody

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

    您好、Cody、

    PRU GPI/PRU GPO 信号与常规 GPIO 信号不同、因为该信号直接连接到 PRU 内核的 R30/R31寄存器。 有关 PRU GPO/PRU GPI 信号为何唯一的更多信息、请参阅  
    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1269989/faq-what-is-a-pru-core-why-are-pru-gpio-signals-different-from-regular-gpios

    这意味着、如果我们想要 PRU GPI/PRU GPO 信号的独特优势(而不仅仅是常规的 GPIO 信号-请记住、PRU 内核也可以读取 GPIO 信号、就像任何其他处理器内核一样)、那么我们将仅限于处理器内的硬接线信号。

    如果我们查看 AM62x 数据表>终端配置和功能> PRUSS、您将看到 PRU0只有20个 GPI 信号传入、20个 GPO 信号传出。 PRU1也是如此。

    我不清楚是否所有40个 PRU GPI 信号都可以同时引脚输出到 PRU0/PRU1、或者是否存在引脚多路复用冲突。 PRU 内核可以使用暂存区非常快速地来回传递数据 Direct_Connect ,如 PRU_Spratchpad 中所示,这是负载共享的一个潜在选项(https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/tree/examples/am62x )

    我今天的时间不够用了、但您可以使用 pinmux 工具来验证引脚多路复用、例如:
    https://dev.ti.com/sysconfig

    编辑:我漏掉了你的最后一段,道歉。 我将留下前两段、以防它们对未来的读者有所帮助。 没有时间给出更多的想法,可以在几天内聊天更多.

    此致、

    Nick

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

    Nick、

    感谢您的答复。 我了解 PRU GPI/GPO 信号的优势。 实际上、我已经阅读了您链接的线程、这是我一直如此坚持追求的主要原因、因为使用具有 PRU 内核的 Sitara 系列将允许我在设计中淘汰 FPGA。 我的主要问题是、我需要20多个 GPI 才能完成这项工作、因此我希望与专家进行仔细检查、看看我是否缺少任何可能存在的选项。

    因此、我肯定会看到每个 PRU 只有20个 GPI 和20个 GPO 信号进入、我的团队已在评估板上实施这一点(尽管采用的是 AM64x、其 PRU 子系统功能要稍微更强大一些)。 我也知道引脚复用的问题、我一定也会关注这一点。 但我只是想弄清楚是否有任何方法可以通过任何可能的方式增加可用于 AM62x 上某个 PRU 内核的 GPI 数量、是否有官方支持。

    我想的一个方法是将一些 GPO (在本例中我不需要)重新映射为 GPI。 在我阅读正式文档(例如 TRM)和各种 e2e 论坛线程时、我看到了一些参考文献、这些参考文献使我认为这可能是可行的。 我还注意到、寄存器中有更多可用位、而且一些参考资料多达30行、所以我想知道是否存在任何可能。 正如我提到过的、我看到了 AM6x TRM 中的第7.4.2.2节"PRUSS 快速 GPIO 引脚"、但我真的不能理解其中提供的所有信息。 它说有一种方法"在 GPO 和 GPI 操作之间快速(或至少是确定性的)切换"、并且"这允许每个 PRUSS GP 引脚在 I/O 引脚配置为 GPO 多路复用模式时用作 GPO 或 GPI"、这让我想知道是否可以重新分配/重新使用一些我不需要的 GPI (我需要更多的 GPO)。 但由于我对这一节所说的内容没有信心、所以我想确认这是否正确。

    如果不以任何方式将可用的 GPI 增加到单个 PRU 内核、我将不得不考虑外部组切换(以便使用14+1 GPI、可以通过切换1个 GPI 来获得每组14个 GPI 的两个组)、但我担心这会花费太长的时间、从而无法跟上高采样率。 在花时间研究该选项并对其进行原型设计之前、我想确保已经用尽 SOC 本身上/可以使用的所有其他选项。

    我希望这有道理。 希望您能享受新年假期、期待您有空时与我们聊天! (如果您想离线讨论或共享任何敏感资料、也可以在我的非公开个人资料中找到我的电子邮件。)

    此致!
    Cody

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

    您好、Cody、

    对不起这里的延迟响应,贝利把我指回到线程。 我已经解锁了该主题、以便我们可以继续讨论。

    "在 GPO 和 GPI 操作之间切换"是否意味着可以将20个以上的 PRU GPI 信号连接到单个 PRU 内核?  

    据我所知、不

    本文档确实提到了 EDIO 有32个输入和32个输出信号、其中4个信号用于 IEP EDIO。 但从阅读文档来看、这并不像所有其余28个输入/输出都可以重复用于 PRU GPI/GPO。 相反、我们连接了20个 EDIO 输入/输出以实现 PRU GPI/PRU GPO 之间的快速切换、此外、这些信号中的8个还没有连接到硬件内的任何位置。

    但是、我会与其他一些团队成员进行仔细检查。 我也很想了解有关"双向"设置的更多信息、因为我仅在输入和输出之间手动交换、或者在我自己的代码中仅使用专用的输入和输出引脚。

    此致、

    Nick

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

    您好、Cody、

    下面是与我的团队成员交谈后的一些其他信息。

    单个 PRU 内核可直接连接多少个 GPI 信号?  

    选项1:最多将20个信号连接到 PRU GPI。 读取1个 PRU 时钟周期、信号需要另一个1-2个 PRU 时钟周期从引脚传播到 R30/R31寄存器。

    选项2:同步2个 PRU 内核、并在完全相同的时钟周期内读取多达40个 PRU GPI 信号。 数据仍需要在 PRU 内核之间传递、例如使用宽边接口(此处为 Direct_Connect 示例)

    选项3:通过 IEP EDIO 引脚读取/写入多达4个额外信号(您提到的 TRM 部分中的位29、29、30、31)。 将使用 SBCO/LBCO 访问数据、这会根据您是进行读取还是写入操作而额外增加几个 PRU 周期。

    PRU 也可以从标准 GPIO 模块进行读取/写入、但48MHz 的速度足够快、访问 PRU 子系统之外区域的额外延迟可能会开始成为一个问题。

    是否还有其他尚未讨论的选项?  

    在相同的14条线路上对两个 ADC 进行采样

    您在 PRU 代码中有多大余地? 如果您有多个 NOP 命令或 PRU 内核一直处于旋转状态、也许您可以考虑将两个 ADC 连接到同一总线、并一次与一个 ADC 交互。

    下面我们有一个带有 SPI 的 AM335x 上的较旧示例:
    https://www.ti.com/tool/TIDA-01555
    此特定示例代码可以在25MHz SPI 总线上以200MHz PRU 时钟频率与单个 ADC 进行交互、该时钟频率随333MHz 时钟频率扩展到37.5MHz。 您的接口频率不太高、但我也不确定您的代码比较如何。

    设计指南: https://www.ti.com/lit/ug/tidudn4a/tidudn4a.pdf?ts = 1740080065706

    此处输入代码: https://git.ti.com/cgit/apps/tida01555 

    请记住 PRU 固件的时序预算

    如果一次只从单个 ADC 读取/写入、那么48MHz 速度可能太快、无法与单个 PRU 内核的多个 ADC 进行交互。 最后可以归结为每个时钟周期需要执行多少条 PRU 指令。 如果这是个问题、您还可以考虑以较低的时钟速率对 ADC 进行采样。

    DAC 是否实际需要使用 PRU 实现?  

    还是可以直接从不同的内核(如 M4F 或 DM R5F)进行控制?

    另一种选择:考虑 AM64x  

    我不确定您还需要哪些其他系统设计(例如、图形、您需要多少个 A53内核等)- AM62x 具有 AM64x 上没有的一些功能。

    但是、如果您发现自己需要更多的非 Linux 内核来完成更多任务、可以考虑到 AM64x 在2个 PRU_ICSSG 子系统中有12个 PRU 内核(并非每个 PRU 内核都可以直接访问 GPI/GPO 信号)、根据需要提供额外的 PWM、以及通过支持通用千兆位以太网或工业网络协议的 PRU 子系统扩展您的网络。 多个 R5F 内核之外。 这是另一种可以考虑的选择。

    注意事项-在同一引脚上执行 PRU GPI 和 GPO

    如果要从驱动信号(GPO)的 PRU 切换到由其他人(GPI)驱动的线路、必须在 GPO 和 GPI 模式之间切换、如该 TRM 部分所述。

    这种"双向"模式只允许您使用 GPI 对您使用 GPO 驱动的值进行采样,而不是同时使用 GPO 驱动线路,并为其他人同时驱动线路进行采样。

    此致、

    Nick