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.

[参考译文] RTOS/TMDSEVM6678:使用 EDMA HWI 和 SYS/BIOS!

Guru**** 2558250 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/597454/rtos-tmdsevm6678-working-with-edma-hwi-and-sys-bios

器件型号:TMDSEVM6678

工具/软件:TI-RTOS

我需要将 EDMA HWI 添加到我正在工作的 SYS/BIOS 应用程序中、并且我在添加 ISR 时遇到了问题。  我有一个可以正常工作的 EDMA SPI 示例、我想将其用于我的应用、但我猜 CSL 和 BIOS 之间存在一些冲突。  我的应用程序只会进入 ISR 一次、即使是在第二次重新启动同一应用程序后、除非完成电路板的硬复位、否则它也不会通过 ISR、尽管 EDMA 似乎在工作并传输数据!

以下是应用程序:

void main()

{
int i = 0;
//初始化 EDMA 以进行 SPI 传输
Setup_EDMA_Init();
Setup_SPI_Init();

BIOS_start(); /*启用中断并启动 SYS/BIOS */
}

/*在 app.cfg 中定义的静态任务*/

void master_main()
{
int16k、i、CoreID、status;
Task_Handle 任务;
ERROR_Block EB;
Task_Params 参数;


ERROR_INIT (&EB);
CoreID = CSL_chipReadReg (CSL_CHIP_DNUM);
System_printf ("内核 ID %d\n"、CoreID);
if (CoreID ==0)
{
Hwi_Params_init (hwiParams);
hwiParams.EventID = 3;
hwiParams.arg = 1;
hwiParams.enableInt = false;
//不允许此中断嵌套自身
hwiParams.maskSetting = Hwi_MaskingOption_self;
myHwi = Hwi_create (8、EdmaISR、&hwiParams、&EB);
if (myHwi = NULL){
system_printf ("hwi_creat()失败!\n");
}
//为 SPI 传输设置 EDMA
Setup_EDMA_Init();

//配置 SPI 并启用 DMA 中断支持
Setup_SPI_Init();
Hwi_enableInterrupt (8);
//为 SPI 传输启用 EDMA
Setup_EDMA_Params_TX((UReg32)srcBuf);Setup_EDMA_Parfor_SPIC0*(EN_SP_SPIC_INT32)*
(_SPIC_SP_SDK_REG_DR_EN_EN)

~ SPIINT0 |= CSL_SPI_SPIINT0_DMAREQEN_ENABLE<<CSL_SPI_SPIINT0_DMAREQEN_SHIFT;     }



Task_Params_init (&params);
for (i=0;i "task_create()="" failed!\n");="" bios_exit(0);="" }="" void="" enable_edma_channels(void)="" enable="" channel="" csl_edma3hwchannelcontrol(hchannel0,csl_edma3_cmd_channel_enable,null);="" csl_edma3hwchannelcontrol(hchannel1,csl_edma3_cmd_channel_enable,null);="" setup_edma_init="" (void)="" edma="" module="" initialization="" csl_edma3init(null);="" open="" hmodule="CSL_edma3Open(&moduleObj,CSL_TPCC_1,NULL,&EdmaStat);" spi="" tx="" -="" 2="" for="" (spixevt)="" chparam.regionnum="CSL_EDMA3_REGION_GLOBAL;" chsetup.que="CSL_EDMA3_QUE_0;" chparam.chanum="CSL_EDMA3_CHA_2;" hchannel0="CSL_edma3ChannelOpen(&ChObj0," csl_tpcc_1,="" &chparam,="" &edmastat);="" chsetup.paramnum="chParam.chaNum;" csl_edma3_cha_2;="" csl_edma3hwchannelsetupparam(hchannel0,chsetup.paramnum);="" rx="" 3="" (spirevt)="" hchannel1="CSL_edma3ChannelOpen(&ChObj1," csl_edma3_cha_3;="" csl_edma3hwchannelsetupparam(hchannel1,chsetup.paramnum);="" enable_edma_channels();="" setup_spi_init="" *="" reset="" ((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_SHIFT|
CSL_SPI_SPIPC0_SCS0FUN1_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|
0x8<<CSL_SPI_SPIFMT_CHARLEN_SHIFT| 0x3f<
SPIDELAY=
0x0F< SPIDEF=
//<CSL_SPI_SPIDEF_CSDEF0_SHIFT;
CSL_SPI_SPIDEF_CSDEF0_HIGH<1;

((CSL_SpiRegsOvly) CSL_SPI_regs)->SPIINT0 =
CSL_SPI_SPIINT0_ENABLEHIGZ_ENABLE_ENABSPI_SPIINT_SPI_SHIFT_SPINT_SPICT_SPI_0_SPICT_SPINT_SPICT_SPICT_SPICT_SPINT_SPICT_SPI__SPICT_SPICT_SPT_SPICT_SPICT_SPT_SPICT_ENA|<CSII_SPIN_SP_SP_SP_SPIN_SP_SP_SPINT_SPINT_SPINT_SPICT_SPT_SPICT_SPICT_SPT_SPT_SPICT_SPICT_SPICT_SPICT_SPT_SPICT_SPT_SPICT_SPICT_SPICT_SP_ENA|<SP_SPT_SPT_SPT_SPICT_SPICT_SPICT_SPICT_SPT_SPICT_SPT_SPICT_SPICT_SPICT_SPICT_SP_SPICT_SPIC





SPIGCR1|=
CSL_SPI_SPIGCR1_ENABLE_ENABLE< 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 close_edma()
{
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 EdmaISR (UARg arg0)
{

static uint16 i;
regionIpr.region = CSL_EDMA3_region_global;
regionIpr.intr = 0;
regionIpr.intrh = 0;



System_printf ("输入的 EDMA ISR!\n");
//清除暂挂中断*/CSL_edma3HwControl
(hModule、CSL_EDMA3_CMD_INTRPEND_CLEAR、&regionIpr);


HW_WR_REG32 (EDMA_U_BASE_GLOBAL + EDMA_TReg_ICR_RN、0x000c);


//关闭 CSAM_REG32 (EDMA_SDK_REG0


)~*禁用 SPIC_SPIC_SPIC_SPICR_DR_R*(SPIC_SPIC_SPIC_SPIC_SPIC_SPIC_SPIC_RESTOR_SPIC_SPIC_SPIC_SPIC_SPIC_SPIC_RESTR_TRIPR);//*(*_SPIC_SPIC_SPIC_SPIC_ SPIGCR1 &=~Ω(CSL_SPI_SPIGCR1_ENABLE_ENABLE<<CSL_SPI_SPIGCR1_ENABLE_SHIFT); }



请告诉我、我是否需要在这里更改任何内容才能使其正常工作。

如果有任何帮助、我将不胜感激。

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

    RTOS 团队已收到通知。 他们的反馈将在此处发布。

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

    在主例程中,有一个不创建任务的 BIOS_start()。 因此我假设任务位于 void master_main()中。 我不明白为什么在 main()和 master_main()中调用 Setup_EDMA_Init()和 Setup_SPI_Init()。

    EDMA HWI 寄存器看起来正常。 为什么需要在 EDMA ISR 中关闭 EDMA 通道? 我们没有用于 C6678驱动程序的任何 SPI 数据示例(仅限写入器)。 因此、最好使用 EDMA、只需将数据从一个位置连续移动到另一个位置、就可以看到 ISR 被触发一次、或者始终将其与 EDMA 或 SPI 集成方案隔离。

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

    感谢您的回复 Eric、

    MASTER_MAIN 是静态创建的任务。 调用 Setups 两次是错误的、我删除了一个、但没有任何效果。

    我不需要在 ISR 中关闭 EDMA。  我只是想清除所有内容、看看第二次跑步会发生什么情况。  似乎没有任何效果。  SPI 和 EDMA 似乎在持续工作、我看到存储器中的数据正在更新。  唯一的问题是复位电路板后、它不会多次进入 ISR。  即使我重新启动同一个应用程序、它也不会通过 ISR。

    所以、你不认为我使用 CSL 库和 BIOS、HWI 有冲突吗?!

    谢谢。

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

    是否有人知道  我使用 CSL 库和 BIOS、HWI 是否有冲突?!