各位专家,你们好
我使用的芯片是c6747,现在想实现从内部buffer传输数据到EMIFA上,想通过DMA的方式进行。EMIFA上面挂载的是sram,8bit,可读写,起始地址为0x6200 0000;请问应该怎么配置EDMA?
我看了数据手册,EMIFA只是个DMA slave,那像我这种情况,EDMA没有专门的内部ram对应的通道来发起EDMA,我应该怎么配置呢?
我尝试了GPIO触发中断trigger EDMA,src配置为内部ram,dest配置为EMIFA地址,但是触发后DMA传输不成功,不知道什么原因,烦请解答!
Jacob1:
你看你是块操作还是单独数操作,配置都是不一样的。而且这种DAM最好能有事件触发方式来进行DMA操作。
你尝试的GPIO触发中断应该是可以的,不成功,肯定是你看看你的相关sram配置、EMIFA的配置是否是正确的。还有DMA配置,不仅仅是地址的配置的,还有其他寄存器的配置的,这些都是需要看datasheet的。
rose zhong:
我想使用块操作。
下面是我的EDMA配置:
void gpio3_tx_edma(unsigned char *psrc,unsigned char *pdest,u32 len)
{
//clear previous bit CSL_EDMA3_CHA_UART0_RX to enable edma channel CSL_EDMA3_CHA_UART0_RX
edma3ccRegs->SECR = (u32)0x1 << CSL_EDMA3_CHA_GPIO3_INT;
edma3ccRegs->ECR |= (u32)0x1 << CSL_EDMA3_CHA_GPIO3_INT; //clear event CSL_EDMA3_CHA_UART0_RX
edma3ccRegs->ICR = 0xffffffff; //clear event CSL_EDMA3_CHA_UART0_RX
//clear previous events in channel CSL_EDMA3_CHA_UART0_RX
edma3ccRegs->EMCR = (u32)0x1 << CSL_EDMA3_CHA_GPIO3_INT;
*(volatile unsigned int *)0x01c08128 |= 0xffff;
// PaRAM parameter
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_GPIO3_INT].OPT = 0x0| (1<<20) |(EMIFA_TX_TCC<<12);
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_GPIO3_INT].SRC = (u32)psrc;//(Uint32)uart0Regs->RBR;
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_GPIO3_INT].A_B_CNT = 0x10001;
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_GPIO3_INT].DST = (u32)pdest;
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_GPIO3_INT].CCNT = len;
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_GPIO3_INT].LINK_BCNTRLD = 0x1ffff;
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_GPIO3_INT].SRC_DST_BIDX = 0x10001;
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_GPIO3_INT].SRC_DST_CIDX = 0x10001;
//*(volatile unsigned int *)0x01c08240 &= 0xfffffffc;
edma3ccRegs->DRA[1].DRAE |= (u32)0x1 << EMIFA_TX_TCC;
edma3ccRegs->IESR |= (u32)0x1 << EMIFA_TX_TCC; //设置IER的第TCCbit为1,使能传输完毕中断
edma3ccRegs->EESR = (u32)0x1 << CSL_EDMA3_CHA_GPIO3_INT;
edma3ccRegs->ESR = (u32)0x1 << CSL_EDMA3_CHA_GPIO3_INT; //手动触发DMA
}
我是这样调用的:
unsinged char src[20];
初始化src数组
gpio3_tx_edma(src,(char *)sram_start_add,len);
执行的结果是:
只搬运了第一个byte,然后没有其他的动作了,我看了EDMA3TC0里面的ERRSTAT寄存器,MMRAERR被置位了,但是我找不到原因。
烦请帮忙解答!多谢!