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.

TM4C129X EPI HB8 MODE and uDMA don't work 。

Other Parts Discussed in Thread: TM4C1290NCPDT, EK-TM4C1294XL

Hi , everyone .

I want to use TM4C129X EPI HB8 mode + uDMA to transfer data to peripheral .The mode of uDMA is basic mode.

Then I want to transfer 16 data to peripheral .But uDMA just transfer 4 data  and stop , which is equal to the number

of  specified by the ARBSIZE field in the DMA Channel Control Word (DMACHCTL) register .So , I 'm confused .

Can somebody give some help  ?

And here is the code 。

EPI code:

void EPI_Init(void)
{
	SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0);

	EPIDividerSet(EPI0_BASE, 28);
	EPIModeSet(EPI0_BASE, EPI_MODE_HB8);
	
	EPIConfigHB8Set(EPI0_BASE, EPI_HB8_MODE_ADDEMUX | EPI_HB8_WRWAIT_1 | EPI_HB8_USE_TXEMPTY, 0);
	EPIAddressMapSet(EPI0_BASE, EPI_ADDR_PER_BASE_C | EPI_ADDR_PER_SIZE_256B | EPI_ADDR_CODE_BASE_NONE );//经测试,映射基址只能为0xC000 0000 !!!
	
	EPIFIFOConfig(EPI0_BASE,(EPI_FIFO_CONFIG_TX_1_4 | EPI_FIFO_CONFIG_WTFULLERR));
	
//	EPIIntEnable(EPI0_BASE,EPI_INT_TXREQ);

	IntEnable(INT_EPI0);//开EPI中断

	while(HWREG(EPI0_BASE + EPI_O_STAT) &  EPI_STAT_INITSEQ)  //等待配置完成
   {
   }
}

uDMA code :

void DMA_Init()
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
    SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UDMA);

    IntEnable(INT_UDMAERR);
    uDMAEnable();
    IntEnable(INT_UDMA); 

    uDMAControlBaseSet(pui8ControlTable);

    uDMAChannelSelectSecondary(UDMA_DEF_TMR1B_SEC_EPI0TX);
    uDMAChannelAttributeDisable(UDMA_SEC_CHANNEL_EPI0TX, UDMA_ATTR_HIGH_PRIORITY | 
								UDMA_ATTR_REQMASK | UDMA_ATTR_USEBURST);
    uDMAChannelAttributeEnable(UDMA_SEC_CHANNEL_EPI0TX, UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIORITY);

    uDMAChannelControlSet(UDMA_SEC_CHANNEL_EPI0TX | UDMA_PRI_SELECT, UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_8| UDMA_ARB_4);
	uDMAIntRegister(UDMA_INT_ERR, uDMAErrorHandler);
}

void DMA_Write(uint8_t* buffer, uint16_t size, uint8_t offset_add)
{
    if (size > 0)
    {																								
		uDMAChannelTransferSet(UDMA_SEC_CHANNEL_EPI0TX | UDMA_PRI_SELECT, UDMA_MODE_BASIC, 
		(void*)(buffer),(void*)(uDMA_TO_EPI_BASE + offset_add),size);
		uDMAChannelEnable(UDMA_SEC_CHANNEL_EPI0TX);
    }
}