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.

[参考译文] SK-AM64B:使用 AM6442 (SK-AM64B) PRU-ICSSG 在 125MSPS 下高速捕获 ADC3644

Guru**** 2826825 points

Other Parts Discussed in Thread: AM6442, ADC3644, SK-AM64B, SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1608342/sk-am64b-high-speed-capture-of-adc3644-at-125-msps-using-am6442-sk-am64b-pru-icssg

器件型号: SK-AM64B
主题中讨论的其他器件: ADC3644、AM6442、 SysConfig

尊敬的 TI 支持团队:
我们正在开发远距离激光雷达/计量器系统、并需要帮助集成  ADC3644  通信  SK-AM64B (Sitara AM6442)  硬件设置。
我们的目标是以 A 捕获原始 14 位数据  125MSPS  采样率。 我们打算使用  PRU-ICSSG  来处理高速  DDR CMOS  并行接口、可绕过对 FPGA 的需求。
关键要求:
  1. 接口:  125MHz 处的 14 位 DDR CMOS(每通道 7 线 DDR)。
  2. 控制器:  使用 AM6442 上的 PRU-ICSSG GPI 引脚进行确定性捕获。
  3. 软件:  不同应用  MCU+ SDK [11.00.18] 、但我们找不到此 ADC 系列的特定“pru-to-ddr-cmos"示“示例项目。
我们特别需要以下方面的帮助:
  • PRU 固件:  在 125MHz DCLK 的两个边沿捕获 DDR 数据的示例代码或汇编逻辑。
  • 内存管理:  使用 UDMA/IPC 将 125MSPS 数据从 PRU 本地存储器移动到 2MB L3 RAM 或 DDR4 存储器的优秀实践。
  • SysConfig: 针对 SK-AM64B 的引脚多路复用建议、以避免与高速 PRU 信号冲突。

请提供任何相关的参考设计、应用手册或基线 PRU 固件、以便帮助我们快速启动此集成。

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

    编辑于 2026 年 1 月 21 日

    您好、Vijay、

    PRU <--外部高速 ADC 的现有示例

    PRU 内核非常适合连接许多 具有“高速“数据接口的不同 ADC。 您可以在 MCU+ SDK 中找到当前的示例:
    https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/11_00_00_15/exports/docs/api_guide_am64x/DRIVERS_PRU_ADC.html
    https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/11_00_00_15/exports/docs/api_guide_am64x/EXAMPLES_PRU_ADC.html

    我们来讨论一下 PRU 的优势  

    您可能已经注意到、这些现有的 MCU+ SDK 示例的接口速度比 125MSPS (1MSPS)。 但该代码仅使用 1 个 PRU 内核、在这些设计中、接口速度的限制因素是 ADC、而不是 PRU 内核。 PRU 交互的速度有多快?

    千兆位 PRU 以太网的实际传输速率是 125MHz。 因此、我们可以将其视为硅器件能够提供的绝对最快速度。 但这也会使用特殊加速器、所有 PRU 内核、特定于以太网用例、而不是通用 ADC 用例。

    限制因素是在 PRU 内核上运行的软件。 在数据捕获之间需要运行多少个汇编指令?

    如果 PRU 从外部源读取时钟(而不是生成时钟)、我可以告诉您、我们有一个 PRU SPI 软件实现、我们已经观察到该软件在高达~12.8MHz 的情况下可以正常工作。 但是、现有代码在较高频率下会出现问题、因为没有足够的 PRU 时钟周期来检测传入的边沿转换、然后驱动输出信号的变化、并且仍然满足时序要求。 这是自述文件中“Practical Max SCLK“和“Theory MAX SCLK“之间的差异:
    https://github.com/TexasInstruments/open-pru/tree/main/examples/spi_loopback

    对于该特定的 SPI 示例、如果 PRU 是时钟源、则 PRU 能够以更高的速度运行 (TX 路径的测试速度高达 41MHz)。 如果我们采用诸如假定下一次边沿转换时的软件技巧、而不是等待实际检测边沿转换、那么我们甚至可能能够找到时钟接收器的权变措施。 但是、由于执行这些宏所需的 PRU 时钟周期数量、该 SPI 示例只能以最快的速度以~20 –30MHz 的速度运行现有的 RX 宏。

    SPI 示例可能没有得到很好 的优化。 例如、它当前不使用任何 RTU 或 TX_PRU 内核。 因此、通过将一些处理转移到其他 PRU 内核、或寻找其他方法来优化代码、可以将该示例(或 MCU+ SDK 中的 PRU ADC 示例代码)提升到更高的频率。

    我知道一些使用 50MHz / DDR 发送 TX 数据的项目(当 PRU 内核频率为 200MHz / 333MHz 时、83.25MHz 位拆分时钟信号)、我相信位拆分 PRU 信号的上限是 100MHz。

    那么、这对您的设计意味着什么?  

    125MSPS 的速度太快、无法使用 PRU 内核。 您需要找到一种不同的方式让 ADC 与 Linux 处理器进行交互。

    12.8MSPS 或更低速度 将与 PRU 内核一起工作(假设该 ADC 的接口类似于标准 SPI 接口)。

    也可能超过 12.8MSPS、但它取决于接口所需的确切值(例如,PRU 是否提供时钟信号)。 我建议先编写概念代码验证、确保在提交基于 PRU 接口的设计之前、可以实现这一目标。

    未来的读者、您可以在新的 AM64x PRU Academy 中找到有关潜在 PRU 用例的其他讨论:
    “什么是 PRU、PRU 有什么用途?“部分 >页面“PRU 用例“
    https://dev.ti.com/tirex/explore/node?isTheia=false&node=A__AenUqHwBR8waD8D75BgNMg__AM64-ACADEMY__WI1KRXP__LATEST 

    此致、

    Nick

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

    您好、Nick、

    感谢您提供详细的细分信息。 我们了解软件宏限制。
    但是、我们正在考虑两种方法来实现我们的目标:
    1. 使用了  ADC3644 的内部抽取  以将输出速率降低至~10-15MSPS。 您能提供一个标准的 PRU 示例代码吗  并行 CMOS  是否在 15MHz 上阅读?
    2. 使用了  GPMC(通用存储器控制器)  用它来采集 ADC 数据。 TI 是否有在 AM64x 上将 GPMC 用作高速 ADC 接收端的参考?
    我们需要避免使用 FPGA。 为了实现最稳定的 15MSPS+捕获、TI 建议使用这两条路径中的哪一条?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nick、

    还请分享适用于我们项目的 FPGA 处理器开关。

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

    您好、

    线程所有者将在 2 月 17 日的一周内停止工作。 如果您在这周内没有收到更新、请 ping 通该线程。

    感谢您的耐心。

    此致、
    Harshith

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

    您好、Vijay、

    对延迟的答复表示歉意、我回到办公室了。

    当前在 MCU+ SDK 中实现的 PRU ADC 示例执行并行读取。 例如:
    https://github.com/TexasInstruments/mcupsdk-core/blob/next/examples/pru_io/adc/ads85x8/firmware/main.asm
    M_parallel_read_packet

    我正在将您的问题发送给另一个团队成员、以讨论我们是否有任何与您所需的 GPMC 示例类似的示例。

    此致、

    Nick

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

    尊敬的 Nick:

    感谢您的回复、是的、请联系。

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

    您好、Vijay、

    我们没有任何关于 GPMC 与外部 ADC 交互的 Linux 示例。 我来将此主题发送给 MCU+专家来咨询他们。

    此致、

    Nick

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

    您好、Vijay、

    GPMC 具有地址、数据和控制线路、旨在用于存储器接口。

    GPMC 主要用于存储器接口、而不是 ADC 接口。

    GPMC 以 100MHz 和 133MHz 运行、并且还具有预分频器。

    因此、我们可以使用 100MHz 的输入实现最大的 25MHz 时钟。

    此致、

    Anil.

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

    您好、Swargam Anil、

    感谢您澄清 GPMC 限制和时钟速度。

    目前、我已决定保留 GPMC 和外部 ADC 接口。 我的当务之急是在 AM6442 上使用内部 12 位 ADC 来实现高达 4MSPS 的吞吐量。

    您能否提供实现此采样率的示例代码? 此外、如果您能分享配置 ADC 以获得出色性能所需的相关 SysConfig 设置、我将不胜感激。

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

    你好 Anil、只是跟进一下这个问题。 关于所提到的问题、我们还没有回音。 请尽快回复、以便我们继续前进。

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

    您好、Vijay、

    有关内部 ADC 配置和实现 4MSPS 采样率的信息、请在下面找到。

    ADC 示例:

    我们有适用于内部 ADC 的示例。 您可以参考 SDK 中的示例文件夹、以获取参考代码和实现详细信息。

    C:\ti\mcu_plus_sdk_am64x_11_01_00_17\examples\drivers\adc\adc_singleshot

    ADC 时钟配置:  

    默认情况下、ADC 时钟以 25MHz 运行、这不足以实现 4MSPS 采样率。

    要实现 4MSPS、需要在 60MHz 上配置 ADC 时钟。 请参阅以下 E2E 论坛链接、其中提供了在 60MHz 上配置正确时钟频率的分步指导。

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1425665/am2432-am2432-adc-sampling-time/5469507#5469507

    上述 ADC 示例在 EVM 上可用、但在 SK 中不可用。

    此致、

    Anil.

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

    您好 Anil、

    感谢您的详细回复并将我们指向 CTRLMMR_ADC0_CLKSEL 寄存器。 我们遵循您的指导、并高兴地报告、我们已成功实现了 4 MSPS 的目标。

    ——

    取得的成果:

    根据您的建议、我们在 CTRLMMR_ADC0_CLKSEL 寄存器(物理地址 0x43008510)中配置了 CLK_SEL = 1、以将 ADC 时钟源从默认 25MHz 切换到 60MHz。 执行情况如下:

    SoC_controlModuleUnlockMMR (SOC_DOMAIN_ID_MAIN、2);
    *(volatile uint32_t *) AddrTranslateP_getLocalAddr (0x43008510U)= 0x01U;
    SoC_controlModuleLockMMR (SOC_DOMAIN_ID_MAIN、2);

    通过这种变化、我们在单通道 (AIN0) 上实现了 3.880MSPS 的一致采样率、满足 4MSPS 目标。 所有三个测量运行均一致、确认结果稳定:

    运行 1:纯 ADC+DMA 时间= 1005us→3.964MSPS
    运行 2:纯 ADC + DMA 时间= 1005us→3.980MSPS
    运行 3:纯 ADC + DMA 时间= 1005us→3.980MSPS
    平均速率:3.927 MSPS→结果:通过✓

    使用的配置:

    板:AM64x SK (AM6442)
    SDK:MCU+ SDK v11.02.00.24
    内核:R5FSS0-0、FreeRTOS
    ADC 时钟:60MHz (CLK_SEL = 1、通过 CTRLMMR_ADC0_CLKSEL)
    模式:连续、单通道 (AIN0)
    openDelay:0
    sampleDelay:0
    平均:无
    样本/传输: 4000 通过 UDMA PDMA (PKTDMA_0)
    FIFO 阈值:16 个样本
    第 250 章我是不是很好
    测量速率:3.980 MSPS(纯 ADC + DMA 时间)

    ——

    当前问题 — OSPI 闪存写入挂起:

    我们目前在将采集的 ADC 数据保存到板载 OSPI 闪存 (S28HS512T) 时遇到了问题。 成功完成 Flash_eraseBlk () 后、Flash_write () 调用在 8D-8D-8D 模式下无限期挂起。

    我们尝试了以下方法、所有方法都导致了相同的挂起:

    1.对所有 16000 字节进行单个 Flash_write () 调用—挂起
    2.逐页 Flash_write (),每次调用 256 字节—挂起
    使用专用 UDMA 实例 (BCDMA_0
    与 ADC PKTDMA_0 分离时的 CONFIG_UDMA1)-仍然挂起

    观察结果:
    - Flash_eraseBlk():成功完成
    - Flash_write ():调用后挂起,从不返回
    - Flash_read ():尚未测试,因为写入永远不会完成
    - OSPI 协议: 8D-8D-8D(S28HS512T 在 SK 板上)

    您能否介绍使用 AM64x SK 板上的 MCU+ SDK v11 在 8D-8D-8D 模式下将数据写入 S28HS512T OSPI 闪存的正确方法? 具体来说:

    1. SK 板上的 8D-8D-8D 协议模式是否支持 Flash_write ()?
    2.在 SDK v11 中是否有针对该闪存器件的推荐写入 API 或序列?
    3. SK 板与 EVM 之间是否存在影响闪存写入行为的已知差异?

    请提供任何指导。 我们期待着您的尽早答复。

    再次感谢您的持续支持。

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

    您好、Vijay Sharma、

    您可以针对闪存写入问题提出新的 E2E 帖子。

    因此、我们的主题专家将审核您的问题并提供相应的回答。

    我将关闭此主题并打开新的问题的新主题。

    此致、

    Anil.