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.

[参考译文] AM6442:使用事件触发 DMA SPI 读取

Guru**** 2580495 points
Other Parts Discussed in Thread: SYSCONFIG, AM6442, ADS127L18, TMDS64EVM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read

器件型号:AM6442
Thread 中讨论的其他器件: ADS127L18、SysConfig、 TMDS64EVM

工具/软件:

尊敬的 TI 专家:

我们有以下硬件配置:

这两个 ADC 在 AM6442 SoC 上的多控制器模式下连接到 McSPI4、并要在 R5F 侧使用。 要求如下:

  • 128KSPS 读取速率
  • 顺序读取、首先是 ADC1、然后是 ADC2。 我们必须能够区分数据源、即样本是否来自 ADC1 或 ADC2
  • 稳定的读数频率 — 最大 抖动 10ns
  • 每 32 个样本中断一次

我们已经有另一个 ADC 连接到 SoC (8 通道 ADS127L18)、它充当 SPI 主器件、并在外设模式下为 2 个 McSPI 生成 nCS 和时钟。 该 ADC 通过 PKTDMA+PDMA 读出、并在 McSPI RX 上触发。

我们的目的是使用从 ADS127L18 生成的 nCS(在内部,作为内部触发器,或在外部用作 GPIO 中断)、或使用计时器触发第二个 DMA(它必须按顺序读取两个 ADC)。

请注意、此处不能选择计时器中断、因为它会导致大量抖动、从而导致数字化信号失真。 我们需要稳定的读数频率。

我们有以下问题:

  1. 显然、PKTDMA 不能从任意触发源触发;它必须是从外设生成的数据包/事件。 这意味着我们必须使用 BCDMA、对吧? 使用 BCDMA 是否与用于 McSPI 的 PDMA 兼容?
  2. 将 BCDMA 配置为使用内部信号(例如来自另一个 McSPI(例如 McSPI 3) 的)的 RX complete) 的方法是什么?哪个信号用于触发来自另一个 McSPI 的 DMA 传输?
  3. BCDMA 必须配置为依次读取 ADC、ADC1 和 ADC2、因为它们共享相同的 McSPI。 理论上、这些是 2 个独立的 SPI 通道、但可以通过以下方式链接 DMA:
    • 外部事件(ADS127L18 nCS、GPIO 中断或计时器)会触发 ADC1 的读取
    • 完成后、ADC1 的 McSPI TX 完成会触发 ADC2 读取
  4. 我们是否可能需要多个 BCDMA 通道才能实现上述目标?

谢谢!

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

    您好 Angel、

    我正在查看您的查询,你可能会得到答复在星期一.

    此致、

    Anil.

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

    现在我对应该或可以做的事情有了更好的了解、我绘制了一个序列图、说明了我对流程的设想:

    针对 McSPI4-CH0 和  McSPI4-CH1、重复上述过程两次。 提供启动触发器的计时器必须配置为使用至少 1us 的偏移、因为这将是完成 ADC 读取的最短时间 (16 个时钟@16MHz)。

    由于似乎无法从我最初预期的事件(PDMA 传输完成或 McSPI 外设 RX 完成)触发 BCDMA 传输、因此我想探索如何从内部 DMTimer 触发它。 根据相关 文章、尽管通过 PRU 中的 IEP 单元、这应该是可行的。 根据 TRM、按照相同的逻辑、也可以利用来自 DMTimer PWM 输出的路径。

    根据我的理解、这种方法应该是可能的。 如果我正确解释了 TRM、那么从 Timer0 到 Timer3 的事件应该可用于触发 BCDMA。

    此外、对于 BCDMA 通道、似乎应该使用单独的 RX 和 TX 通道来连接到 McSPI 的 PDMA。 是这样吗?

    我还有以下开放式问题:

    1. 上述观察结果是否正确?
    2. 如何配置从相应计时器 (Timer0 到 Timer3) 到 L2G 的事件路由?
    3. 应如何将 BCDMA Tx 通道配置为由这些计时器触发?
    4. 一个 BCDMA Tx 通道 (McSPI4-Ch1) 是否可以由 PWM 输出的上升沿触发、而另一个 BCDMA Tx 通道 (McSPI4-Ch1) 由同一输出的下降沿触发?

    谢谢、此致!

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

    尊敬的 Anil:

    您已经有什么想法了吗? 我们的硬件设计 取决于 概念的可行性、我们还有几天的时间来做出决策。

    谢谢!

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

    您好 Angel、

    我可以提供建议到今天,需要花一些时间来分析你的要求和解决方案.

    此致、

    Anil.

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

    您好 Angel、

    设置摘要:

    •两个 SPI ADC 连接到 McSPI4、在多控制器模式下配置。

    •一个单独的 ADS127L18(主 ADC)为两个外设 SPI ADC 生成 SCLK 和 nCS。

    •读取速率:128kSPS

    •读取顺序:顺序读取:ADC1→ADC2

    •中断:每 32 个样本设计:

    方法:  

    在 R5F 上使用 BCDMA + PDMA。 由于 McSPI 处于外设模式、因此您可以配置 BCDMA  + PDMA。  

    在多控制器模式下配置 McSPI4

    •对 ADC1 和 ADC2 分别使用片选线 (nCS0 和 nCS1)。

    •ADS127L18 必须以定义的可重复序列切换 ADC1 和 ADC2 的 nCS。

    •此序列将用于映射数据源。

    •您可以将 nCS 信号路由为外部触发器输入 BCDMA  如果希望从两个 ADC 进行背对背传输、可以选择 DMA 通道。

    •配置两个 McSPI RX DMA 通道、一个用于 ADC1、一个用于 ADC2。

    •确保每个 DMA 通道均由其各自的 nCS 和 SPI RX 事件触发。

    • DMA 每 32 个样本中断一次(将 DMA 传输大小设置为每个 ADC 32 个样本。)

    触发机制:  

    ADS127L18→SCLK 并切换 nCS1→ADC1 响应 SPI RX 触发 DMA1。

    之后、

    ADS127L18 切换 NCS2→ADC2 响应→SPI RX 触发 DMA2。

    挑战:  

    MCSPI 以 PKTDMA 方式与 DMA 一起使用、该 PKTDMA 不应加载无限次 TR、不能连续触发 DMA 事件。  

    在这里、您需要使用 BCDMA、这是可能的、在 MCU+SDK 中、我们不支持具有 BCDMA 通道的 MCSPI。

    如果我们使用 BCDMA 通道配置 MCSPI ,您的要求可以通过 DMA 自动触发器来实现。

    此外、DMA 根据 GPIO 输入触发、这可以使用 BCDMA 实现。

    您可以查看下面的常见问题解答、了解如何从 GPIO 输入触发 DMA。

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1378150/faq-how-to-trigger-dma-with-the-help-of-gpio-on-am64x-am243-and-am62x-devices

    此致、

    Anil.

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

    尊敬的 Anil:

    感谢您的全面答复。 但是、我认为它并不能完全满足我的用例。 让我再解释一下:

    我需要符合以下条件的 BCDMA/PDMA 配置:

    1. 目前、我们决定放弃从主 ADC 触发。 相反、我们的整个链条将由触发 DMTIMER0 在 PWM 模式下运行、该模式每发出一个脉冲 7.8125µs (128KHz) 其中、持续时间为 500ns
    2. 该触发条件应启动 A BCDMA 写入传输 最终目的 MCSPI4、CH0
    3. 完成 (2) 后、另一个 PKTDMA/PDMA 读取通道 亮起 MCSPI4、CH0 应通过 DMA 读取请求自动触发。
    4. 同时、(2) 的完成应触发另一个 BCDMA 写入传输 一个单独的通道上传输 MCSPI4、CH1
    5. 这反过来应该会自动触发另一个触发器 PKTDMA/PDMA 读取通道 亮起 MCSPI4、CH1 读取请求端口号。
    6. 之后 32 次 SPI4-CH1 读取 、将生成一个中断、此时将处理收集到的数据。

    我们已经知道如何实施要点 (3) 和要点 (5)。 我相信我已经从 (1) 成功触发 (2)。 我现在的主要问题是: 如何通过 (2) 触发 (4)?

    总之、我们使用四个 DMA 通道:

    • 2 个 BCDMA-PDMA 通道
    • 2 个 PKTDMA-PDMA 通道

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

    您好 Angel、

    您能否通过 BCDMA - PDMA SPI 确认 SPI 寄存器中写入了多少个字节?

    您能否分享您如何配置此 BCDMA -PDMA SPI 的片段?  

    在随附的上述常见问题解答中、您可以 从计时器 PWM 自动触发 DMA。

    接下来,您需要连接第二个和第四个点,这是可以通过 DMA 链.

    只能在 BCDMA 通道上更改 DMA。

    请查看下面的示例。

    C:\ti\mcu_plus_sdk_am64x_10_01_00_32\examples\drivers\UDMA\UDMA_chaining\am64x-evm

    此致、

    Anil.

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

    尊敬的 Anil:  

    我们正在尝试向 SPI 写入 16 位、因此它也可以向 ADC 输出 16 位。

    请在下面找到一些代码段、但我完全不确定这是不是正确的配置。  

    std::error_code TxEngine::Init() 
    {
        //The engine has the following setup:
        //  1. BCDMA Ch0 is coupled with PDMA McSPI4-0 TX. BCDMA Ch1 is coupled with PDMA McSPI4-1 TX  
        //  2. PKDMA Ch0 is coupled with PDMA McSPI4-0 RX, PKDMA Ch1 is coupled with PDMA McSPI4-1 RX
        //  3. DMA Ch0 is triggered from PWM of Timer0 each 7.8125us (in this case) and that triggers an McSPI write of 16 bytes to Aux SPI (TX)
        //      - The trigger signal (Timer) gets reseted (How???)
        //  4. When the TX transfer above is completed, BCDMA Ch1 is triggered and performs a  McSPI4-1 Write (TX)
        //      - At the same time, PKDMA Ch0 is triggered and reads a word from the McSPI4-0 (RX)
        //  5. When the TX transfer from (4) is completed,  PKDMA Ch1 is triggered and reads a word from the McSPI4-1 (RX)
        //  6. When (5) completes, the BCDMA Ch0 waits for the next trigger (Timer)
        //  7. When PKDMA Ch0 & Ch1 gather 32 samples, they deliver an interrupt for the application
        //      - in the interrupt routine, the processd HPDs is removed from the FQ queue and added again at the back.
        //        This ensures continuous transfer of data  
    
        //Configure BCDMA Ch0
        Udma_ChPrms chParams;
        UdmaChPrms_init(&chParams, UDMA_CH_TYPE_PDMA_TX);
        chParams.fqRingPrms.ringMem     = m_udmaCh0RingMem;
        chParams.fqRingPrms.ringMemSize = sizeof(m_udmaCh0RingMem);
        chParams.fqRingPrms.elemCnt = m_UdmaCh0TrCount;
        chParams.peerChNum = UDMA_PDMA_CH_MAIN1_MCSPI4_CH0_TX;
    
        // Open channel for TX
        int32_t retVal = UDMA_SOK;
        retVal = Udma_chOpen(m_udmaHandleBc, m_udmaCh0TxHandle, UDMA_CH_TYPE_PDMA_TX, &chParams);
        if (retVal != UDMA_SOK) {
            return std::make_error_code(TxEngine_ErrorCode::DMAChOpenError);
        }
    
        // Config TX channel
        Udma_ChTxPrms txPrms;
        UdmaChTxPrms_init(&txPrms, UDMA_CH_TYPE_PDMA_TX);
        retVal += Udma_chConfigTx(m_udmaCh0TxHandle, &txPrms);
        if (retVal != UDMA_SOK) {
            return std::make_error_code(TxEngine_ErrorCode::DMAChInitError);
        }
    
        //Configure events
        uint32_t globalEvent0 = Udma_chGetTriggerEvent(m_udmaCh0TxHandle, CSL_UDMAP_TR_FLAGS_TRIGGER_GLOBAL0);
        //Maps Timer0 PWM to the output of the Interrupt Router
        configureRouter(Config::Aux::PulseRoutingDeviceId, Config::Aux::PulseRoutingSourceIdLocal, Config::Aux::PulseRoutingTargetIdLocal);
        //Configure the L2G mapping
        configureIntaggrL2G(Config::Aux::PulseRoutingL2GId, globalEvent0);
    
        //Config the PDMA peer Channel on the McSPI side
        Udma_ChPdmaPrms pdmaPrms;
    
        UdmaChPdmaPrms_init(&pdmaPrms);
        pdmaPrms.elemSize = UDMA_PDMA_ES_16BITS;
        pdmaPrms.elemCnt = 1U;
        pdmaPrms.fifoCnt = 1U;
    
        retVal = Udma_chConfigPdma(m_udmaCh0TxHandle, &pdmaPrms);
        if (retVal != UDMA_SOK) {
            return std::make_error_code(TxEngine_ErrorCode::PDMAConfigureError);
        }
    
        retVal += Udma_chEnable(m_udmaCh0TxHandle);
        DebugP_assert(UDMA_SOK == retVal);
    
        //Submit TRPD to the TX channel
        uint64_t trpdMemPhysicalAddr = (uint64_t)Udma_defaultVirtToPhyFxn(m_udmaCh0TrMem, 0U, NULL);
        retVal = Udma_ringQueueRaw(Udma_chGetFqRingHandle(m_udmaCh0TxHandle), trpdMemPhysicalAddr);
        if (retVal != UDMA_SOK) {
            return std::make_error_code(TxEngine_ErrorCode::DMADescriptorEnqueue);
        }
    
        m_init = true;
    
        return std::error_code();
    }

    以下是成员变量的摘要:

        // For each entry in the ring, 64-bit addr
        uint8_t m_Mcspi1UdmaRxRingMemCh0[UDMA_ALIGN_SIZE(m_trCount * sizeof(uint64_t))] __attribute__((aligned(UDMA_CACHELINE_ALIGNMENT)));
        // For each entry in the HDP Memory, a CSL_UdmapCppi5HMPD structure
        uint8_t m_udmaRxHpdMem[UDMA_ALIGN_SIZE(m_trCount * (sizeof(CSL_UdmapCppi5HMPD)))] __attribute__((aligned(UDMA_CACHELINE_ALIGNMENT)));
    
        // UDMA handles
        Udma_DrvHandle m_udmaHandleBc;
    
        //BCDMA Ch0
        static constexpr uint8_t m_UdmaCh0TrCount = Config::Aux::Bcdma0RingElementCount;
        Udma_ChObject m_udmaCh0TxObject;
        Udma_ChHandle m_udmaCh0TxHandle;
        Udma_EventObject m_ch0TxEventObject;
        //Ring memory, where the TRs will be queued
        uint8_t m_udmaCh0RingMem[UDMA_ALIGN_SIZE(m_UdmaCh0TrCount*8U)] __attribute__((aligned(UDMA_CACHELINE_ALIGNMENT)));
        //Memory for the TRs themselves
        uint8_t m_udmaCh0TrMem[UDMA_GET_TRPD_TR15_SIZE(m_UdmaCh0TrCount)] __attribute__((aligned(UDMA_CACHELINE_ALIGNMENT)));
        // Dummy data to be sent to the ADC
        const std::array<uint16_t, 1> m_txData = {0xDEAD}; 
    
        //McSPI specifics
        MCSPILLD_Handle m_spiIf;

    有关事件映射的函数和常量:

    //Interrupt & L2G mapping
    //We use timer PWM events, which are router trough the Timesync Router
    const uint16_t PulseRoutingDeviceId = TISCI_DEV_TIMESYNC_EVENT_INTROUTER0;  
    //Timer0 has PWM event id 0. Consult TRM 9.5.2/Table 9-73
    const uint16_t PulseRoutingSourceIdLocal = 0;
    const uint16_t PulseRoutingTargetIdLocal = 0;
    //The above PWM event local event will be mapped to bit 0 of the L2G inputs.
    //Consult TRM 11.2.1.2.5
    const uint16_t PulseRoutingL2GId = CSLR_DMASS0_INTAGGR_0_INTAGGR_LEVI_PEND_TIMESYNC_EVENT_INTROUTER0_OUTL_0 + PulseRoutingTargetIdLocal;
    //TX Engine 0 sizes
    const uint8_t Bcdma0RingElementCount = 1;
    
    
    void TxEngine::configureRouter(uint16_t device_id, uint16_t src_index, uint16_t dst_index) {
        int32_t status;
        struct tisci_msg_rm_irq_set_req rmIrqReq;
        struct tisci_msg_rm_irq_set_resp rmIrqResp;
    
        rmIrqReq.valid_params = TISCI_MSG_VALUE_RM_DST_ID_VALID | TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID;
        rmIrqReq.src_id = device_id;
        rmIrqReq.dst_id = device_id;
        rmIrqReq.src_index = src_index;
        rmIrqReq.dst_host_irq = dst_index;
        rmIrqReq.secondary_host = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
        status = Sciclient_rmIrqSetRaw(&rmIrqReq, &rmIrqResp, SystemP_WAIT_FOREVER);
    
        if (status != SystemP_SUCCESS) {
            DebugP_log("[Error] Sciclient_rmIrqSetRaw() returned %d.\r\n", status);
            DebugP_log("rmIrqReq.src_id = %d, ", rmIrqReq.src_id);
            DebugP_log("rmIrqReq.src_index = %d, ", rmIrqReq.src_index);
            DebugP_log("dst_host_irq = %d.\r\n", rmIrqReq.dst_host_irq);
        }
    }
    
    void TxEngine::configureIntaggrL2G(uint32_t localEvent, uint32_t globalEvent) {
        uint32_t eventRegOffset = CSL_DMASS0_INTAGGR_L2G_BASE + (localEvent * 0x20U);
        CSL_REG32_WR(eventRegOffset, (1U << 31U) | (globalEvent & 0xFFFFU));
    }

    我还不确定的是如何配置 TR、以便在每个 PWM 脉冲上重复传输、因此让我发布 TR 配置:

    void TxEngine::udmaTxTrInit(uint8_t* pTrMem, uint32_t cqRingNum, const void* srcBuf, uint32_t length)
    {
        //One TRPD (Transfer Packet Descriptor) can have multiple TRs (Transfer Request)
        //Make TRPD with TR15 TR type, size is 1 TR
        UdmaUtils_makeTrpdTr15(pTrMem, 1U, cqRingNum);
        //Set infinte reload count
        CSL_udmapCppi5TrSetReload((CSL_UdmapCppi5TRPD *)pTrMem, 0x1FFU, 0U);
    
        //Get a pointer to the firs t TR in the TRPD and set the TR parameters
        CSL_UdmapTR15* pTr = UdmaUtils_getTrpdTr15Pointer(pTrMem, 0U);
        pTr->flags    = CSL_FMK(UDMAP_TR_FLAGS_TYPE, CSL_UDMAP_TR_FLAGS_TYPE_1D_DATA_MOVE);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_STATIC, 0U);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_EOL, CSL_UDMAP_TR_FLAGS_EOL_MATCH_SOL_EOL);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_EVENT_SIZE, CSL_UDMAP_TR_FLAGS_EVENT_SIZE_COMPLETION);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER0, CSL_UDMAP_TR_FLAGS_TRIGGER_GLOBAL0);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER0_TYPE, CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ICNT1_DEC);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER1, CSL_UDMAP_TR_FLAGS_TRIGGER_NONE);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER1_TYPE, CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_CMD_ID, 0x25U);  /* This will come back in TR response */
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_SA_INDIRECT, 0U);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_DA_INDIRECT, 0U);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_EOP, 1U);
    
        pTr->icnt0    = length;
        pTr->icnt1    = 1U;
        pTr->icnt2    = 1U;
        pTr->icnt3    = 1U;
        pTr->dim1     = pTr->icnt0;
        pTr->dim2     = 0U;
        pTr->dim3     = 0U;
        pTr->addr     = (uint64_t) Udma_defaultVirtToPhyFxn(srcBuf, 0U, NULL);
        pTr->fmtflags = 0x00000000U;
    
        pTr->dicnt0   = 0;
        pTr->dicnt1   = 0;
        pTr->dicnt2   = 0;
        pTr->dicnt3   = 1U;
        pTr->ddim1    = pTr->dicnt0;
        pTr->ddim2    = 0U;
        pTr->ddim3    = 0U;
    
        //Perform cache writeback for 1 TR 
        CacheP_wb(pTrMem, UDMA_GET_TRPD_TR15_SIZE(1), CacheP_TYPE_ALLD);
    
        return;
    }

    关于链:是的,我知道这个例子,这是一个好消息,它也是可能的我们的用例. 然而、我首先想要有一个稳定的解决方案、它在一个通道上重复传输、然后进行下一步并链接下一个通道传输。

    谢谢、此致!

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

    您好 Angel、

    我需要 BCDMA - PDMA TR 描述符的代码片段。

    此致、

    Anil.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引述 userid=“584118" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read/5821126 #5821126“]

    我还不确定的是如何配置 TR、以便在每个 PWM 脉冲上重复传输、因此让我发布 TR 配置:

    [/报价]

    这里我可以帮助您完成该操作...我们已经有了基于 GPIO 触发 DMA 的示例、在这里我们需要将输入更改为计时器 PWM、这是可以实现的。  

    但是、您已经确认 BCDMA - PDMA 部件正常工作。

    所以、我对您如何配置此 TR 描述符很好奇 ?

    只需在此 TR 中获取 memcpy TRPD、传递 SPI 的源地址并配置 DMA 大小为 2 字节?

    或获取 HPD 并为其配置 DMA 长度和其他参数、

    因为如果使用第一种方法、存储器 TRPD 不支持触发 16 位数据、至少 DMA 需要超小大小来传输数据。

    我记得这个最小值主要是 64 字节。

    如果使用第二种方法 HPD、那么还能传输最小字节。

    我对您如何配置 BCDMA - SPI TR 描述符感到好奇 

    Memcpy 描述符:  

    HPD 描述符:  

    此致、

    Anil.

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

    尊敬的 Anil:

    我开始觉得我对这里的做法完全错了。 我首先要尝试的是传输 A 16 位值 连接到 McSPI 接口 在中 周期性方式(每个 7.8125µs)

    您能否确认以下顺序是否正确?

    0) 这应该可以通过耦合实现 BCDMA PDMA 对等器件 、已连接到 McSPI4、Ch0

    1) 初始化并打开 A BCDMA 通道 一种类型 UDMA_CH_TYPE_PDMA_TX

        //Configure BCDMA Ch0
        Udma_ChPrms chParams;
        UdmaChPrms_init(&chParams, UDMA_CH_TYPE_PDMA_TX);
        chParams.fqRingPrms.ringMem     = m_udmaCh0RingMem;
        chParams.fqRingPrms.ringMemSize = sizeof(m_udmaCh0RingMem);
        chParams.fqRingPrms.elemCnt = m_UdmaCh0TrCount;
        chParams.peerChNum = UDMA_PDMA_CH_MAIN1_MCSPI4_CH0_TX;
    
        // Open channel for TX
        int32_t retVal = UDMA_SOK;
        retVal = Udma_chOpen(m_udmaHandleBc, m_udmaCh0TxHandle, UDMA_CH_TYPE_PDMA_TX, &chParams);
        if (retVal != UDMA_SOK) {
            return std::make_error_code(TxEngine_ErrorCode::DMAChOpenError);
        }
    
        // Config TX channel
        Udma_ChTxPrms txPrms;
        UdmaChTxPrms_init(&txPrms, UDMA_CH_TYPE_PDMA_TX);
        retVal += Udma_chConfigTx(m_udmaCh0TxHandle, &txPrms);
        if (retVal != UDMA_SOK) {
            return std::make_error_code(TxEngine_ErrorCode::DMAChInitError);
        }
    

    2) 从中映射事件 DMTIMER0 加载到初始化状态 BCDMA 通道 以便计时器定期触发 DMA 传输。 这涉及:

        //Configure events
        uint32_t globalEvent0 = Udma_chGetTriggerEvent(m_udmaCh0TxHandle, CSL_UDMAP_TR_FLAGS_TRIGGER_GLOBAL0);
        //Maps Timer0 PWM to the output of the Interrupt Router
        configureRouter(Config::Aux::PulseRoutingDeviceId, Config::Aux::PulseRoutingSourceIdLocal, Config::Aux::PulseRoutingTargetIdLocal);
        //Configure the L2G mapping
        configureIntaggrL2G(Config::Aux::PulseRoutingL2GId, globalEvent0);

    3) 配置 PDMA 通道对等器件 将在此 BCDMA 通道上使用的占空比:

        //Config the PDMA peer Channel on the McSPI side
        Udma_ChPdmaPrms pdmaPrms;
    
        UdmaChPdmaPrms_init(&pdmaPrms);
        pdmaPrms.elemSize = UDMA_PDMA_ES_16BITS;
        pdmaPrms.elemCnt = 1U;
        pdmaPrms.fifoCnt = 0U;
    
        retVal = Udma_chConfigPdma(m_udmaCh0TxHandle, &pdmaPrms);
        if (retVal != UDMA_SOK) {
            return std::make_error_code(TxEngine_ErrorCode::PDMAConfigureError);
        }
    
        retVal += Udma_chEnable(m_udmaCh0TxHandle);
        DebugP_assert(UDMA_SOK == retVal);

    4) 配置 传输请求 (TR) 并将其发送至 BCDMA 通道

        //Submit TRPD to the TX channel
        uint64_t trpdMemPhysicalAddr = (uint64_t)Udma_defaultVirtToPhyFxn(m_udmaCh0TrMem, 0U, NULL);
        retVal = Udma_ringQueueRaw(Udma_chGetFqRingHandle(m_udmaCh0TxHandle), trpdMemPhysicalAddr);
        if (retVal != UDMA_SOK) {
            return std::make_error_code(TxEngine_ErrorCode::DMADescriptorEnqueue);
        }

    5) TR 自身:

    void TxEngine::udmaTxTrInit(uint8_t* pTrMem, uint32_t cqRingNum, const void* srcBuf, uint32_t length)
    {
        //One TRPD (Transfer Packet Descriptor) can have multiple TRs (Transfer Request)
        //Make TRPD with TR15 TR type, size is 1 TR
        UdmaUtils_makeTrpdTr15(pTrMem, 1U, cqRingNum);
        //Set infinte reload count
        CSL_udmapCppi5TrSetReload((CSL_UdmapCppi5TRPD *)pTrMem, 0x1FFU, 0U);
    
        //Get a pointer to the firs t TR in the TRPD and set the TR parameters
        CSL_UdmapTR15* pTr = UdmaUtils_getTrpdTr15Pointer(pTrMem, 0U);
        pTr->flags    = CSL_FMK(UDMAP_TR_FLAGS_TYPE, CSL_UDMAP_TR_FLAGS_TYPE_1D_DATA_MOVE);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_STATIC, 0U);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_EOL, CSL_UDMAP_TR_FLAGS_EOL_MATCH_SOL_EOL);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_EVENT_SIZE, CSL_UDMAP_TR_FLAGS_EVENT_SIZE_COMPLETION);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER0, CSL_UDMAP_TR_FLAGS_TRIGGER_GLOBAL0);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER0_TYPE, CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ICNT1_DEC);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER1, CSL_UDMAP_TR_FLAGS_TRIGGER_NONE);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER1_TYPE, CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_CMD_ID, 0x25U);  /* This will come back in TR response */
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_SA_INDIRECT, 0U);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_DA_INDIRECT, 0U);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_EOP, 1U);
    
        pTr->icnt0    = length;
        pTr->icnt1    = 1U;
        pTr->icnt2    = 1U;
        pTr->icnt3    = 1U;
        pTr->dim1     = pTr->icnt0;
        pTr->dim2     = 0U;
        pTr->dim3     = 0U;
        pTr->addr     = (uint64_t) Udma_defaultVirtToPhyFxn(srcBuf, 0U, NULL);
        pTr->fmtflags = 0x00000000U;
    
        pTr->dicnt0   = 0;
        pTr->dicnt1   = 0;
        pTr->dicnt2   = 0;
        pTr->dicnt3   = 1U;
        pTr->ddim1    = pTr->dicnt0;
        pTr->ddim2    = 0U;
        pTr->ddim3    = 0U;
    
        //Perform cache writeback for 1 TR 
        CacheP_wb(pTrMem, UDMA_GET_TRPD_TR15_SIZE(1), CacheP_TYPE_ALLD);
    
        return;
    }

    6.配置 DMTIMER 以生成所需的 PWM 信号。 我已经对此进行了设置、可以在示波器上看到 PWM 信号生成正确。

    6.启用 McSPI4 然后启动 DMTIMER 。 此时、 DMA 应被触发 并至少执行 第一个传输请求 (TR)

    顺便说一下、BCDMA 不支持 HPD、仅支持 TRD、如多个文档中所述(可根据要求提供参考资料)。 HPD 专用于 PKTDMA、据我所知、PKTDMA 不支持通过计时器或事件触发、而只能通过 PSI-L 触发

    [引述 userid=“525901" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read/5821166 #5821166“]

    但是、您已经确认 BCDMA - PDMA 部件正常工作。

    [/报价]

    我从来没有说过这一点。 我确认了 PKTDMA-PDMA 在配置 PKTDMA-McSPI0 中工作、其中 McSPI0 设置为在外设模式下运行。 但是、在这种情况下、不需要外部触发。

    在这里、我可以帮助您完成这些操作...我们已经有了基于 GPIO 触发 DMA 的示例、在这里我们需要将输入更改为计时器 PWM、这是可以实现的。  [/报价]

    我会很高兴,如果你能提供 正常工作 BCDMA-PDMA 示例 而不是 标准 BCDMA Mem2Mem 水平。 这将真正帮助我了解如何将两者结合起来。  

    谢谢!

    此致、  

    Angel  

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

    同时、我重新配置了 BCDMA 以使用软件触发、传输从软件触发开始。 这意味着、问题在于触发。 我还有另一个问题、即 SPI 传输仅在每秒触发时开始。 总之、以下 问题保持开放状态:

    • 触发器配置有什么问题
    • 为什么每秒触发器而不是每次触发器执行 TR?  
    • 如何配置 BCDMA 链? 据我所知、这是通过 UDMA_chSetChaining 函数完成的、但我不清楚的是:触发通道何时触发链接的通道? 如何对触发和触发通道的 TR 进行编程、从而使链成功?

    谢谢、此致!

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

    因此,进一步的进展。 我想,我是真的爱你。 ICnt   TR 中的字段位于中  字节、  条件一样  FMtflags  (格式化/重新格式化选项)为 0。 现在、我看到 SPI 按预期传输数据。 我找到了困难的方法: 数据显然必须对齐、并将煤渣冲回原处 ,否则你会偶尔得到垃圾数据:

    //Flush the dummy data to memory
    CacheP_wb(&m_txData, sizeof(m_txData), CacheP_TYPE_ALLD);
    

    现在有 2 个问题需要解决:

    • 进行触发
    • 链接

    尽管设置了链接、但链接似乎不起作用:

        //Chain both channels   
        int32_t retVal = Udma_chSetChaining(m_udmaChTxHandles[0], 
                                            m_udmaChTxHandles[1], 
                                            CSL_UDMAP_TR_FLAGS_TRIGGER_GLOBAL0);

    第二个通道的配置方式与第一个通道完全相同、只是对等器件是另一个通道:

        Udma_ChPrms chParams;
        UdmaChPrms_init(&chParams, UDMA_CH_TYPE_PDMA_TX);
        chParams.fqRingPrms.ringMem = m_udmaChRingMem[chIndex];
        chParams.fqRingPrms.ringMemSize = sizeof(m_udmaChRingMem[chIndex]);
        chParams.fqRingPrms.elemCnt = m_UdmaChTrCount;
        chParams.peerChNum = (chIndex == 0) ? UDMA_PDMA_CH_MAIN1_MCSPI4_CH0_TX : UDMA_PDMA_CH_MAIN1_MCSPI4_CH1_TX;

    理论上、完成第一个通道的 TR 后、应由此触发第二个通道、但目前在 SPI 接口上看不到任何东西、第二个通道应输出数据。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid=“525901" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read/5815408 #5815408“]

    MCSPI 以 PKTDMA 方式与 DMA 一起使用、该 PKTDMA 不应加载无限次 TR、不能连续触发 DMA 事件。  

    在这里、您需要使用 BCDMA、这是可能的、在 MCU+SDK 中、我们不支持具有 BCDMA 通道的 MCSPI。

    如果我们使用 BCDMA 通道配置 MCSPI ,您的要求可以通过 DMA 自动触发器来实现。

    此外、DMA 根据 GPIO 输入触发、这可以使用 BCDMA 实现。

    [/报价]

    您好 Angel、

    我认为 在 MCU+SDK 示例中、不支持具有 PDMA 配置的 BCDMA。

    AM62A 器件上的 MCASP 使用 BCDMA + PDMA 应用。

    您需要对 MCSPI 上的 BCDMA + PDMA 实施相同的方法...

    如果这样做有效、一切都 是可能的、 例如从计时器 PWM 触发 DMA、BCDMA 通道也支持 DMA 更改。

    可 按如下示例完成 BCDMA 和 PDMA 配对的 TR 描述符。

    C:\ti\mcu_plus_sdk_am62ax_10_00_00_14\source\drivers\McASP\v1

    此致、

    Anil.

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

    尊敬的 Anil:

    我不确定您何时发布您的回复。 请查看我在 2025 年 5 月 16 日和今天的最新动态。 总结:

    • 我已在 MCSPI 上成功配置了 BCDMA+PDMA。
    • 软件触发器可以正常工作、但计时器触发器不会。
    • 链接 BCDMA 通道 0 -> BCDMA 通道 1 不起作用

    [报价 userid=“525901" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read/5828403 #5828403“]

    如果这样做有效、一切都 是可能的、 例如从计时器 PWM 触发 DMA、BCDMA 通道也支持 DMA 更改。

    [/报价]

    是的,我理解这 是可能的—我的问题是我在做什么错。 请再次浏览我的两个最新帖子、如果您有任何想法、我会很高兴听到它们。

    谢谢!

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

    您好 Angel、

    这里的问题是 TR ,当我们将 PDMA 与 BCDMA 对结合时,我们不需要指定 MCSPI 的目标地址或源地址,因为源地址或目标地址始终是 MCSPI 地址,该地址应由 PDMA 处理。

    您已将 TYPE15 TR 修改为简单的数据传输。 我们已经有 MCASP 的 BCDMA +PDMA 对。

    尝试使用相同的 TR、一旦正常工作、我就可以帮助您完成其余步骤、因为类型 3 格式已存在并在 MCASP 应用程序中使用。

     将来、您不会看到任何问题、而是更改为 15 类。  

    如果没有正确的 TR 配置,花费时间与他人是不正确的过程.

    因此,一旦您启用了上述 MCASP 模式的 BCDMA + PDMA 对,请告诉我,我可以进一步帮助您...

    此致、

    Anil.

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

    尊敬的 Anil:

    只是为了澄清、因为我想确保我们在同一个页面上:

    1. 我将一个 ADC 连接到 McSPI4 CH0 和 CH1、SoC 在多通道控制器模式下运行。
    2. 我正在使用计时器生成 128kHz PWM 信号、该信号应触发 16 位 DMA 写入 —首先在 CH0 上、然后在 CH1 上。 我使用两个 BCDMA+PDMA 通道对实现了这一点。 第一个通道触发 DMA、以写入 McSPI CH0、完成后、第二个 DMA 通道从第一个通道触发、并将 16 位数据写入 McSPI CH1。
    3. 我已配置两个额外的 BCDMA+PDMA 对(一个用于 McSPI CH0、一个用于 McSPI CH1)、这些对将由来自相应 McSPI 通道的 McSPI DMAR 进行触发。 DMAR 在接收时生成、这是 (2) 的结果。

    让我们重点关注 (2)、因为我认为其余部分易于实施。

    同样、TX 方向 (BCDMA+PDMA、McSPI4 TX) 运行良好。 我已在示波器上验证过这一点—数据存在且正确。 如果需要、我可以共享示波器的屏幕截图。

    下面是我的 TR 设置程序 对于两个 McSPI4 TX 通道 (McSPI4 CH0、McSPI4 CH1):

    void TxEngine::udmaTxTrInit(uint8_t* pTrMem, uint32_t cqRingNum, const void* srcBuf, uint32_t length)
    {
        //One TRPD (Transfer Packet Descriptor) can have multiple TRs (Transfer Request)
        //Make TRPD with TR15 TR type, size is 1 TR
        UdmaUtils_makeTrpdTr15(pTrMem, 1U, cqRingNum);
        //Set infinte reload count
        CSL_udmapCppi5TrSetReload((CSL_UdmapCppi5TRPD *)pTrMem, 0x1FFU, 0U);
    
        //Get a pointer to the firs t TR in the TRPD and set the TR parameters
        CSL_UdmapTR15* pTr = UdmaUtils_getTrpdTr15Pointer(pTrMem, 0U);
        pTr->flags    = CSL_FMK(UDMAP_TR_FLAGS_TYPE, CSL_UDMAP_TR_FLAGS_TYPE_1D_DATA_MOVE);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_STATIC, 0U);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_WAIT, 1);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_EOL, CSL_UDMAP_TR_FLAGS_EOL_MATCH_SOL_EOL);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_EVENT_SIZE, CSL_UDMAP_TR_FLAGS_EVENT_SIZE_COMPLETION);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER0, CSL_UDMAP_TR_FLAGS_TRIGGER_GLOBAL0);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER0_TYPE, CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER1, CSL_UDMAP_TR_FLAGS_TRIGGER_NONE);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER1_TYPE, CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_CMD_ID, 0x25U);  /* This will come back in TR response */
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_SA_INDIRECT, 0U);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_DA_INDIRECT, 0U);
        pTr->flags   |= CSL_FMK(UDMAP_TR_FLAGS_EOP, 1U);
    
        pTr->icnt0    = length;
        pTr->icnt1    = 0;
        pTr->icnt2    = 0U;
        pTr->icnt3    = 0U;
        pTr->dim1     = 0;
        pTr->dim2     = 0U;
        pTr->dim3     = 0U;
        pTr->addr     = (uint64_t) Udma_defaultVirtToPhyFxn(srcBuf, 0U, NULL);
        pTr->fmtflags = 0x00000000U;
    
        pTr->dicnt0   = 0;
        pTr->dicnt1   = 0;
        pTr->dicnt2   = 0;
        pTr->dicnt3   = 0;
        pTr->ddim1    = 0;
        pTr->ddim2    = 0U;
        pTr->ddim3    = 0U;
    
        
        //Perform cache writeback for 1 TR 
        CacheP_wb(pTrMem, UDMA_GET_TRPD_TR15_SIZE(1), CacheP_TYPE_ALLD);
        CacheP_wb(&m_txData, sizeof(m_txData), CacheP_TYPE_ALLD);
    
        return;
    }

    行:

    • ptr->addr =(uint64_t) UDMA_defaultVirtToPhyFxn (srcBuf、0U、NULL);

    指定要通过 SPI 接口发送以触发 ADC 输出其数据的虚拟数据的地址。

    不起作用的是:

    • 通过 DMTIMER 的 PWM 触发第一个 TX BCDMA 通道。 我怀疑配置或事件路由不正确。
    • 链接两个 BCDMA TX 通道。 不幸的是、我不知道这里可能会出现什么问题。

    我希望这能澄清一下情况。

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

    只是另一个澄清 — 我很确定,问题是 DMTIMER0 和 BCDMA L2G 之间的事件路由。 阈值 非常重要 注意:  

    • 我们正在运行 Linux (TI 的 Arago、  Linux 版本 6.12.13-ti-00557-g7a3dfd6311f6-dirty)、略微适合我们的电路板
    • 在并行模式中、我们使用 R5 二进制文件并让 rproc 驱动程序将其加载到 R50-0 上
    • R5 固件开始时有一个白色 (1) 循环、因此我可以使用 XDS200 对其进行调试

    我想是这样的 可能会不同 会造成 SYSFW 和中断路由出现问题、因为 R5 和 Linux 的 SYSFW 版本略有不同。  

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

    您好 Angel、

    我可以在几个小时内提供答复..

    此致、

    Anil.

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

    您好 Angel、

    [引述 userid=“584118" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read/5828499 #5828499“]
    • 通过 DMTIMER 的 PWM 触发第一个 TX BCDMA 通道。 我怀疑配置或事件路由不正确。
    [/报价]

    对于问题 1、您能否确认使用了正确的参数来配置 L2G 和 DMA 中断?

    此外、您能否确认 BCDMA 通道配对已配置、 然后您是否在 MCSPI 驱动程序中禁用了 HPD 描述符 init?

    如果您已配置以下参数但仍然无法正常工作、请告知我。

    首先、我们可以解决问题 1、稍后我们可以检查 issue2。

    偶数 INTR 路由器输出的时间同步与所有内核共享。 因此、无需更改任何板配置文件。

    请看下面的图片。

    计时器 PWM 中断配置:  

    禁用计时器 PWM 的中断。

    为此,您需要禁用 PWM 寄存器中的中断,并使用 hw_ip_deconstruct API 取消注册 VIC 模块中的计时器 PWM 中断。

    L2G 配置:  

    此处应在 0 和 7 之间使用本地 2 个全局事件。

    因此、localEvent 必须配置为 8。

    static void configure_intaggrL2G(uint32_t localEvent, uint32_t globalEvent)
    {
    uint64_t eventRegOffset = CSL_DMASS0_INTAGGR_L2G_BASE + (localEvent * 0x20U);
    CSL_REG64_WR(eventRegOffset, ( (1U << 31U) | (globalEvent & 0xFFFFU) ) ); /* Level event */
    }
    
    

    DMA 互连配置:  

    需要使用以下配置来生成到 DMA 的中断。

        rmIrqReq.src_id                 = TISCI_DEV_TIMESYNC_EVENT_INTROUTER0;
        rmIrqReq.src_index              = 0U;
    
        rmIrqReq.dst_id                 = TISCI_DEV_DMASS0_INTAGGR_0;
        rmIrqReq.dst_host_irq           = 8U;

    此致、

    Anil.

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

    尊敬的 Anil:

    [引述 userid=“525901" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read/5831035 #5831035“]

    对于问题 1、您能否确认使用了正确的参数来配置 L2G 和 DMA 中断?

    此外、您能否确认 BCDMA 通道配对已配置、 然后您是否在 MCSPI 驱动程序中禁用了 HPD 描述符 init?

    如果您已配置以下参数但仍然无法正常工作、请告知我。

    [/报价]

    在这里、我可以确认 McSPI 驱动程序在初始化后不使用任何 DMA 传输。 请参阅下面由 SysConfig 生成的配置。

        {
            .inputClkFreq                = 50000000,
            .intrNum                     = 207,
            .operMode                    = MCSPI_OPER_MODE_POLLED,
            .intrPriority                = 4U,
            .chMode                      = MCSPI_CH_MODE_MULTI,
            .pinMode                     = MCSPI_PINMODE_4PIN,
            .initDelay                   = MCSPI_INITDLY_0,
            .multiWordAccess             = FALSE,
            .msMode                      = MCSPI_MS_MODE_CONTROLLER,
            .chEnabled                   = {TRUE, TRUE, FALSE, FALSE},
            .mcspiDmaHandle              = NULL,
            .chObj[0].chCfg              = &gAuxMcspi4ChCfg[0],
            .chObj[0].dmaChCfg           = NULL,
            .chObj[0].dmaChConfigNum     = 0,
            .chObj[1].chCfg              = &gAuxMcspi4ChCfg[1],
            .chObj[1].dmaChCfg           = NULL,
            .chObj[1].dmaChConfigNum     = 0,
            .clockP_get                  = ClockP_getTicks,
            .transferCallbackFxn         = NULL,
            .errorCallbackFxn            = NULL,
        },

    在这里您可以看到

    • .mcspiDmaHandle = NULL、

    之后不会进行 DMA 初始化。 此外、我可以确认、BCDMA+PDMA 与软件触发配合得很好、但不适用于 DMTIMER PWM 触发。

    [引述 userid=“525901" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read/5831035 #5831035“]

    计时器 PWM 中断配置:  

    禁用计时器 PWM 的中断。

    为此,您需要禁用 PWM 寄存器中的中断,并使用 hw_ip_deconstruct API 取消注册 VIC 模块中的计时器 PWM 中断。

    [/报价]

    在这里、DMTIMER0 配置为不使用中断、但我将实施您的建议、以防出现以下情况:

    同样、计时器会生成所需的 PWM 信号。 我可以在输出引脚上看到该示波器图像、可以根据要求提供示波器图像。

    [引述 userid=“525901" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read/5831035 #5831035“]

    L2G 配置:  

    此处应在 0 和 7 之间使用本地 2 个全局事件。

    因此、localEvent 必须配置为 8。

    [/报价]

    劳驾  小心 阅读我的帖子(这个)、您会发现、我们已经配置了 L2G。 我将再次发布它,这一次与 vars 替换为 ID ,所以它是更容易为你检查是否结肠:

        // Configure events
        uint32_t globalEvent = Udma_chGetTriggerEvent(m_udmaChTxHandles[chIndex], CSL_UDMAP_TR_FLAGS_TRIGGER_GLOBAL0);
        configureRouter(TISCI_DEV_TIMESYNC_EVENT_INTROUTER0, 0, 0);
        configureIntaggrL2G(CSLR_DMASS0_INTAGGR_0_INTAGGR_LEVI_PEND_TIMESYNC_EVENT_INTROUTER0_OUTL_0+0, globalEvent);

    [引述 userid=“525901" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read/5831035 #5831035“]

    DMA 互连配置:  

    需要使用以下配置来生成到 DMA 的中断。

    [/报价]

    实现  我敢不同意、  当然,我也不会放过你的。“ 在我解释文档的方式中、这必须是一个两步过程:

    首先、配置相应的路由器(在本例中为 Timesync)、将 PWM 中断从 DMTIMER 路由到其本地事件输出之一(转至 L2G)。 在这种情况下、DMTIMER PWM0 (0) 应路由到本地事件 0。 第二步是配置 L2G 以将本地事件 8 映射到全局 Event0 占空比。 我认为您建议的配置不正确

     rmIrqReq.src_id                 = TISCI_DEV_TIMESYNC_EVENT_INTROUTER0;
        rmIrqReq.src_index              = 0U;
    
        rmIrqReq.dst_id                 = TISCI_DEV_DMASS0_INTAGGR_0;
        rmIrqReq.dst_host_irq           = 8U;

    这毫无意义、因为这些连接很难实现:

    所以,我声称,我在上面的代码所做的是正确的,但如果不是,请纠正我。 此外,  你的同事 Sahin Okur 的这个职位 使我认为是正确的。 在同一个帖子中有一个 PowerPoint 演示文稿、它解释了这些步骤、但通过 IEP 比较。

    请评论以上想法。

    谢谢!

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

    您好 Angel、

    请遵循我的建议、看看上述方法是否有效。

    上述方法不仅与您和其他已尝试过的客户共享、而且适用于他们。

    不过、 如果上述 MCSPI 不使用 DMA、我还没有说明如何配置 PDMA 通道初始化。

    以上的 TRPD INIT 是唯一的 BCDMA 通道 INIT、那么 PDMA INIT 呢? 你在做什么?

    之后,按照我的建议,仍然如果你遇到任何问题请让我知道。我可以帮助你...

    此致、

    Anil.

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

    尊敬的 Anil:

    根据您的上述建议:

    正如预期的那样、它不起作用、因为 SciClient 返回了一个错误:

    以下是对 SciClient 的请求的值:

    ...和客户的回应:

    我  没想到  您可以使用 SciClient、在这种情况下、路由应在 TimesyncEventRouter 本身中进行、即。

    • 来自  TimesyncEventRouter 的 Input 0 (DMTIMER0)<-> LocalEvent0  

    请提出建议。

    [引述 userid=“525901" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read/5832986 #5832986“]

    不过、 如果上述 MCSPI 不使用 DMA、我还没有说明如何配置 PDMA 通道初始化。

    以上的 TRPD INIT 是唯一的 BCDMA 通道 INIT、那么 PDMA INIT 呢? 你在做什么?

    [/报价]

    请检查以下代码:

    std::error_code TxEngine::configureUdmaPair(uint8_t chIndex) {
        Udma_ChPrms chParams;
        UdmaChPrms_init(&chParams, UDMA_CH_TYPE_PDMA_TX);
        chParams.fqRingPrms.ringMem = m_udmaChRingMem[chIndex];
        chParams.fqRingPrms.ringMemSize = sizeof(m_udmaChRingMem[chIndex]);
        chParams.fqRingPrms.elemCnt = m_UdmaChTrCount;
        chParams.peerChNum = (chIndex == 0) ? UDMA_PDMA_CH_MAIN1_MCSPI4_CH0_TX : UDMA_PDMA_CH_MAIN1_MCSPI4_CH1_TX;
    
        // Open channel for TX
        int32_t retVal = Udma_chOpen(m_udmaHandleBc, m_udmaChTxHandles[chIndex], UDMA_CH_TYPE_PDMA_TX, &chParams);
        if (retVal != UDMA_SOK) {
            return std::make_error_code(TxEngine_ErrorCode::DMAChOpenError);
        }
    
        // Configure TX channel
        Udma_ChTxPrms txPrms;
        UdmaChTxPrms_init(&txPrms, UDMA_CH_TYPE_PDMA_TX);
        retVal = Udma_chConfigTx(m_udmaChTxHandles[chIndex], &txPrms);
        if (retVal != UDMA_SOK) {
            return std::make_error_code(TxEngine_ErrorCode::DMAChInitError);
        }
    
        // Configure the PDMA peer channel on the McSPI side
        Udma_ChPdmaPrms pdmaPrms;
        UdmaChPdmaPrms_init(&pdmaPrms);
        pdmaPrms.elemSize = UDMA_PDMA_ES_16BITS;
        pdmaPrms.elemCnt = 1U;
        pdmaPrms.fifoCnt = 0U;
    
        retVal = Udma_chConfigPdma(m_udmaChTxHandles[chIndex], &pdmaPrms);
        if (retVal != UDMA_SOK) {
            return std::make_error_code(TxEngine_ErrorCode::PDMAConfigureError);
        }
    
        // Configure events
        uint32_t globalEvent = Udma_chGetTriggerEvent(m_udmaChTxHandles[chIndex], CSL_UDMAP_TR_FLAGS_TRIGGER_GLOBAL0);
        // configureRouter(Config::Aux::PulseRoutingDeviceId, Config::Aux::PulseRoutingSourceIdLocal,
        //                 Config::Aux::PulseRoutingTargetIdLocal);
        configureRouterEx(Config::Aux::PulseRoutingDeviceId, TISCI_DEV_DMASS0_INTAGGR_0, 0, 8);
        configureIntaggrL2G(Config::Aux::PulseRoutingL2GId, globalEvent);
    
        retVal = Udma_chEnable(m_udmaChTxHandles[chIndex]);
        if (retVal != UDMA_SOK) {
            return std::make_error_code(TxEngine_ErrorCode::DMAChEnableError);
        }
    
        // Create and submit TRPD to the TX channel
        udmaTxTrInit(m_udmaChTrMem[chIndex], 0U, 
                     m_txData[chIndex].data(), m_txData[chIndex].size()*sizeof(m_txData[chIndex]));
        uint64_t trpdMemPhysicalAddr = (uint64_t)Udma_defaultVirtToPhyFxn(m_udmaChTrMem[chIndex], 0U, NULL);
        retVal = Udma_ringQueueRaw(Udma_chGetFqRingHandle(m_udmaChTxHandles[chIndex]), trpdMemPhysicalAddr);
        if (retVal != UDMA_SOK) {
            return std::make_error_code(TxEngine_ErrorCode::DMADescriptorEnqueue);
        }
    
        return std::error_code();
    }

    您仍然建议使用 Timesync 路由器、我的原始代码被注释掉。

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

    还有一点:  

    我已经检查了 Timesync 路由器和 L2G 的寄存器:

    • 对于 Timesync 路由器:

    来自 TRM:

    如果我读取正确、则意味着: 中断输出 0 映射到中断输入 0 (PWM0)、并启用输出。

    • 对于 L2G:

    来自 TRM:

    我正在使用的器件 GlobalEvent8. 、它与关联 Timesync 路由器输出 0 所以偏移量是 8*20h=100h 、为我们提供 L2G 寄存器地址 0x48120100。  寄存器的值 (0x8000C40C) 解码如下:

    位 31 =高电平 、表示上升沿事件检测模式

    GEVIDX = 0xC40C 、它正是 BCDMA 通道的全局事件索引:

    根据我在 TRM 中读取的内容、如果我正确地插入信息、则已正确配置 Timesync 路由器和 L2G。

    此致!

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

    您好 Angel、

     上述 L2G 设置正确。

    我认为您已直接写入寄存器以配置时间同步事件路由器输出、这只需通过 SCI 调用进行设置。

    通过下面的配置、我可以设置时间同步事件 INTR 路由器、请允许我呆一两天。

    我想看看为什么我们能够触发 DMA。

    void Sciclient_gpioIrqSet(void)
    {
        int32_t                             retVal;
        struct tisci_msg_rm_irq_set_req     rmIrqReq;
        struct tisci_msg_rm_irq_set_resp    rmIrqResp;
    
    
        rmIrqReq.valid_params           = 0U;
        rmIrqReq.valid_params          |= TISCI_MSG_VALUE_RM_DST_ID_VALID;
        rmIrqReq.valid_params          |= TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID;
        rmIrqReq.global_event           = 0U;
    
    
        rmIrqReq.src_id                 = TISCI_DEV_TIMER0;
        rmIrqReq.src_index              = 0U;
    
        //TISCI_DEV_GPIO1
        rmIrqReq.dst_id                 = TISCI_DEV_DMASS0_INTAGGR_0;
        rmIrqReq.dst_host_irq           = 8U;
    
    
        rmIrqReq.ia_id                  = 0U;
        rmIrqReq.vint                   = 0U;
        rmIrqReq.vint_status_bit_index  = 0U;
        rmIrqReq.secondary_host         = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
    
        retVal = Sciclient_rmIrqSet(&rmIrqReq, &rmIrqResp, SystemP_WAIT_FOREVER);
        if(0 != retVal)
        {
            DebugP_log("[Error] Sciclient event config failed!!!\r\n");
            DebugP_assert(FALSE);
        }
    
        return;
    }

    此致、

    Anil.

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

    尊敬的 Anil:

    我将已发布标记  为已解决 PE 错误、如果可以、请取消解决。  我会尝试您对星期一的建议,直到那时,我不能说它是否正常工作。

    我认为您已直接写入寄存器以配置时间同步事件路由器输出、这只需通过 SCI 调用进行设置。

    我只使用了 SciClient 函数(如果您) 小心  通过源代码、您将看到 functino  configureRouter 顺便说一下、它再次取自另一个 TI 支持工单。

    [引述 userid=“525901" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read/5836338 #5836338“]

    通过下面的配置、我可以设置时间同步事件 INTR 路由器、请允许我呆一两天。

    [/报价]

    这是什么意思? 您是否成功触发了某些 DMA 通道? 如果没有、如何知道您成功设置了 TSR?

    跟进:

    我测试了您的建议、它显然是正确设置了 IR 路由、如寄存器值所示。 但是、我仍然没有看到 DMA 通道被触发。  


    此致、

    Angel  

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

    尊敬的 Anil:

    感谢您对此进行详细说明。 我尝试了你的代码,并有以下备注:

    经过少量修改、我便能够在所用的评估板 (TMDS64EVM) 上运行代码。 由于我们正在引导 Linux、因此存在一些资源冲突。
    代码确实运行过;但是、正如您所指出的、我在大多数时候都遇到了数据损坏错误。

    之后我做了什么:

    • 我在定制电路板上运行代码、观察到几乎相同的行为。 主要问题是 DMA 传输被触发、但出于某种原因、仅触发了一次。
    • 我修改了代码以使用 BC 传输而不是 BCDMA-PDMA、然后使用与上述相同的 1D-TR 再次运行代码。 正如预期的那样、未发生触发。
    • 我做了进一步的修改并使用了项目的 TR 设置。 通过这一更改、我可以周期性地看到 BCDMA 传输触发器、但我尚未检查源数据和目标数据是否匹配。
    • 最后、我再次修改了源、返回到 BCDMA-PDMA 组合并使用 4D 传输 TR。 但是、这次根本没有触发 DMA。

    请您尝试使用 BCDMA-PDMA 组合。 我可以提供源代码,但你已经有它在前面的帖子. 我强烈怀疑我遇到的问题与两个因素有关:

    1. BCDMA-PDMA 组合、手动触发、但不在外部触发时触发。
    2. TR 设置—我看不到为什么 4D 传输会成功触发、但一维 TR 不会成功触发。

    如果您能为我们提供一个、将会非常有帮助 正常工作 A 的示例 一维 TR 因为这是我们大部分时间的目标。

    提前感谢您!

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

    尊敬的 Anil:

    我认为可以继续进行 4-D 转移、我目前正在研究  11.1.3.3.2.1 线性寻址(正向)。  这就是与 4D 传输一起使用的算法、对吧?

    此致!

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

    您好 Angel、

    [报价 userid=“584118" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read/5840584 #5840584“]
    • BCDMA-PDMA 组合、手动触发、但不在外部触发时触发。
    [/报价]

    以上是我从未尝试过的一个。 我认为、如果我们使用 BCDMA 通道、这可以根据 SOC 硬件来实现。

    请查看下面的架构。

    我认为可以继续使用 4-D 传输、我目前正在研究  11.1.3.3.2.1 线性寻址(正向)。  这就是与 4D 传输一起使用的算法、对吧?

    在 MCU+SDK 中、我们只支持 4D 传输。

    如果您需要 1D 传输、则仅配置 icnt1 并将其他 ICN 值保留为 1、以便进行 1D 传输 。

    是的,你的理解是正确的。 Liner 寻址确实在 4D 传输中。

    此致、

    Anil.

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

    尊敬的 Anil:

    [引述 userid=“525901" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read/5845248 #5845248“]

    如果您需要 1D 传输、则仅配置 icnt1 并将其他 ICN 值保留为 1、以便进行 1D 传输 。

    [/报价]

    根据 TRM 中的算法、我认为 icnt0 是计算得出的最内侧的、因此我想 icnt0 将会以字节为单位、其余的设置为 1。

    [引述 userid=“525901" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read/5845248 #5845248“]

    以上是我从未尝试过的一个。 我认为、如果我们使用 BCDMA 通道、这可以根据 SOC 硬件来实现。

    请查看下面的架构。

    [/报价]

    您是否可以尝试制作类似于我的问题的测试项目:假设:

    1. BCDMA TX 通道、绑定到通道 0 上 McSPI 多通道控制器上的 PDMA。 触发条件为 Timer0 PWM 输出

    2. BCDMA TX 通道、绑定到 Ch1 上 McSPI 多通道控制器上的 PDMA。 此通道链接到 (1) 表示 TR completion on (1) 会触发此通道

    实际上,甚至只有 (1) 就足以看到,这种组合是有效的。

    谢谢、此致!

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

    您好 Angel、

    你是正确的—这是一个拼写错误;它确实只是 inct0。

    您提出的请求超出了 MCU+SDK 的范围、我将需要专门的时间来进行研究。 目前、由于其他升级、我无法优先考虑此问题。 建议您共享 SPI BCDMA + PDMA 项目的完整示例设置。

    如果所有内容都在一个项目中、我将更轻松地查看代码。 如果不起作用、我可以在我的设置中快速重现问题并提供准确的建议。

    请遵循此方法、以便我们能够更高效地解决问题。

    仅供参考、我今天正在休假、我回来后将进一步答复。

    此致、

    Anil

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

    尊敬的 Anil:  

    好的、我将尝试在自己的  TMDS64EVM 工程中提取代码、完成后会在此处提供。

    此致!

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

    您好 Angel、

    请分享项目,一旦你完成它..

    此致、

    Anil.

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

    So Anil、

    请找到附带的承诺项目。 不幸的是、症状仍然相同—手动触发工作正常、但全局触发器无法正常工作。

    请仔细检查工程、进行彻底的调试(而不是依赖于假设)、一旦您有意见、请返回给我。

    谢谢!

    e2e.ti.com/.../bcdma_5F00_pdma_5F00_test_5F00_am64x_2D00_evm_5F00_r5fss0_2D00_0_5F00_nortos_5F00_ti_2D00_arm_2D00_clang.zip

    P.S.

    我使用 OSPI 闪存中的引导加载程序在 AM64-EVM 上运行该工程、如下所述: software-dl.ti.com/.../EVM_SETUP_PAGE.html

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

    尊敬的 Anil:

    有新消息吗?

    谢谢!

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

    您好 Angel、

    您可能会在下周收到回复。

    我可以在明天查看您的项目、并提供反馈。

    此致、

    Anil.

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

    尊敬的 Anil:

    有新消息吗?

    此致!

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

    您好 Angel、

    请注意、由于 MCU+SDK 不支持此查询、您可能会遇到回复延迟的问题。

    我将在本周结束时提供最新的状态信息、并提供相应的自豪感反馈。

    此致、

    Anil.

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

    尊敬的 Anil:

    我不太明白为什么 MCU+SDK 中不支持该查询。 如果有 UDMA(统一 DMA)驱动程序、则它应该适用于所有类型的传输和组合、除非另有说明。 到目前为止、我还没有看到任何一行说法相反的案文。

    正如我之前提到的、让您的一位同事参与其中可能会很有用、他们可以查看此案例并确认该组合是否在硬件级别工作。 否则、我们可能会提出问题。 否则、问题仍然出在 MCU+SDK 方面、这使该票证成为 MCU+SDK 支持的一部分。

    感谢您的理解!

    Angel

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

    尊敬的 Anil:  

    这已经是一周的尾声了、您是否成功地获得了一些结果?

    此致!

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

    尊敬的 Anil:

    已经有一段时间了、您是否有关于我们的问题的任何更新?

    谢谢!

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

    您好 Angel、

    我正在查看您的项目,花总时间与您的项目.

    我会尽快更新状态。

    此致、

    Anil.

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

    尊敬的 Anil:

    距离您上次答复已经有一个星期了。 您是否已经有任何想法或示例代码可以正常工作?

    谢谢!

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

    您好 Angel、

    PDMA 信道不能与类型 15 传输请求 (TR) 配对。

    因此、我继续在驱动程序中实施 3 类 TR 并验证了设置。

    我能够成功接收中断回调、这表明 3 类 TR 按预期运行。

    您能否在您的最后确认数据是否实际通过 3 型引脚传输? 验证这一点后、我们可以继续集成基于计时器的自动触发功能。

    为广泛支持此请求而对有限带宽表示歉意—还有一些正在进行的升级也需要注意。 在时间允许的情况下、我将继续给予支持。

    感谢您的理解。

    #define UDMA_GET_TRPD_TR3_SIZE (n)   (UDMA_ALIGN_SIZE (sizeof (CSL_UdmapTR3)+((n)*(sizeof (CSL_UdmapTR3)+ 4u)))
     

    static void MCSPI_udmaTrpdInit(uint8_t* pTrMem, uint32_t cqRingNum, const void* Buf, uint32_t length)
    {
    
        CSL_UdmapTR3 *pTr = NULL;
    
    
        UdmaUtils_makeTrpd(((uint8_t *) pTrMem ), UDMA_TR_TYPE_3, 1, cqRingNum);
    
    
        pTr = UdmaUtils_getTrpdTr3Pointer((uint8_t *)pTrMem , 0);
    
    
        pTr->flags = CSL_FMK(UDMAP_TR_FLAGS_TYPE, CSL_UDMAP_TR_FLAGS_TYPE_4D_DATA_MOVE);
        pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_EOP, 1U);
    
        pTr->addr = (uint8_t)Buf;
    
    
        pTr->icnt0 = (uint16_t)length;
        pTr->icnt1 = 1;
        pTr->icnt2 = 1;
        pTr->icnt3 = 1;
    
        pTr->dim1     = pTr->icnt0;
        pTr->dim2     = (pTr->icnt0 * pTr->icnt1);
        pTr->dim3     = (pTr->icnt0 * pTr->icnt1 * pTr->icnt2);
    
    
        CacheP_wb(((uint8_t *)pTrMem  ), UDMA_GET_TRPD_TR3_SIZE(1), CacheP_TYPE_ALLD);
    
    }

    /cfs-file/__key/communityserver-discussions-components-files/791/udma_5F00_utils.h

    此致、

    Anil.

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

    尊敬的 Anil:

    感谢您的答复、我需要一些时间来尝试一下。

    不幸的是,我们又在那里,我们已经在那里:类型 3 TR 工作,但没有外部触发器。 以下是我的发言:

    1) 您发布的示例可能有效,但有一些错误:  

    • 我认为 在标志中使用 CSL_UDMAP_TR_FLAGS_TYPE_4D_DATA_MOVE 是不正确的
    • ptr->addr =(uint8_t) buf 是一个错误的演员!
    • 必须设置描述符标志的其余部分、才能启用 tr0 重复

    2) 我更正了上述错误,并能够触发传输,我在 SPI 线路上看到了正确的数据,但仍然无法通过 DMTIMER0 和链 2 请求触发 DMA 请求。

    再次,我很确定,问题隐藏在 DMASS 内的事件传播,但我不能进一步调查,因为在 TRM 中的中断 Aggreagator 和 L2G 的描述是可怕的,例如:  

    和  

    为自己说话。

    此致!

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

    尊敬的 Anil:

    同时,我找到了几件事:

    • 来自 DMTIMER0 的 PWM 信号正常运行 — 它到达 Timesync 路由器、我们设法将其从 SoC 路由到 SYNC_OUT2 输出、在这里我们能够观察到该信号。 同时、相同的信号会路由到输入 8 上的 L2G 模块、因此 SYNC_OUT2 上可见的信号也会传播到 L2G 模块。

      很遗憾、DMA 仍然不会触发。

    • 在 Timesync 路由器中、当我们将触发模式设置为CSL_UDMAP_TR_FLAGS_TRIGGER_LOCAL_EVENT时、我们观察到 DMA 将连续写入 SPI4、这不是由于 PWM 触发、而是因为它重复执行传输请求 (TR)。 这些 SPI 写入大约每 150ns 发生一次、远快于 PWM 信号(大约每 10us 一次)。

    • 我实施了 tr0 类型的传输请求数据包描述符 (Transfer Request Packet Descriptor, TRPD)、它大大简化了icntdim和相关参数的配置。 这应该是适合我们用例的 TR 类型(1-D 转移)。

    [报价 userid=“525901" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1509996/am6442-using-an-event-to-trigger-a-dma-spi-read/5915198

    PDMA 信道不能与类型 15 传输请求 (TR) 配对。

    因此、我继续在驱动程序中实施 3 类 TR 并验证了设置。

    [/报价]
    • 我不确定是什么导致您认为 TR 类型影响了配对 BCDMA 和 PDMA 通道的能力—也许您可以访问我不知道的信息。 如果是这样的话、我非常感谢您能分享一下。

      无论如何、我在使用 TR15、TR3 或 tr0 类型时观察到相同的行为。 无论是通过软件还是使用触发CSL_UDMAP_TR_FLAGS_TRIGGER_LOCAL_EVENT、SPI 接口都可以正确写入、看起来独立于全局触发器 0。

      因此、我认为我们需要进一步调查的领域是 BCDMA 通道触发、可能是 L2G 映射、尽管我目前并不怀疑存在问题。

    此致、

    Angel

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

    您好 Angel、

    根据我们昨天的内部讨论,请附上带有 SPI BCDMA 的 3 类 TR 的工作示例。

    我可以检查一下并进一步调试。

    此致、

    Anil.

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

    尊敬的 Anil:

    直接使用 CCS 构建代码时遇到问题、因为我们通常使用 CMake。 这可能需要一点时间、正如我之前提到的、我目前正在度假几周。 准备好后、我会将工程发布到此处。

    此致!

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

    您好 Angel、

    是肯定的,请 分享 示例一旦它准备好.

    此致、

    Anil.