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.

请教edma3传输数据到EMIFA上的问题



各位专家,你们好

我使用的芯片是c6747,现在想实现从内部buffer传输数据到EMIFA上,想通过DMA的方式进行。EMIFA上面挂载的是sram,8bit,可读写,起始地址为0x6200 0000;请问应该怎么配置EDMA?

我看了数据手册,EMIFA只是个DMA slave,那像我这种情况,EDMA没有专门的内部ram对应的通道来发起EDMA,我应该怎么配置呢?

我尝试了GPIO触发中断trigger EDMA,src配置为内部ram,dest配置为EMIFA地址,但是触发后DMA传输不成功,不知道什么原因,烦请解答!

  • 你看你是块操作还是单独数操作,配置都是不一样的。而且这种DAM最好能有事件触发方式来进行DMA操作。

    你尝试的GPIO触发中断应该是可以的,不成功,肯定是你看看你的相关sram配置、EMIFA的配置是否是正确的。还有DMA配置,不仅仅是地址的配置的,还有其他寄存器的配置的,这些都是需要看datasheet的。

  • 我想使用块操作。

    下面是我的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被置位了,但是我找不到原因。

    烦请帮忙解答!多谢!