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.

[参考译文] TDA4VM:为每个 MCSPI 通道进行多 UDMA 配置

Guru**** 2393975 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1490483/tda4vm-multi-udma-configure-for-each-mcspi-channel

器件型号:TDA4VM
主题中讨论的其他器件:SysConfig

工具与软件:

 我们有新的设计请求两个 MCSPI 端口、如何为每个 MCSPI 端口配置 uDMA、我知道如何将 uDMA 配置为一个 MCSPI 端口。 下面是用于配置一个 MCSPI 端口的代码、 udma_init ()似乎可以调用一次、但如何为第二个 SPI 再创建一个 uDMA?

Udma_Drv 54 MCSPIApp_udmaInit (SPI_v1_HWAttrs *cfg)

int32_t retVal = uDMA_SOK;
Udma_Init 4.30ms initPrms;
uint32_t instId;

if (gDrvHandle == NULL)/* PRQA S 2,991,2994 */

/* uDMA 驱动程序初始化*/
#if 已定义(SOC_AM64X)
/*对 AM64x 使用块复制 DMA 实例*/
instId = UDMA_INST_ID_BCDMA_0;
#else
/*将 MCU NAVSS 用于 MCU 域内核。 REST 内核全部使用主 NAVSS */
#if 已定义(BUILD_MCU1_0)||已定义(BUILD_MCU1_1)
instId = UDMA_INST_ID_MCU_0;
#else
instId = UDMA_INST_ID_MAIN_0;
#endif
#endif
(void) UdmaInitPrms_init (instId、&initPrms);
retval = udma_init (&gUdmaDrvObj、&initPrms);
if (uDMA_SOK == retVal)

gDrvHandle =&gUdmaDrvObj;
}
}

if (gDrvHandle!= NULL)

gDrvHandle =&gUdmaDrvObj;

gUdmaInfo.txChHandle =(void *)&gUdmaTxChObj;
gUdmaInfo.rxChHandle =(void *)&gUdmaRxChObj;
gUdmaInfo.txRingMem =(void *)&gTxRingMem[0];
gUdmaInfo.cqTxRingMem =(void *)&gTxCompRingMem[0];
gUdmaInfo.rxRingMem =(void *)&gRxRingMem[0];
gUdmaInfo.cqRxRingMem =(void *)&gRxCompRingMem[0];
gUdmaInfo.txHpdMem =(void *)&gUdmaTxHpdMem[0];
gUdmaInfo.rxHpdMem =(void *)&gUdmaRxHpdMem[0];
gUdmaInfo.txEventHandle =(void *)&gUdmaTxCqEventObj;
gUdmaInfo.rxEventHandle =(void *)&gUdmaRxCqEventObj;
cfg->dmaInfo =.gUdmaInfo;
}
设计

/* uart_printf ("MCSPIApp_udmaInit:udma_init 失败、出现错误代码:%d\n"、retVal);*/
}

返回(gDrvHandle);
}

SPI_HWAttrs SPI_cfg =

.baseAddr = CSL_MCSPI0_CFG_BASE、
.intNum = CSLR_MAIN2MCU_LVL_INTR0_IN_MCSPI0_INTR_SPI_0
.pinMode =(uint32_t) SPI_PINMODE_4_PIN
.chNum = MCSPI_CHANNEL_0、
//.chMode = MCSPI_SINGLE_CH、
.chMode = MCSPI_MULTI_CH、
enableIntr =(bool) me_false、
.inputClkFreq = 48000000U、
.initDelay = MCSPI_INITDLY_0、
.rxTrigLevel = MCSPI_RX_TX_FIFO_SIZE、
.txTrigLevel = MCSPI_RX_TX_FIFO_SIZE、
.chnCfg =

[0]=

.csPolarity = MCSPI_CS_POL_LOW、
.dataLineCommMode = MCSPI_DATA_LINE_COMM_MODE_7、
.tcs = MCSPI_CH0CONF_TCS0_ZEROCYCLEDLY、
.trMode = MCSPI_TX_RX_MODE
}、
[1]=

.csPolarity = MCSPI_CS_POL_LOW、
.dataLineCommMode = MCSPI_DATA_LINE_COMM_MODE_7、
.tcs = MCSPI_CH1CONF_TCS1_ZEROCYCLEDLY、
.trMode = MCSPI_TX_RX_MODE
}、
}、
.rxDmaEventNumber = CSL_PDMA_CH_MAIN_MCSPI0_CH0_RX、
.txDmaEventNumber = CSL_PDMA_CH_MAIN_MCSPI0_CH0_TX、

};

spi_cfg.edmaHandle =(void *) MCSPIApp_udmaInit (&SPI_cfg);
spi_cfg.dmaMode =(bool) true;

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

    您好!

    我想您在这里谈论的是 PDK 驱动程序吗?

    您是否看到过针对所有多通道配置的具有 DMA 的 SPI 的 MCAL 驱动程序是如何完成的?

    static const Spi_DmaEventObj Spi_DmaEventNum[SPI_HW_UNIT_CNT][4U] =
    {
        [0U] =
        {
            {
                CSL_PDMA_CH_MCU_MCSPI0_CH0_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MCU_MCSPI0_CH0_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MCU_MCSPI0_CH1_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MCU_MCSPI0_CH1_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MCU_MCSPI0_CH2_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MCU_MCSPI0_CH2_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MCU_MCSPI0_CH3_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MCU_MCSPI0_CH3_TX,      /* txDmaEventNumber */
            },
        },
        [1U] =
        {
            {
                CSL_PDMA_CH_MCU_MCSPI1_CH0_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MCU_MCSPI1_CH0_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MCU_MCSPI1_CH1_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MCU_MCSPI1_CH1_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MCU_MCSPI1_CH2_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MCU_MCSPI1_CH2_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MCU_MCSPI1_CH3_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MCU_MCSPI1_CH3_TX,      /* txDmaEventNumber */
            },
        },
        [2U] =
        {
            {
                CSL_PDMA_CH_MCU_MCSPI2_CH0_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MCU_MCSPI2_CH0_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MCU_MCSPI2_CH1_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MCU_MCSPI2_CH1_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MCU_MCSPI2_CH2_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MCU_MCSPI2_CH2_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MCU_MCSPI2_CH3_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MCU_MCSPI2_CH3_TX,      /* txDmaEventNumber */
            },
        },
        [3U] =
        {
            {
                CSL_PDMA_CH_MAIN_MCSPI0_CH0_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI0_CH0_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI0_CH1_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI0_CH1_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI0_CH2_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI0_CH2_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI0_CH3_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI0_CH3_TX,      /* txDmaEventNumber */
            },
        },
        [4U] =
        {
            {
                CSL_PDMA_CH_MAIN_MCSPI1_CH0_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI1_CH0_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI1_CH1_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI1_CH1_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI1_CH2_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI1_CH2_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI1_CH3_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI1_CH3_TX,      /* txDmaEventNumber */
            },
        },
        [5U] =
        {
            {
                CSL_PDMA_CH_MAIN_MCSPI2_CH0_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI2_CH0_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI2_CH1_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI2_CH1_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI2_CH2_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI2_CH2_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI2_CH3_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI2_CH3_TX,      /* txDmaEventNumber */
            },
        },
        [6U] =
        {
            {
                CSL_PDMA_CH_MAIN_MCSPI3_CH0_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI3_CH0_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI3_CH1_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI3_CH1_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI3_CH2_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI3_CH2_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI3_CH3_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI3_CH3_TX,      /* txDmaEventNumber */
            },
        },
    #if defined (SOC_J721E) || defined (SOC_J7200) || defined (SOC_J784S4)
        [7U] =
        {
            {
                CSL_PDMA_CH_MAIN_MCSPI4_CH0_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI4_CH0_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI4_CH1_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI4_CH1_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI4_CH2_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI4_CH2_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI4_CH3_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI4_CH3_TX,      /* txDmaEventNumber */
            },
        },
        [8U] =
        {
            {
                CSL_PDMA_CH_MAIN_MCSPI5_CH0_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI5_CH0_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI5_CH1_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI5_CH1_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI5_CH2_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI5_CH2_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI5_CH3_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI5_CH3_TX,      /* txDmaEventNumber */
            },
        },
        [9U] =
        {
            {
                CSL_PDMA_CH_MAIN_MCSPI6_CH0_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI6_CH0_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI6_CH1_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI6_CH1_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI6_CH2_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI6_CH2_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI6_CH3_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI6_CH3_TX,      /* txDmaEventNumber */
            },
        },
        [10U] =
        {
            {
                CSL_PDMA_CH_MAIN_MCSPI7_CH0_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI7_CH0_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI7_CH1_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI7_CH1_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI7_CH2_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI7_CH2_TX,      /* txDmaEventNumber */
            },
            {
                CSL_PDMA_CH_MAIN_MCSPI7_CH3_RX,      /* rxDmaEventNumber */
                CSL_PDMA_CH_MAIN_MCSPI7_CH3_TX,      /* txDmaEventNumber */
            },
        },
    #endif
    };

    此致

    Tarun Mukesh

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

    谢谢、我将介绍适用于 SPI 的 MCAL 驱动程序

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

    您好!

      查看 MCAL 驱动程序后、我尝试配置第二个 UDMA 通道、配置第二个 RX UDMA 通道失败、

    我发现为它分配了4个 TX 通道、但只有1个 RX 通道(请参阅下面的屏幕截图)。 我想知道它是否在 sciclient_defaultBoardcfg_rm.c 中配置 我试图更改文件(请参阅随附的代码)以配置3个 RX 通道、但它似乎没有影响。 顺便说一下、我的代码在 MCU2_1上运行

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

    您好!

    [报价 userid="372039" url="~/support/processors-group/processors/f/processors-forum/1490483/tda4vm-multi-udma-configure-for-each-mcspi-channel/5729863 #5729863"]

    我发现为它分配了4个 TX 通道、但只有1个 RX 通道(请参阅下面的屏幕截图)。 我想知道它是否在 sciclient_defaultBoardcfg_rm.c 中配置 我试图更改文件(请参阅随附的代码)以配置3个 RX 通道、但它似乎没有影响。 顺便说一下、我的代码在 MCU2_1上运行

    [报价]

    是的、UDMA 通道数是在系统配置中配置的。 您需要在 SysConfig 工具中修改资源并生成所有必需文件。

    此致

    Tarun Mukesh

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

    您可以遵循常见问题解答

    e2e.ti.com/.../faq-tda4vm-workflow-and-resource-allocation-build-flow-for-sysconfig-tool

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

    谢谢、我将尝试它。

    Jiang

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

    您好!

      具有 DMA 的功能多通道 MCSPI 可以正常工作、但这不是我们预期的结果、我有一些问题:

    我们将 datasize 配置为16位、

    1. 传输16位后将切换到下一个通道,即使我们想为每个通道传输32字节的数据,也可以在传输32字节数据后进行配置,然后切换到下一个通道。

    2. 我们希望为每个通道传输32字节的数据、 每个 DMA 触发、每个通道仅传输位数据、停止、正确或可以按预期进行配置:

    比如通道1的16位数据传输 ->(switch)->通道2的16位数据传输->(switch)-> 通道3的16位数据传输-> (switch)-> 通道4的16位数据传输->停止

    我们期望:

    通道1的16位数据传输 ->(switch)->通道2的16位数据传输->(switch) ->通道3的16位数据传输-> (  switch)->通道4的16位数据传输->通道1 (switch)的下16位数据传输->通道2的下16位数据传输-> (switch)->通道3的下16位数据传输->通道3的下16位数据传输(switch)->通道4的下16位数据传输 完成16位数据传输->通道4的下16位数据传输...(switch 数据传输完成第16位数据传输

    3.根据数据表、将切换"规则1:只可计划已启用的通道(MCSPI_CHCTRL_0/1/2/3[0] EN 位)进行传输
    和/或接收"、但我观察到的是:它将切换、甚至 MCSPI_CHCTRL_0/1/2/3[0] EN 位未置位、但 MCSPI_chCONFIG_0/1/2/3中的 FFER 或 FFEW 位已置位

    谢谢  

    刘江

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

    您好!

    具有 DMA 的多通道 MCSPI 功能正在运行

    很高兴知道您使它正常工作。

    [报价 userid="372039" url="~/support/processors-group/processors/f/processors-forum/1490483/tda4vm-multi-udma-configure-for-each-mcspi-channel/5737653 #5737653"]根据数据表、该命令将切换"规则1:只可安排已启用的通道(MCSPI_CHCTRL_0/1/2/3[0] EN 位)进行传输
    和/或接收"、但我观察到的是:它将切换偶数 MCSPI_CHCTRL_0/1/2/3[0] EN 位未置位、但 MCSPI_chCONFIG_0/1/2/3中的 FFER 或 FFEW 位置位

    如果  在 MCSPI_CHxCONF 中设置了 FFER 或 FFEW、则通道仍可能与 FIFO 交互、从而导致意外的通道切换。  

    权变措施:

    如果您不打算使用非活动通道的 FFER 和 FFEW 位、请清除这些位。每次只能有一个通道设置此位字段。 另请参阅下面的寄存器片段。

    确保 MCSPI_MODULCTR

    仅针对目标通道正确设置 L[1] MS 位。

    此致

    Tarun Mukesh