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.

[参考译文] TMDSEVM6678:有关 SPI DMA 的问题

Guru**** 2587365 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/592920/tmdsevm6678-question-regarding-spi-dma

器件型号:TMDSEVM6678

我尝试将 ADC 连接到评估模块的 SPI、并通过 SPI DMA 将数据传输到存储器。  这是我的应用代码。  我在 SPI 回送模式下尝试过这完全相同的代码、似乎数据正从 srcBuf 正确传输到 dstBuf。  我无法使 ADC 正常工作、此时我甚至不确定它是否正常工作、但我有一些观察结果让我感到担忧。  

我 看到时钟和从 DSP 生成的数据输出信号、但从 ADC 传入的数据始终为零。  无论 ADC 工作与否、我希望 DSP 从该线路读取0、但它始终读取0xFFFF。

2.  在 Test_EDMA 函数中、当我在清除 IPR 后放入断点时、我看不到它被清除。  我也看不到 Eer 寄存器被设置。

uint32_t pinDirection = GPIO_DIR_OUTPUT;
#define TEST_ACNT 2
#define TEST_BCNT 1
#define TEST_CCNT 1

#define RCVE_BCNT 100

#define TEST_SYCTYPE_AB 1
#define TEST_SYCTYPE_A 0


#pragma DATA_SECTION (dstBuf、".ddrData")
#pragma DATA_ALIGN (dstBuf、64)
UINT16 dstBuf[64];

#pragma DATA_SECTION (srcBuf、".ddrData")
#pragma DATA_ALIGN (srcBuf、 8)
uint16 srcBuf[40]={0x8、000、0x9、000、0x8、000、0x9、000、0x8、000、0x9、000、0x9、000、0x9、000、0x9、
000、000、0x9、000、000、0x9、










000、000、000、0x9、000、000、000、000、000、000、0x8、000、000、000、000、000、000、000、000、000、000、000、000、000、000、



000、000、0x9、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、0x1、000、000、0x1、000、000、0x1、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000、000







// EDMA 模块初始化
CSL_edma3Init (NULL);

// EDMA 模块打开
hModule = CSL_edma3Open (&moduleObj、CSL_TPCC_1、NULL、&EdmaStat);

if ((hModule =NULL)||(EdmaStat!=CSL_Sok))
{
printf ("错误:EDMA 模块打开失败\n");
return;
}

// SPI Tx 通道打开-通道2用于 Tx (SPIXEVT)
chParam.regionNum = CSL_EDMA3_REGION;
chSetup.que = CSL_EDMA3_QE_0;
chParam.chaNum = CSL_EDMA3_CHA_2;

hChannel0 = CSL_edma3ChannelOpen (&ChObj0、CSL_TPCC_1、&chParam、&EdmaStat);
chSetup.paramNum = chParam.chaNum;/CSL_EDMA3_CHA_2;

if (CSL_edma3HwChannelSetupParam (hChannel0、chSetup.paramNum)!= CSL_Sok)
{
printf ("错误:EDMA 通道设置参数失败\n");
返回;
}
// SPI Rx 通道打开-针对 Rx (SPIREVT)
的通道3 chParam.regionNum = CSL_EDMA3_REGAL_GLOBAL;
chSetup.que = CSL_EDMA3_QE_0;
chParam.chaNum = CSL_EDMA3_Cha_3;

hChannel1 = CSL_edma3ChannelOpen (&ChObj1、CSL_TPCC_1、&chParam、&EdmaStat);

chSetup.paramNum = chParam.chaNum;/CSL_EDMA3_CHA_3;
CSL_edma3HwChannelSetupParam (hChannel1、chSetup.paramNum);

ENABLE_EDMA_CHANNELS ();
}

void Setup_EDMA_Params_Rx (uint32 dstBuf)
{
//参数句柄打开
//打开所有句柄并使其保持就绪

paramHandle1 = CSL_edma3GetParamHandle (hChannel1、CSL_EDMA3_Cha_3、&EdmaStat);
paramHandle1_reload =(CSL_Edma3ParamHandle)(0x02724000);


paramSetup.aCntbcnt = CSL_EDMA3_CNT_make (test_acNT、test_bcNT);
paramSetup.srcDstBIDx = CSL_EDMA3_BIDX_make (0、test_ACNT);
ccsSetup.srcDstCidx = CSL_EDMA3_paramX_make (0、0、0);CIDESDP.Cnt.Setup.srcDstCidx = CSL_paramX.paramX_make
= test_CCNT;
paramSetup.option = CSL_EDMA3_OPT_make (false、false、false、true、CSL_EDMA3_CHA_3、CSL_EDMA3_TCC_NORMAL、\
CSL_EDMA3_FIFOWIDTH_NONE、false、CSL_EDMA3_SYNC_A、CSL_EDMA3_ADDRMODE_INCR、CSL_EDMA3_ADDRMODE_INCR);
paramSetup.srcAddr =(uint32)&((((CSL_SpiRegsOvly) CSL_SPI_regs)->SPIBUF);

paramSetup.dstAddr =(uint32) dstBuf;


paramSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_make (paramHandle1_reload、0);

CSL_edma3ParamSetup (



void Handle1、&paramSetup);CSL_edma3paramSetup (paramHandle1_reload、&paramSetup)
;paramsprams32}
参数保持打开/参数打开

= CSL_edma3GetParamHandle (hChannel0、CSL_EDMA3_Cha_2、&EdmaStat);
paramHandle0_reload =(CSL_Edma3ParamHandle)(0x02724080);

paramSetup.aCntbCnt = CSL_EDMA3_CNT_make (test_ACNT、(test_BCNT));
paramSetup.srcDstBIDx = CSL_EDMA3_BIDX_make (test_ACNT、0);
paramSetup.srcDstCidx = CSL_EDMA3_paramX_make (0、Cnt);paramSetup
= test_CCNT;
paramSetup.option = CSL_EDMA3_OPT_make (false、false、false、true、CSL_EDMA3_CHA_2、CSL_EDMA3_TCC_NORMAL、\
CSL_EDMA3_FIFOWIDTH_NONE、CSL_EDMA3_STATIC_DIS、CSL_EDMA3_SYNC_A、CSL_EDMA3_ADDRMODE_INCR、CSL_EDMA3_ADDRMODE_INCR);

paramSetup.srcAddr =(uint32)(srcBuf);
paramSetup.dstAddr =(uint32)&(((CSL_SpiRegsOvly) CSL_SPI_regs)->SPIDAT0);
//paramSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_make (CSL_EDMA3_LINK_NULL、0);paramSetup.linkBLD_param0
(param0);param3Handled_param0 (param0

);paramedHandel0 (param0);paramelHandel0 (param0) paramedHandel_param0 (param0



void Test_EDMA (void)
{

//等待中断
regionIpr.region = CSL_EDMA3_REGISE_GLOBAL;
regionIpr.intr = 0;
regionIpr.intrh = 0;


/CSL_edma3HwChannelControl (hChannel0、CSL_EDMA3_CMD_CHANGE_CLEARERR、NULL);
DO{CSL_edma3GetHwchStatus
(hModule、CSL_EDMA3_INTRIERR、NULL);QUERY{CSL_DETPREGERR
}while (((regionIpr.intr & 0x04)!= 0x04);//channel_2


do{
CSL_edma3GetHwStatus (hModule、CSL_EDMA3_query_INTRPEND、&regionIpr);
regionwhile ((regionIpr.intr & 0x08)!= 0x08);//channel_3//


清除暂挂中断*、CSTRIM_INDMAP3
;{_CLEAND_CLEANDR_CLE_INDMAP3}






CSL_FINST (hModule->regs->TPCC_Secr、TPCC_TPCC_Secr_SECR2、RESETVAL);
CSL_FINST (hModule->regs->TPCC_Secr、TPCC_TPCC_Secr_SECR3、RESETVAL);CSL_FINN (h 模



块1);CSL_DMANE (3


void Setup_SPI_Init (void)
{
/*重置 SPI */
(((CSL_SpiRegsOvly) CSL_SPI_regs)->SPIGCR0=
CSL_SPI_SPIGCR0_RESET_IN_RESET< SPIGCR0=
CSL_SPI_SPIGCR0_RESET_OUT_ON_RESET< SPIGCR1=
<CSL_SPI_SPIGCR1_CLKMOD_SHIFT|
CSL_SPI_SPIGCR1_MASTER_MASTER< SPIPC0=
CSL_SPI_SPIPC0_SOMIFUN_SPI<<CSL_SPI_SPIPC0_SOMIFUN_SHIFT|
CSL_SPI_SPIPC0_SIMOFUN_SPI<<CSL_SPI_SPIPC0_SIMOFUN_SHIFT|
CSL_SPI_SPIPC0_CLKFUN_SPI< SPIGCR1 |=
CSL_SPI_SPIGCR1_LOOP_DISABLE< SPIDAT1=
<CSL_SPI_SPIDAT1_DFSEL_SHIFT| CSL_SPI_SPIDAT1_WDEL_ENABLE<<CSL_SPI_SPIDAT1_WDEL_SHIFT| 0x2<

<SPIFMT[0]=
<CSL_SPI_SPIFMT_SHIFTDIR_SHIFT|
<CSL_SPI_SPIFMT_POLARITY_SHIFT|
<CSL_SPI_SPIFMT_PHASE_SHIFT|
0xFF<<CSL_SPI_SPIFMT_PRESCALE_SHIFT|
0x10<<CSL_SPI_SPIFMT_CHARLEN_SHIFT| 0x41<
SPIDELAY=
0x0F< SPIINT0 =
CSL_SPI_SPIINT0_ENABLEHIGHZ_ENABLEHIG0_ENABLEHIGHZ_SHIFT|CSL_SPIINT0_OVRNINT_SPINT_ENABLE_SPIC0_SPINT_SPIRINT_SPINT_SPICT_SPINT_SPINT_SPICT_SPINT_SPINT_SPINT_SPICT_SPINT_SPINT_SPICT_SPINT_SPINT_SPICT_SPINT_SPINT_SPICT_SPICT_ENA|_SPINT_SPINT_SPINT_SPINT_SPINT_SPINT_SPINT_SPINT_SPINT_SPINT_SPINT_SPINT_SPINT_SPINT_SPINT_SPINT_SPINT_SPINT_SPICT_SPICT_SPINT_SPINT_SPINT_SPINT_SPICT_SPICT_SPINT_SPICT_SPINT_SPINT_SPICT_SPICT_SPICT_SPINT_SPINT_SPINT_SPICT_SPICT_SPICT_SPICT_SPICT_SPICT_





SPIGCR1|=
CSL_SPI_SPIGCR1_ENABLE_ENABLE< SPIINT0 &=\
~(CSL_SPI_SPIINT0_DMAREQEN_ENABLE< SPIINT0 |=\
CSL_SPI_SPIINT0_DMAREQEN_ENABLE< SPIFLG & 0x00000200));

while (!(((((CSL_SpiRegsOvly) CSL_SPI_regs)->SPIFLG & 0x00000100);

CSL_GPIO_setOutputData (hGpio、15);

}


void main (void)

{

int i;


//启动 GPIO 缓冲
区(dst_gpio+







);(0x64_gpio_gpio+)= 0xgpio+、gpio+(nuth);(nip+)



//为 SPI 传输设置 EDMA

Setup_EDMA_Init();

Setup_SPI_Init();


for (i=0;i<40;i++)
{

//为 SPI 传输启用 EDMA
Setup_EDMA_Params_TX (UINT32)(&srcBuf[i]);Setup_EDMA_Params_ats_TX (
UST_INT32)


;Setup_DR_[i_AUD32](/uint32])

//检查 EDMA 传输完成状态
Test_EDMA ();

}
//关闭 EDMA 通道/模块 */
Close_EDMA ();
((CSL_SpiRegsOvly) CSL_SPI_regs)->SPIGCR1|=
<CSL_SPI_SPIGCR1_ENABLE_SHIFT; printf("end of test\n"); }




有人在我所做的工作中看到任何错误吗?

如果有任何意见、我将不胜感激。

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

    我已将其转发给软件团队。 他们的反馈应发布在此处。

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

    我查看了您的代码并有一些问题、您能评论吗?

    1) 1)在适用于 C66x 器件的 TI 处理器 SDK RTOS 中、我们没有此类 SPI + EDMA 代码示例。 您在此应用程序代码中引用的代码库是什么?

    2) 2)对于 EDMA 器件、似乎您使用了 EDMA CC1和两个通道进行传输。 参数设置为0x2724000和0x2724080时会进行传输重新加载。 这是第0个和第4个通道的参数。 此重载的用途是什么? 谁对这些参数集进行了编程?

    3) 3)对于 EDMA、传输在向 ESR 寄存器写入"1"时开始、但我没有看到。 如何触发传输?

    4) 4)对于 EDMA、您曾提到"在 Test_EDMA 函数中、当我在清除 IPR 后放置一个断点时、我看不到它被清除。 我也看不到设置了 er 寄存器。" ===== >首先、您是否看到了 IPR 集? 如果是、清洁 IPR 是通过向 ICR 写入"1"来完成的、我在代码中没有看到这一点? 最后、您的意思是"根本看不到寄存器设置"? 什么寄存器?

    对于 SPI 器件、我将让我的同事发表意见。

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

    尊敬的 Eric:

    1) 1)我从以下主题中获得了此代码: http://e2e.ti.com/support/dsp/c6000_multi-core_dsps/f/639/t/170614#pi316458=3 、Steven 在其中举了一个例子。

    2)对于传输重载地址、我发现 Steven 的代码未初始化其重载参数集、而我在 EDMA3文档(2.3.7链接传输)中阅读的内容表明: "参数中设置的任何参数都可以用作链接/重新加载参数集"、我想我可以使用这些地址!

    3) 3)这是我触发通道的位置:

    void Enable_EDMA_CHANNELS (void)
    {
    //触发通道
    CSL_edma3 HwChannelControl (hChannel0、CSL_EDMA3_CMD_CHANNEL_ENABLE、NULL);
    
    //触发通道
    CSL_edma3HwChannelControl (hChannel1、CSL_EDMA3 CMD_CHANNEL_ENABLE、NULL);
    
    }触发通道 CSL_ENABLEN 

    4) 4)是的、我看到 一旦 SPI 寄存器中的 DMAREQEN 被置位、IPR 寄存器就会被置位、并且我通过以下命令将其清除:


    /*清除暂挂中断*/ CSL_edma3HwControl (hModule、CSL_EDMA3_CMD_INTRPEND_CLEAR、&regionIpr);


    我还提到事件寄存器的"ER"寄存器!


    感谢你能抽出时间。