非DMA方式能正常的发送数据,现在配置成了DMA方式,经反复调试后发现:
1 DMA方式下,我用的数组方式存放要发送的串口数据,开始数组是8位的字节型数据,启动发送后,串口发出的数据全部是零,而我配置的是从0--39的十进制数,后来修改为32位无符号整型的数组,然后就可以正常发送了。DMA配置那边,我配置的FIFO宽度全部是8位宽,但都不起作用,难道6678的DMA对数据源只支持32位结构的数据类型吗?还是是我配置有问题?
2 采用上面的方式,数组配置为32位无符号整型,数组元素为40,然后赋值为0---39,然后启动发送,发现最多只能发送0--F,即只能发送数组里面前16个32位整型数据,后面还有24个死活发不出来,DMA那边我同样是配置了的
3 串口的FIFO深度是14字节还是16字节?UART手册上写的是最大14字节,我单独测试UART,发现FIFO模式下一次可以最大发16字节,从而猜测是16字节才对。
上面2中最大只能发16个数,是和UART的FIFO深度是16有关吗?
相关代码如下
DMA配置:
EDMA3CC2Regs->DCHMAPn[0].bit.PAENTRY = 0;//使用PaRAM[0]
EDMA3CC2Regs->DMAQNUMn[5].bit.E1 = 0;//事件E41在队列Q0上,事件E41对应串口发送事件
//EDMA3CC2Regs->QCHMAPn[0].bit.TRWORD = 0;
//EDMA3CC2Regs->QCHMAPn[0].bit.PAENTRY = 0;
//EDMA3CC2Regs->DRAEH0.bit.E41 = 1;
//EDMA3CC2Regs->EERH.bit.E41 = 1;
//EDMA3CC2Regs->EESRH.bit.E41 = 1;
//EDMA3CC2TC0Regs->Read_Rate.bit.RDRATE = 1;//
//EDMA3CC2TC0Regs->SADDR = 10;
EDMA3CC2TC0Regs->SAOPT.bit.FWID = 0;//数据宽度是8位
EDMA3CC2TC0Regs->SAOPT.bit.SAM = 0;//每次传输完成,源地址增一
EDMA3CC2TC0Regs->SAOPT.bit.DAM = 1;//每次传输完成,目标地址不变
EDMA3CC2TC0Regs->DFOPT0.bit.FWID = 0;//数据宽度是8位
EDMA3CC2TC0Regs->DFOPT0.bit.SAM = 0;//
EDMA3CC2TC0Regs->DFOPT0.bit.DAM = 1;//
EDMA3CC2TC0Regs->DFOPT0.bit.PRI = 0;
EDMA3CC2_PaRAMRegs->PaRAM[0].SRC_DST_BIDX.all = 0;
EDMA3CC2_PaRAMRegs->PaRAM[0].LINK_BCNTRLD.all = 0;
EDMA3CC2_PaRAMRegs->PaRAM[0].SRC_DST_CIDX.all = 0;
EDMA3CC2_PaRAMRegs->PaRAM[0].OPT.bit.SAM = 0;//每次传输完成,源地址增一
EDMA3CC2_PaRAMRegs->PaRAM[0].OPT.bit.DAM = 1;//每次传输完成,目标地址不变
EDMA3CC2_PaRAMRegs->PaRAM[0].OPT.bit.SYNCDIM = 0;
EDMA3CC2_PaRAMRegs->PaRAM[0].OPT.bit.STATCI = 0;
EDMA3CC2_PaRAMRegs->PaRAM[0].OPT.bit.FWID = 2;
EDMA3CC2_PaRAMRegs->PaRAM[0].OPT.bit.TCCMODE = 0;
EDMA3CC2_PaRAMRegs->PaRAM[0].OPT.bit.PRIV = 0;
EDMA3CC2_PaRAMRegs->PaRAM[0].SRC = 0;
EDMA3CC2_PaRAMRegs->PaRAM[0].DST = 0x02540000;//目标地址是串口发送THR的物理地址
EDMA3CC2_PaRAMRegs->PaRAM[0].SRC_DST_BIDX.bit.SRCBIDX = 0;//
EDMA3CC2_PaRAMRegs->PaRAM[0].SRC_DST_BIDX.bit.DSTBIDX = 0;
EDMA3CC2_PaRAMRegs->PaRAM[0].SRC_DST_CIDX.bit.SRCCIDX = 0;
EDMA3CC2_PaRAMRegs->PaRAM[0].SRC_DST_CIDX.bit.DSTCIDX = 0;
EDMA3CC2_PaRAMRegs->PaRAM[0].A_B_CNT.bit.ACNT = 160; //ACNT = 4*40,每次发送40个32位数据
EDMA3CC2_PaRAMRegs->PaRAM[0].A_B_CNT.bit.BCNT = 1; //一行
EDMA3CC2_PaRAMRegs->PaRAM[0].C_CNT.bit.CCNT = 1; //一列
DMA启动发送:
Uint32 TxData[40];
//unsigned char TxData[40];
Uint32 i;
EDMA3CC2_PaRAMRegs->PaRAM[0].SRC = (Uint32)(&TxData[0]);
EDMA3CC2Regs->ESRH.bit.E41 = 1; //手动启动DMA
while(EDMA3CC2Regs->ERH.bit.E41 == 0);//等待标志位
EDMA3CC2Regs->ECRH.bit.E41 = 1; //标志位清零