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.

[参考译文] AM2431:对于具有 DMA 的 MCSPI 外设、如何传输超过 4096 个字节

Guru**** 2815985 points

Other Parts Discussed in Thread: AM2432, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1601587/am2431-for-mcspi-peripheral-with-dma-how-to-transfer-more-than-4096-bytes

器件型号: AM2431
主题中讨论的其他器件: AM2432SysConfig

尊敬的专家:

我们打算将 MCSPI 用作从器件、能够通过 DMA 一次性接收主机发送的 16K 数据。  

我们的测试表明、如果主机发送的字节不超过 4096 个字节、则从器件可以正确接收数据。  

但是、如果主机一次发送大量数据(例如 16K)、则通过 DMA 接收到的数据异常:存储器接收到 16K 数据、但只有最后 4K 是正确的、其余是错误的。 从器件接收最后 4K 字节内容的四个副本。  

例如、如果主机从 1 到 4096 发送 u32*4K 字节数据、则从机内存中接收的 u32 数据不是 1 到 4096 、而是四组 3073 到 4096、则接收缓冲区中的第一个字节不是 1、而是 3073。 我们想知道这是 SDK 中的错误、还是 DMA 硬件的限制。  

根据 DMA 配置、它应该能够接收最多 16 字节* 2048 个数据。  

1.png

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

    您好:

    我不确定您要在哪个 SDK 版本上测试该应用程序。 我建议使用最新版本。 它是: https://www.ti.com/tool/download/MCU-PLUS-SDK AM243X/11.02.00.24

    原因是我发现很少提交可以帮助解决您的 DMA 问题。

    您可以:

     1. https://github.com/TexasInstruments/mcupsdk-core/commit/4d768588852b0bc90a30a45b6355260c443eff05#diff-57541bc9ca53109e199e08e3071a8375f7a64f5f256605dd7b84c8388baacd21

     2. https://github.com/TexasInstruments/mcupsdk-core/commit/1c562a26b166792e3e7f1ac5bb4b4a19430aeab7

    还有其他变化、旨在改进整个 MCSPI 驱动器。

    如果您还没有阅读本指南、还建议您阅读: e2e.ti.com/.../faq-sk-am64b-mcspi-integration-guide

    此致、

    Vaibhav

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

    尊敬的  Vaibhav:

    感谢您的快速答复。

    您的回答对我们的当前设计非常有用。

    对于我们的应用、我们的 AM2432 是 SPI 从设备、因为我们客户的 SPI 数据帧长度不是固定的、所以您能提供设计基准吗?

    我们想在应用中使用 SPI 从器件 DMA。

    谢谢

    Kelven  

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

    请参阅 以下内容

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

    尊敬的 Caibhav:

    长度大于 4096 字节时的数据错误是 SPI 主器件上的错误导致的。  但是 AM243X MCSPI 从器件仍然存在一些问题。

    上面的示例对可变长度传输无效。
    当从器件不知道下一次 SPI 传输的长度时、我们只能假设 SPI 主器件将发送最大数据长度、例如 16KB。 因此、 我们需要调用 MCSPI_Transfer() 长度设置为 16KB 的函数。 如果主机在特定通信中仅发送 5000 个字节、则不会触发 DMA 完成中断。 这会导致两个问题:

    1. 通信完成时、只有 4992 字节的数据刷新到存储器中。 其余 8 个字节只能通过主动调用该 Udma_chDisable() 函数来刷新。 是否有更合适的方法来刷新数据并确认实际接收到的数据长度?

    2. 虽然实际的 SPI 通信已完成、但 DMA 中断仍处于挂起状态(因为从器件没有接收到完整的 16KB 数据)。 我们如何主动终止这种沟通并为下一个沟通做好准备?  MCSPI_Transfer() 此时直接调用将触发有效。

    SDK 版本为  11.02.00.24

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

    尊敬的 Liang:

    我正在审查这个,并将在一段时间内回到你。

    谢谢、

    Vaibhav

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

    您好 Liang、

    对于可变字节数的传输、目前无法按照当前的软件产品那样进行传输。

    关于 4096 字节的问题、建议您查看以下不应超过 5 分钟的 E2E 主题:  关于 SPI-AM243X:MCU-PLUS-SDK 在传输大容量时失败 

    此致、

    Vaibhav

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    关于 4096 字节的问题、我建议您查看以下 E2E、它不应超过 5 分钟:关于 MCU-PLUS-SDK  - AM243X:传输大容量时 SPI DMA 失败 [/报价]

    您好、Vaibhav、谢谢。 这个主题也是由我发布。 SPI 错误还没有修复?  也许您可以通过使用链式 DMA 来引用网络模块的方法。 我们尝试了它,它可以在某种程度上解决问题。

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

    尊敬的 Liang:

    我看到另一个线程是由你提出的。 感谢您指出这一点。

    此外、如果尚未传达、这是  通过电子邮件进行的最新讨论。

    Anil 提到以下情况

    在数据长度可变的情况下、建议使用 SPI 主器件提供的长度信息。 通常、其处理方式如下:

    1. SPI 控制器(主器件) 首先发送一个包含数据长度的命令或标头(例如,协议中的一个长度字段)。
    2. Peripheral(Slave) 使用基于 CPU 的传输接收此标头。
    3. 对长度信息进行解码后、就会使用该值配置 DMA 传输计数。
    4. 然后启用 McSPI DMA 以精确读取指定的字节数。

     

    如果 SPI 协议不提前提供长度信息、则 DMA 不能直接用于整个传输。 在这种情况下、必须考虑中断/轮询模式。

    在 DMA 传输大小前面、我将从另一位专家处确认、并在某个时间内通知您。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    我们尝试使用中断、发现在所需的 SPI 频率 (25MHz) 下、中断使用会导致接收溢出。 也就是说、中断无法足够快地检索 SPI FIFO 中的数据。

    好的、期待 您的更新。

    在 DMA 传输大小前、我将从另一位专家处确认、并在某个时间内通知您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Liang:

    找到有关 BCDMA 的勘误表、该信息值得您了解: https://www.ti.com/lit/er/sprz457j/sprz457j.pdf#page=38
    请参阅 I2431。

    您是否还能检查测试代码中正在执行的高速缓存回写/无效等基本设置?

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    我们确实注意到了这个问题,但它似乎只是指 BCDMA,不包括我们正在使用的 PKTDMA。

    我们已经通过主动 额外调用 CSL_pktdmaSetTxRT 来解决了 assert 问题、 现在可以使用 DMA 发送和接收可变长度。

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

    尊敬的 Liang:

    我们通过主动 额外调用 CSL_pktdmaSetTxRT 来解决了断言问题、 现在可以使用 dma 发送和接收可变长度。

    但这仍然不能回答您对一个事务中最大字节数的查询?  

    也可以修复您的问题。 请帮助说明相同的情况。

    谢谢、

    Vaibhav

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

    是的、它解决了问题。  最初、我们每个 DMA 通道最多只能传输 2048 字节的数据、因此我们考虑参考网络模块链接多个 DMA 通道的方法。 然而,后来发现这是没有必要的。 目前、我们使用单个 DMA 通道并实现了所需的功能。

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

    尊敬的 Liang:

    感谢您的确认。

    此致、

    Vaibhav

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

    尊敬的 Liang:

    如果不需要太多的努力、您是否可以创建一个补丁来修补您所做的更改、以便像您提到的那样包含 2048 个以上的字节?

    如果是在应用级别/NDA 上进行的更改、那么没关系。

    谢谢、

    Vaibhav

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

    尊敬的  Vaibhav:

    首先、感谢您的大力支持。

    我们将共享源代码、请帮助仔细 检查源代码。

    梁将在稍后分享。

    谢谢

    Kelven

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

    您好:

    期待源代码。

    谢谢、

    Vaibhav

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

    尊敬的 Vaibhav:

    我们直接修改了应用程序代码。 原始代码包含许多尚未整理的中间调试段、因此我提取了密钥代码。 请帮助审查我们的实施是否有任何问题。

    关键战略如下:
    我们添加了一个 SPI CS 上升沿中断。 在开始 DMA 发送/接收后、如果我们接收到 CS 中断而不是 SPI 完成中断、则重置 DMA 并通过以下函数 deInitMcspiSlaveDMACh () 检索已接收到的数据长度。

    extern MCSPI_ChConfig       *gConfigMcspiChCfg[];
    int32_t myUdmaDeInitCh(Udma_ChHandle chHandle,
                                      uint32_t  isChEnabled);
    								  
    								 
    
    void terminateMcspiSlaveDMA()
    {
        int32_t                retVal;
        uint32_t index = 2;
        uint32_t chCnt = 0;
        uint64_t               pDesc;
        MCSPILLD_Handle        hMcspi;
        MCSPILLD_InitHandle    hMcspiInit;
        MCSPI_Config *config = NULL;
        MCSPI_Object *obj    = NULL;
        uint32_t               chNum, effByteCnt, peerData;
        MCSPI_UdmaChConfig    *dmaChConfig;
        MCSPI_Transaction     *transaction;
        CSL_UdmapCppi5HMPD    *pHpd;
        MCSPI_ChObject        *chObj;
        uint32_t               baseAddr, irqStatus = 0U;
        Udma_ChHandle          rxChHandle, txChHandle;
        int32_t                status = MCSPI_STATUS_SUCCESS;
        uint8_t *pRxHpdMem, *pTxHpdMem;
        MCSPI_ChConfig      *chConfig;
    
        config = &gMcspiConfig[index];
        obj = config->object;
        hMcspi = obj->mcspiLldHandle;
        hMcspiInit   = hMcspi->hMcspiInit;
        baseAddr     = hMcspi->baseAddr;
        transaction  = &hMcspi->transaction;
        chNum        = transaction->channel;
        chObj        = &hMcspi->hMcspiInit->chObj[chNum];
        dmaChConfig  = (MCSPI_UdmaChConfig *)chObj->dmaChCfg;
        rxChHandle   = dmaChConfig->rxChHandle;
        txChHandle   = dmaChConfig->txChHandle;
        effByteCnt   = transaction->count << chObj->bufWidthShift;
        pRxHpdMem    = dmaChConfig->rxHpdMem;
        pTxHpdMem    = dmaChConfig->txHpdMem;
        chConfig    = gConfigMcspiChCfg[index];
    
        hMcspi->transaction.count = 0;
    
    
    	pHpd = (CSL_UdmapCppi5HMPD *)((uint8_t *) pTxHpdMem + i * sizeof(CSL_UdmapCppi5HMPD));
    	CacheP_inv(pHpd, dmaChConfig->hpdMemSize, CacheP_TYPE_ALLD);
    
    	pHpd = (CSL_UdmapCppi5HMPD *)((uint8_t *) pRxHpdMem + i * sizeof(CSL_UdmapCppi5HMPD));
    	CacheP_inv(pHpd, dmaChConfig->hpdMemSize, CacheP_TYPE_ALLD);
    
    	retVal = Udma_ringDequeueRaw(Udma_chGetCqRingHandle(txChHandle), &pDesc);
    	if (retVal < 0)
    		retVal = Udma_ringFlushRaw(Udma_chGetFqRingHandle(txChHandle), &pDesc);
    
    	retVal = Udma_ringDequeueRaw(Udma_chGetCqRingHandle(rxChHandle), &pDesc);
    	if (retVal < 0)
    		retVal = Udma_ringFlushRaw(Udma_chGetFqRingHandle(rxChHandle), &pDesc);
    	else
    	{
    		pHpd   = (CSL_UdmapCppi5HMPD *)(uintptr_t)pDesc;
    		if (retVal == UDMA_SOK)
    		{
    			status = MCSPI_TRANSFER_COMPLETED;
    		}
    		else
    		{
    			status = MCSPI_TRANSFER_FAILED;
    			//hMcspi->hMcspiInit->errorCallbackFxn(hMcspi, status);
    		}
    
    		if ((status == MCSPI_TRANSFER_COMPLETED) &&
    			(MCSPI_TR_MODE_TX_ONLY != chObj->chCfg->trMode))
    		{
    			if(dmaChConfig->isCqRingMem != UDMA_COMP_QUEUE_RING_MEM_ENABLED){
    				retVal = Udma_getPeerData(rxChHandle, &peerData);
    				DebugP_assert(retVal == UDMA_SOK);
    	//            startTicks = hMcspiInit->clockP_get();
    	//                    while ((effByteCnt != peerData) && (elapsedTicks < transaction->timeout))
    	//                    {
    	//                        retVal += Udma_getPeerData(rxChHandle, &peerData);
    	//                        elapsedTicks = hMcspiInit->clockP_get() - startTicks;
    	//                    };
    				/* Clear Data */
    				retVal += Udma_clearPeerData(rxChHandle, peerData);
    			}
    			DebugP_assert(retVal == UDMA_SOK);
    
    
    			/* Get Byte count received */
    			effByteCnt = (pHpd->descInfo & CSL_UDMAP_CPPI5_PD_DESCINFO_PKTLEN_MASK) >> CSL_UDMAP_CPPI5_PD_DESCINFO_PKTLEN_SHIFT;
    			hMcspi->transaction.count += (effByteCnt >> chObj->bufWidthShift);
    		}
    	}
    
    
        /* Stop MCSPI Channel */
        MCSPI_lld_dmaStop(hMcspi, chObj, chNum);
        hMcspi->state = MCSPI_STATE_READY;
    
        irqStatus = CSL_REG32_RD(baseAddr + CSL_MCSPI_IRQSTATUS);
        if ((irqStatus & ((uint32_t)CSL_MCSPI_IRQSTATUS_RX0_OVERFLOW_MASK)) != 0U)
        {
          retVal = MCSPI_TRANSFER_CANCELLED;
          hMcspi->errorFlag |= MCSPI_ERROR_RX_OVERFLOW;
        }
    
        if (((irqStatus & ((uint32_t)CSL_MCSPI_IRQSTATUS_TX0_UNDERFLOW_MASK << (4U * chNum))) != 0U) &&
          ((hMcspiInit->msMode == MCSPI_MS_MODE_PERIPHERAL)))
        {
          retVal = MCSPI_TRANSFER_CANCELLED;
          hMcspi->errorFlag |= MCSPI_ERROR_TX_UNDERFLOW;
        }
    
        if(hMcspi->errorFlag != 0U)
        {
          hMcspi->hMcspiInit->errorCallbackFxn(hMcspi, retVal);
        }
        else
        {
          hMcspi->hMcspiInit->transferCallbackFxn(hMcspi, MCSPI_TRANSFER_COMPLETED);
        }
    
    }
    
    
    //disable DMA Channel
    int32_t myUdmaDeInitCh(Udma_ChHandle chHandle,
                                      uint32_t  isChEnabled)
    {
        int32_t udmaStatus = UDMA_SOK;
        int32_t status = MCSPI_STATUS_SUCCESS;
    
        if(isChEnabled == MCSPI_UDMA_CHANNEL_ENABLE)
        {
            /* Disable Channel */
            udmaStatus = Udma_chDisable(chHandle, UDMA_DEFAULT_CH_DISABLE_TIMEOUT);
            DebugP_assert(UDMA_SOK == udmaStatus);
        }
    
        if(udmaStatus == UDMA_SOK)
        {
            status = MCSPI_STATUS_SUCCESS;
        }
        else
        {
            status = MCSPI_STATUS_FAILURE;
        }
    
    
        return status;
    }
    
    //disable DMA Channel TX
    int32_t myUdmaDeInitChTX(Udma_ChHandle chHandle,
                                      uint32_t  isChEnabled)
    {
        Udma_DrvHandleInt   drvHandle;
        CSL_PktdmaRT        pktdmaRtStatus;
        Udma_ChHandleInt    chHandleInt = (Udma_ChHandleInt) chHandle;
    
        drvHandle = chHandleInt->drvHandle;
    
        /*
         *  TRT_CTL Bit31 TX_ENABLE
         *  This field enables or disables the channel. Disabling a channel
            halts operation on the channel after the current block transfer is
            completed. Disabling a channel in the middle of a packet transfer
            may result in underflow conditions in the attached application block
            and data loss. When a channel is disabled, the implementation may
            choose to reset all state for the channel. The pause bit should
            be asserted instead of clearing enable directly if the intent is to
            temporarily pause the channel. This field is encoded as follows: 0 =
            channel is disabled 1 = channel is enabled This field will be cleared
            by HW after a teardown is requested to indicate that the channel
            teardown is complete.
         * */
        pktdmaRtStatus.enable   = FALSE;
        pktdmaRtStatus.teardown = FALSE;
        pktdmaRtStatus.forcedTeardown = FALSE;
    
        (void) CSL_pktdmaSetTxRT(&drvHandle->pktdmaRegs, chHandleInt->txChNum, &pktdmaRtStatus);
    
        return UDMA_SOK;
    }
    
    int32_t deInitMcspiSlaveDMACh()
    {
        int32_t              status = SystemP_SUCCESS;
        uint32_t index = 2;
        MCSPI_ChConfig      *chConfig;
        MCSPI_Config        *config = NULL;
        MCSPI_Object        *obj    = NULL;
        MCSPILLD_Handle      mcspiLldHandle;
        uint32_t chCnt = 0;
        MCSPI_ChObject      *chObj;
        MCSPI_UdmaChConfig  *dmaChConfig;
    
        config = &gMcspiConfig[index];
        obj = config->object;
        mcspiLldHandle                = obj->mcspiLldHandle;
    
        chConfig    = gConfigMcspiChCfg[index];
    
        chObj            = &mcspiLldHandle->hMcspiInit->chObj[chCnt];
        dmaChConfig      = (MCSPI_UdmaChConfig *)chObj->dmaChCfg;
    
        myUdmaDeInitCh(dmaChConfig->rxChHandle, dmaChConfig->isChEnabled);
    
        myUdmaDeInitChTX(dmaChConfig->txChHandle, dmaChConfig->isChEnabled);
    
        terminateMcspiSlaveDMA();
    
        return status;
    }
    
    
    

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

    尊敬的 Liang:

    我会重新检视您的建议、并在某个时候回复您。

    您还可以分享 example.syscfg 文件、让我看看 MCSPI 配置。 可以共享该节本身的屏幕截图、而不是整个文件。

    谢谢、

    Vaibhav

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

    尊敬的 Vaibhav:

    如下所示、 在 SYSCFG 中、MCSPI 配置为轮询模式、然后在 main 函数中主动调用以下函数来初始化 DMA。

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

    回顾后、它看起来很好。

    我们添加了 SPI CS 上升沿中断。 在开始 DMA 发送/接收后、如果我们接收到 CS 中断而不是 SPI 完成中断、则重置 DMA 并通过以下函数 deInitMcspiSlaveDMACh () 检索已接收到的数据长度。

    SPI CS 上升沿中断和 DMA 完成中断是否同时出现?

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

    在调用转接期间、我们设置了较大的数据长度、因此两个中断极不可能同时发生。 此外、我们已注释掉 DMA 中断处理逻辑、使其直接返回、因此任何同时发生的情况都不会产生影响。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在调用转接期间、我们设置了较大的数据长度、这使得两个中断同时发生的可能性极低。 此外、我们已注释掉 DMA 中断处理逻辑、使其直接返回、因此任何同时发生的情况都不会产生影响。

    感谢您明确提到这一点。 如果处理了此竞态条件、则应该可以。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们添加了 SPI CS 上升沿中断。 [/报价]

    您是否意味着将 SPI_CS 引脚配置为 GPIO 以触发 GPIO 中断? 但在 SysConfig 中、SPI 配置为 4 引脚模式。 如果是、哪个 SPI 接收器触发信号?  

    在 SysConfig 中、它是否应该是 3 引脚模式?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是指将 SPI_CS 引脚配置为 GPIO 以触发 GPIO 中断吗? [/报价]

    否、使用另一个 GPIO 短接至 CS。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在调用转接期间、我们设置了较大的数据长度、这使得两个中断同时发生的可能性极低。 此外、我们已注释掉 DMA 中断处理逻辑、使其直接返回、因此任何同时发生的情况都不会产生影响。

    #1。 我能否理解仅在 DMA 长度等于数据长度时发生同时中断的唯一可能性?

    #2. 因此、如果配置的 DMA 长度>最长长度 16K、那么不会再触发 DMA 完成中断?

    此外、您在代码中没有发出 DMA 中断。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid=“35100" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1601587/am2431-for-mcspi-peripheral-with-dma-how-to-transfer-more-than-4096-bytes/6188214

    #1。 我能否理解仅在 DMA 长度等于数据长度时发生同时中断的唯一可能性?

    #2. 因此、如果配置的 DMA 长度>最长长度 16K、那么不会再触发 DMA 完成中断?

    此外、您在代码中没有发出 DMA 中断。

    [/报价]

    是的。