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