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的驱动,都是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进行数据搬运,确认如下配置:
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)。
修改后的测试例程如下
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