Couldn't make simpler example of DMA chaining. I can't get it working doesn't matter what I try.
"u32ChSw" will be assigned to 0x12345678, but "u32ChChain" stays in 0.
ChnPnd-register has value 0x00000200 indicating that CH9 should be run but it does not start it.
How this chaining should work, because it strongly looks like that whole feature is broken?
#include <sys_dma.h>
#define DMA_TEST_SW_CH DMA_CH8
#define DMA_TEST_CHAINED_CH DMA_CH9
uint32 u32DataPattern = 0x12345678;
uint32 u32ChSw = 0U;
uint32 u32ChChain = 0U;
void vDmaChainTest( void )
{
dmaEnable();
g_dmaCTRL tCTRLPKT;
/* Populate dma control packets structure for TX */
tCTRLPKT.CHCTRL = 0; /* channel control */
tCTRLPKT.ELCNT = 1; /* element count */
tCTRLPKT.ELDOFFSET = 0; /* element destination offset */
tCTRLPKT.ELSOFFSET = 0; /* element source offset */
tCTRLPKT.FRDOFFSET = 0; /* frame destination offset */
tCTRLPKT.FRSOFFSET = 0; /* frame source offset */
tCTRLPKT.PORTASGN = 4; /* port b */
tCTRLPKT.RDSIZE = ACCESS_32_BIT; /* read size */
tCTRLPKT.WRSIZE = ACCESS_32_BIT; /* write size */
tCTRLPKT.TTYPE = FRAME_TRANSFER; /* transfer type */
tCTRLPKT.ADDMODERD = ADDR_FIXED; /* address mode read */
tCTRLPKT.ADDMODEWR = ADDR_FIXED; /* address mode write */
tCTRLPKT.AUTOINIT = AUTOINIT_OFF; /* autoinit */
/* Following items needs to be set when transferring */
tCTRLPKT.DADD = (uint32)&u32ChChain; /* destination address*/
tCTRLPKT.SADD = (uint32)&u32DataPattern; /* source address */
tCTRLPKT.FRCNT = 1U; /* frame count */
dmaSetCtrlPacket(DMA_TEST_CHAINED_CH, tCTRLPKT);
tCTRLPKT.CHCTRL = DMA_TEST_CHAINED_CH+1U;
tCTRLPKT.DADD = (uint32)&u32ChSw; /* destination address*/
dmaSetCtrlPacket(DMA_TEST_SW_CH , tCTRLPKT);
dmaSetChEnable(DMA_TEST_SW_CH, DMA_SW); /* Enable DMA channel */
while( 1 ){};
}
void main(void)
{
vDmaChainTest();
}