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.

UART使用EDMA 问题

专家您好!

我单独测试了UART的驱动和EDMA的驱动,都是OK的,
但是当我在UART中使用EDMA的时候,数据没有传输,这是什么情况?
其设置如下:
    opt |= CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_EN,      \
                                  CSL_EDMA3_TCCH_DIS,       \
                                  CSL_EDMA3_ITCINT_DIS,     \
                                  CSL_EDMA3_TCINT_EN,       \
                                  channelNum,               \
                                  CSL_EDMA3_TCC_NORMAL,     \
                                  CSL_EDMA3_FIFOWIDTH_NONE, \
                                  CSL_EDMA3_STATIC_DIS,     \
                                  CSL_EDMA3_SYNC_AB,        \
                                  CSL_EDMA3_ADDRMODE_INCR,  \
                                  CSL_EDMA3_ADDRMODE_INCR );
    myParamSetup.option = opt;
    myParamSetup.srcAddr = (Uint32)srcAddr;
    myParamSetup.dstAddr =  (Uint32)(&localUartRegs->THR);//使用EDMA

    tmp = gcd(totalSize, burstSize) / unitSize;
    myParamSetup.aCntbCnt = CSL_EDMA3_CNT_MAKE(unitSize, tmp);// ACNT, BCNT
    myParamSetup.cCnt = totalSize/unitSize/tmp;// CCNT
    
    myParamSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE(srcIndex, dstIndex);// SRC_BIDX, DST_BIDX
    myParamSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(srcIndex*tmp, dstIndex*tmp);// SRC_CIDX, DST_CIDX
    myParamSetup.linkBcntrld= CSL_EDMA3_LINKBCNTRLD_MAKE(CSL_EDMA3_LINK_NULL,0);

    CSL_edma3ParamSetup(hParam,&myParamSetup);
    
还请专家指点

  • 你是使用EDMA进行UART的数据发送,将目的地址改成一个normal memory试试如目的地址改成LL2试试,看是否EDMA配置问题。

    可以参考下UART的EDMA例子:http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/18931.aspx

  • Andy Yin 你好!

    谢谢你的回复,我试了下改目标地址为DDR上的一个地址,EDMA是可以工作的。

    单独测试UART和EDMA都是OK的,但放到一起就不工作了,在论坛上搜了一些帖子,说到的设置我也都那么设置了,还是不行,

    附件是我的测试程序

    http://www.deyisupport.com/cfs-file.ashx/__key/communityserver-discussions-components-files/53/5342.UART_5F00_EDMA.rar

  • 使用EDMA对UART进行数据搬运,确认如下配置:

    1. 配置FCR寄存器:使能DMA mode,使能FIFO mode,对于接收还需配置FIFO trigger level;

    2. UART有固定的EDMA CC及channel,具体请查阅相应的device data manual中EDMA章节,如对于C6678 的UART TX/RX channel分别对应EDMACC2 Channel 41/40;

    3. 配置EDMA 参数时,注意由于UART发送接收为FIFO,所以需要配置EDMA 的FIFO width及DAM和SAM为相应的constant address mode,如对于Tx,需要配置FIFO Width为128bit,DAM为constant address mode,SAM为INCR mode。

    参考一下之前给你发的链接例子。

     

  • Andy Yin 您好,

    对应您上面说的3条和连接给出的例程,我分别对应的设置代码是:

    1.FCR寄存器:使能DMA mode,使能FIFO mode

        uart_registers->FCR = 0x01;//FIFO enable
        uart_registers->FCR |= (1<<3);//DMAMOD1 enable
    2.我查手册得知在6657上EDMACC2的channel5 对应事件 UTXEVT(UART0 transmit event)

    3.EDMA的设置,opt参数如下:

        opt = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS,      \
                                  CSL_EDMA3_TCCH_DIS,       \
                                  CSL_EDMA3_ITCINT_DIS,     \
                                  CSL_EDMA3_TCINT_EN,      \
                                  channelNum,               \
                                  CSL_EDMA3_TCC_NORMAL,     \
                                  CSL_EDMA3_FIFOWIDTH_128BIT, \
                                  CSL_EDMA3_STATIC_DIS,     \
                                  CSL_EDMA3_SYNC_AB,        \
                                  CSL_EDMA3_ADDRMODE_CONST,  \
                                  CSL_EDMA3_ADDRMODE_INCR );

    第3条这里有一处疑问:为什么FIFO宽度设为128?其它的数值不行吗?谢谢

    修改后,还是跑不通,还有什么需要设置的吗?

    PS: 我用的是EVM6657开发板,串口是用的UART0(连接到板子上的串口转USB)。

    修改后的测试例程如下

    http://www.deyisupport.com/cfs-file.ashx/__key/communityserver-discussions-components-files/53/5635.UART_5F00_EDMA_5F00_test2.rar

  • Andy Yin 您好,

    我找到问题了:手册上说6657只能用TC0、TC2来访问UART的register,我之前用了3...

    修改相关设置代码为CSL_edma3HwChannelSetupQue(hChannel, CSL_EDMA3_QUE_2) ;

    搞定!

    谢谢您的热心帮助!

  • 我还有一处不明:

    为什么EDMA的OPT里设置SAM为INCR mode,FIFOwith为0,也能工作呢?代码如下

        opt = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS,      \
                                  CSL_EDMA3_TCCH_DIS,       \
                                  CSL_EDMA3_ITCINT_DIS,     \
                                  CSL_EDMA3_TCINT_EN,      \
                                  channelNum,               \
                                  CSL_EDMA3_TCC_NORMAL,     \
                                  CSL_EDMA3_FIFOWIDTH_NONE, \
                                  CSL_EDMA3_STATIC_DIS,     \
                                  CSL_EDMA3_SYNC_AB,        \
                                  CSL_EDMA3_ADDRMODE_INCR,  \
                                  CSL_EDMA3_ADDRMODE_INCR );

    谢谢^_^

    Jack

  • DAM及FIFO mode的配置需要匹配。如对于Tx来说,DAM配成INCR mode的话,注意IDX索引的配置应该为0,并且此时sync mode为A-sync。不过我觉得对于UART FIFO mode时,需要配置合理的FIFO width,并且对于TX配置DAM CONST MODE,这样好理解。

  • Andy Yin, 谢谢您的热心解答!

  • 对了,那FIFO with的大小是根据什么来设置的呢?

x 出现错误。请重试或与管理员联系。