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);
}
}