工具/软件: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 (¶ms);
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、¶mSetup);CSL_edma3paramSetup (paramHandle1_reload、¶mSetup)
;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、®ionIpr);
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); }
请告诉我、我是否需要在这里更改任何内容才能使其正常工作。
如果有任何帮助、我将不胜感激。